Kubernetes 集成 Windows Server 容器完全指南
1. 前提条件
Kubernetes v1.5+ 引入 Windows Server 容器支持(Alpha 特性),核心依赖如下:
1.1 环境要求
Kubernetes 控制平面:必须运行在 Linux 节点(v1.5+ 版本),包含 API Server、调度器、控制器管理器等核心组件。
Windows 节点:
操作系统:Windows Server 2016(RTM 版本 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/pause- DNS 支持: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-proxy:
4.1.1 编译依赖
Git、Go 1.7.1+、Make(Linux/MacOS 环境编译)。
依赖详情参考 Kubernetes 开发指南。
4.1.2 编译命令(Linux/MacOS 环境)
# 克隆 Kubernetes 源码 cd $GOPATH/src/k8s.io/ git clone https://github.com/kubernetes/kubernetes.git cd kubernetes # 编译 kubelet(Windows 版本) KUBE_BUILD_PLATFORMS=windows/amd64 make WHAT=cmd/kubelet # 编译 kube-proxy(Windows 版本) KUBE_BUILD_PLATFORMS=windows/amd64 make WHAT=cmd/kube-proxy编译完成后,将kubelet.exe和proxy.exe复制到 Windows 节点。
4.1 路由配置
假设集群 CIDR 为192.168.0.0/16,节点规划如下:
| 节点类型 | 主机名 | 可路由 IP | Pod CIDR |
|---|---|---|---|
| Linux | Lin01 | 10.0.0.10 | 192.168.0.0/24 |
| Windows | Win01 | 10.0.0.11 | 192.168.1.0/24 |
| Windows | Win02 | 10.0.0.12 | 192.168.2.0/24 |
4.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. 配置虚拟网桥 IP(vEthernet (HNSTransparent) 为自动创建的网桥名称) netsh interface ipv4 set address "vEthernet (HNSTransparent)" addr=192.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)" addr=192.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-override=10.0.0.11 ` # Windows 节点 IP 或主机名 --pod-infra-container-image="apprenda/pause" ` # 基础镜像 --resolv-conf="" ` --api-servers=https://10.0.0.10:6443 # Linux 控制平面 API Server 地址5.2.2 启动 kube-proxy
在 Windows 节点的 PowerShell(管理员权限)中执行:
.proxy.exe ` --v=3 ` --proxy-mode=userspace ` --hostname-override=10.0.0.11 ` # 与 kubelet 一致 --master=https://10.0.0.10:6443 ` # 控制平面地址 --bind-address=10.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 控制平面仍依赖 Linux,Windows 仅作为工作节点运行 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)。