news 2026/4/25 22:23:24

Kubernetes 集成 Windows Server 容器完全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kubernetes 集成 Windows Server 容器完全指南

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 网桥模式。

  • 必备配置

  1. 双 NIC 要求:一块用于节点通信,一块分配给 Hyper-V 虚拟交换机。

  2. 启用 RRAS 功能:允许节点间路由转发,截获目标为本地 Pod 的数据包。

  3. 创建 Internal 类型虚拟交换机:供 kube-proxy 绑定 Service IP。

  4. 手动配置路由表:添加跨节点 Pod 子网的路由规则。

3. 在 Kubernetes 上搭建 Windows Server 容器

3.1 主机配置
3.1.1 Windows 主机配置
  1. 安装 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
  1. 启用必要功能
# 启用 RRAS 路由功能 Install-WindowsFeature RemoteAccess -IncludeAllSubFeature # 创建 Internal 虚拟交换机(供 kube-proxy 使用) New-VMSwitch -Name KubeProxySwitch -SwitchType Internal
  1. 拉取基础镜像
docker pull apprenda/pause docker pull microsoft/iis # 测试用 Windows 容器镜像
3.1.2 Linux 主机配置
  1. 按 Kubernetes 版本要求配置 Linux 节点(如 Ubuntu 16.04+、CentOS 7+)。

  2. 安装 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.exeproxy.exe复制到 Windows 节点。

4.1 路由配置

假设集群 CIDR 为192.168.0.0/16,节点规划如下:

节点类型主机名可路由 IPPod CIDR
LinuxLin0110.0.0.10192.168.0.0/24
WindowsWin0110.0.0.11192.168.1.0/24
WindowsWin0210.0.0.12192.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.12
4.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 -p
4.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 -p

5. 启动集群

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 节点 IP

6. 在 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 wide

7. 已知限制

  1. 单容器 Pod 限制:Windows 无网络命名空间,一个 Pod 仅支持一个容器。

  2. Secrets 不可用:因 Windows 容器底层问题,Secrets 功能暂不支持(参考 Docker issue #28401)。

  3. ConfigMaps 未实现:Kubernetes 早期版本中 Windows 节点暂不支持 ConfigMaps。

  4. 协议限制:kube-proxy 依赖netsh portproxy,仅支持 TCP 协议,DNS 查询需客户端使用 TCP 重试。

  5. 网络插件限制:第三方网络插件(Flannel、Calico)暂不支持 Windows 节点,仅支持原生 L3 路由。

核心总结与注意事项

  1. 架构特点:Kubernetes 控制平面仍依赖 Linux,Windows 仅作为工作节点运行 kubelet、kube-proxy 和 Windows 容器。

  2. 网络关键:跨节点通信依赖手动配置路由,Windows 节点需启用 RRAS 和传输层网络模式。

  3. 调度要求:必须通过nodeSelector: {``beta.kubernetes.io/os:`` windows}指定 Windows 节点,否则会调度到 Linux 节点失败。

  4. 适用场景:适用于需运行 Windows 专属应用(如 .NET Framework 程序)的混合集群场景。

扩展建议

  1. 生产环境建议使用 Kubernetes 1.14+ 版本(Windows 容器支持已 GA),功能更稳定。

  2. 网络配置可替换为 Windows 版 Calico 或 Flannel,简化路由管理。

  3. 镜像建议优先使用 Microsoft 官方 Windows 容器镜像(如mcr.microsoft.com/windows/servercore)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 22:09:22

免费降AI实测:高效降低论文AI率方法+工具测评

临近毕业季,不少同学都在论文审核环节遇到了新难题,最近收到很多同学的求助: “我全程自己逐字打磨的内容,为什么AI检测结果有70%?” “之前随便找了个降AI工具,改完逻辑不通顺,专业术语还被改得…

作者头像 李华
网站建设 2026/4/25 22:06:10

CountDownLatch简单实战

前言:本篇文章系作者本人学习CountDownLatch处理工作问题之心得记录,仅供参考和学习一、什么问题?甲方有个需求,需要按照excel中某个字段count,n为值(n可能是小数,负数,正整数),生成…

作者头像 李华
网站建设 2026/4/25 22:04:42

OpenBB ODP:金融数据统一平台架构解析与实战指南

1. 从数据孤岛到统一平台:为什么我们需要OpenBB ODP干了这么多年量化分析和数据工程,最头疼的事情是什么?不是模型不够复杂,也不是算力不够强大,而是数据源太散了。你肯定也遇到过:想分析一只股票&#xff…

作者头像 李华