Kubernetes 集成 Windows Server 容器完全指南1. 前提条件Kubernetes v1.5 引入 Windows Server 容器支持Alpha 特性核心依赖如下1.1 环境要求Kubernetes 控制平面必须运行在 Linux 节点v1.5 版本包含 API Server、调度器、控制器管理器等核心组件。Windows 节点操作系统Windows Server 2016RTM 版本 10.0.14393。Docker 版本v1.12.2-cs2-ws-beta需支持 Windows 容器模式。必备组件启用 RRAS路由和远程访问服务、安装 Hyper-V 角色用于容器网络隔离。Linux 节点需安装 CNI 网络插件如 Kubenet支持 L3 路由功能。1.2 依赖准备下载apprenda/pause镜像Windows 容器的 Pod 基础镜像docker pull apprenda/pauseDNS 支持Windows 容器 DNS 功能需 Docker 稳定版以上可从 Docker Master 分支构建或下载二进制文件参考 Docker Master。2. 网络配置Kubernetes 中 Windows 容器网络基于 L3 路由实现不依赖第三方网络插件如 Flannel、Calico核心差异如下2.1 Linux 节点网络基于网桥接口创建本地私有网络Pod 分配/24子网集群 CIDR 为/16。需手动添加跨节点路由指向 Windows 节点的可路由 IP实现 Pod 跨节点通信。2.2 Windows 节点网络网络模式使用 Windows 原生的「传输层网络Transparent」和 L2 网桥模式。必备配置双 NIC 要求一块用于节点通信一块分配给 Hyper-V 虚拟交换机。启用 RRAS 功能允许节点间路由转发截获目标为本地 Pod 的数据包。创建 Internal 类型虚拟交换机供 kube-proxy 绑定 Service IP。手动配置路由表添加跨节点 Pod 子网的路由规则。3. 在 Kubernetes 上搭建 Windows Server 容器3.1 主机配置3.1.1 Windows 主机配置安装 Docker 环境参考 Windows Server 容器快速启动通过 PowerShell 安装 Docker CE 或 Mirantis Container Runtime# 安装 Docker CE示例脚本 Invoke-WebRequest -UseBasicParsing https://raw.githubusercontent.com/microsoft/Windows-Containers/Main/helpful_tools/Install-DockerCE/install-docker-ce.ps1 -o install-docker-ce.ps1 .install-docker-ce.ps1启用必要功能# 启用 RRAS 路由功能 Install-WindowsFeature RemoteAccess -IncludeAllSubFeature # 创建 Internal 虚拟交换机供 kube-proxy 使用 New-VMSwitch -Name KubeProxySwitch -SwitchType Internal拉取基础镜像docker pull apprenda/pause docker pull microsoft/iis # 测试用 Windows 容器镜像3.1.2 Linux 主机配置按 Kubernetes 版本要求配置 Linux 节点如 Ubuntu 16.04、CentOS 7。安装 CNI 网络插件如 Kubenet确保支持网桥模式和路由转发。4. 组件配置4.1 编译 Kubernetes 组件Windows 版本需构建适用于 Windows/amd64 架构的 kubelet 和 kube-proxy4.1.1 编译依赖Git、Go 1.7.1、MakeLinux/MacOS 环境编译。依赖详情参考 Kubernetes 开发指南。4.1.2 编译命令Linux/MacOS 环境# 克隆 Kubernetes 源码 cd $GOPATH/src/k8s.io/ git clone https://github.com/kubernetes/kubernetes.git cd kubernetes # 编译 kubeletWindows 版本 KUBE_BUILD_PLATFORMSwindows/amd64 make WHATcmd/kubelet # 编译 kube-proxyWindows 版本 KUBE_BUILD_PLATFORMSwindows/amd64 make WHATcmd/kube-proxy编译完成后将kubelet.exe和proxy.exe复制到 Windows 节点。4.1 路由配置假设集群 CIDR 为192.168.0.0/16节点规划如下节点类型主机名可路由 IPPod CIDRLinuxLin0110.0.0.10192.168.0.0/24WindowsWin0110.0.0.11192.168.1.0/24WindowsWin0210.0.0.12192.168.2.0/244.1.1 Linux 节点Lin01路由配置# 添加指向 Windows 节点 Pod 子网的路由 ip route add 192.168.1.0/24 via 10.0.0.11 ip route add 192.168.2.0/24 via 10.0.0.124.1.2 Windows 节点Win01路由配置# 1. 创建传输层容器网络 docker network create -d transparent --gateway 192.168.1.1 --subnet 192.168.1.0/24 kube-transparent-net # 2. 配置虚拟网桥 IPvEthernet (HNSTransparent) 为自动创建的网桥名称 netsh interface ipv4 set address vEthernet (HNSTransparent) addr192.168.1.1 # 3. 添加跨节点路由永久生效 $interfaceId (Get-NetAdapter -Name Ethernet).InterfaceIndex # 替换为节点通信 NIC 名称 route add 192.168.0.0 mask 255.255.255.0 192.168.0.1 if $interfaceId -p route add 192.168.2.0 mask 255.255.255.0 192.168.2.1 if $interfaceId -p4.1.3 Windows 节点Win02路由配置# 1. 创建传输层容器网络 docker network create -d transparent --gateway 192.168.2.1 --subnet 192.168.2.0/24 kube-transparent-net # 2. 配置虚拟网桥 IP netsh interface ipv4 set address vEthernet (HNSTransparent) addr192.168.2.1 # 3. 添加跨节点路由 $interfaceId (Get-NetAdapter -Name Ethernet).InterfaceIndex route add 192.168.0.0 mask 255.255.255.0 192.168.0.1 if $interfaceId -p route add 192.168.1.0 mask 255.255.255.0 192.168.1.1 if $interfaceId -p5. 启动集群5.1 启动基于 Linux 的 Kubernetes 控制面板使用常规方式启动 Linux 控制平面如 kubeadm、minikube确保集群 CIDR 与路由配置一致示例192.168.0.0/16。5.2 启动 Windows 节点组件5.2.1 启动 kubelet在 Windows 节点的 PowerShell管理员权限中执行# 设置环境变量指定容器网络名称 $env:CONTAINER_NETWORK kube-transparent-net # 启动 kubelet .kubelet.exe --hostname-override10.0.0.11 # Windows 节点 IP 或主机名 --pod-infra-container-imageapprenda/pause # 基础镜像 --resolv-conf --api-servershttps://10.0.0.10:6443 # Linux 控制平面 API Server 地址5.2.2 启动 kube-proxy在 Windows 节点的 PowerShell管理员权限中执行.proxy.exe --v3 --proxy-modeuserspace --hostname-override10.0.0.11 # 与 kubelet 一致 --masterhttps://10.0.0.10:6443 # 控制平面地址 --bind-address10.0.0.11 # Windows 节点 IP6. 在 Windows 上调度 Pod由于集群包含 Linux 和 Windows 节点需通过nodeSelector显式指定调度目标6.1 示例部署 IIS 容器Windows 专属# iis-pod.yaml apiVersion: v1 kind: Pod metadata: name: iis labels: name: iis spec: containers: - name: iis image: microsoft/iis # Windows 容器镜像 ports: - containerPort: 80 nodeSelector: beta.kubernetes.io/os: windows # 强制调度到 Windows 节点6.2 部署命令kubectl apply -f iis-pod.yaml # 验证 Pod 状态应显示 Running 且节点为 Windows 节点 kubectl get pods -o wide7. 已知限制单容器 Pod 限制Windows 无网络命名空间一个 Pod 仅支持一个容器。Secrets 不可用因 Windows 容器底层问题Secrets 功能暂不支持参考 Docker issue #28401。ConfigMaps 未实现Kubernetes 早期版本中 Windows 节点暂不支持 ConfigMaps。协议限制kube-proxy 依赖netsh portproxy仅支持 TCP 协议DNS 查询需客户端使用 TCP 重试。网络插件限制第三方网络插件Flannel、Calico暂不支持 Windows 节点仅支持原生 L3 路由。核心总结与注意事项架构特点Kubernetes 控制平面仍依赖 LinuxWindows 仅作为工作节点运行 kubelet、kube-proxy 和 Windows 容器。网络关键跨节点通信依赖手动配置路由Windows 节点需启用 RRAS 和传输层网络模式。调度要求必须通过nodeSelector: {beta.kubernetes.io/os: windows}指定 Windows 节点否则会调度到 Linux 节点失败。适用场景适用于需运行 Windows 专属应用如 .NET Framework 程序的混合集群场景。扩展建议生产环境建议使用 Kubernetes 1.14 版本Windows 容器支持已 GA功能更稳定。网络配置可替换为 Windows 版 Calico 或 Flannel简化路由管理。镜像建议优先使用 Microsoft 官方 Windows 容器镜像如mcr.microsoft.com/windows/servercore。