Windows

Kubernetes 从 v1.5 开始支持 alpha 版的 Windows 节点,并从 v1.9 开始升级为 beta 版。Windows 容器的主要特性包括

  • Windows 容器支持 Pod(isolation=process)

  • 基于 Virtual Filtering Platform (VFP) Hyper-v Switch Extension 的内核负载均衡

  • 基于 Container Runtime Interface (CRI) 管理 Windows 容器

  • 支持 kubeadm 命令将 Windows 节点加入到已有集群中

  • 推荐使用 Windows Server Version 1803+ 和 Docker Version 17.06+

注意:

  1. 控制平面的服务依然运行在 Linux 服务器中,而 Windows 节点上只运行 Kubelet、Kube-proxy、Docker 以及网络插件等服务。

  2. 推荐使用 Windows Server 1803(修复了 Windows 容器软链接的问题,从而 ServiceAccount 和 ConfigMap 可以正常使用)

下载

可以从 https://github.com/kubernetes/kubernetes/releases 下载已发布的用于 Windows 服务器的二进制文件,如

wget https://dl.k8s.io/v1.15.0/kubernetes-node-windows-amd64.tar.gz

或者从 Kubernetes 源码编译

go get -u k8s.io/kubernetes
cd $GOPATH/src/k8s.io/kubernetes

# Build the kubelet
KUBE_BUILD_PLATFORMS=windows/amd64 make WHAT=cmd/kubelet

# Build the kube-proxy
KUBE_BUILD_PLATFORMS=windows/amd64 make WHAT=cmd/kube-proxy

# You will find the output binaries under the folder _output/local/bin/windows/

网络插件

Windows Server 中支持以下几种网络插件(注意 Windows 节点上的网络插件要与 Linux 节点相同)

  1. wincni 等 L3 路由网络插件,路由配置在 TOR 交换机、路由器或者云服务中

  2. Flannel v0.10.0+

  3. Calico v3.0.1+

更多网络拓扑模式请参考 Windows container network drivers

L3 路由拓扑

wincni 网络插件配置示例

OVS 网络拓扑

部署

kubeadm

如果 Master 是通过 kubeadm 来部署的,那 Windows 节点也可以使用 kubeadm 来部署:

Azure

在 Azure 上面推荐使用 acs-engine 自动部署 Master 和 Windows 节点。

首先创建一个包含 Windows 的 Kubernetes 集群配置文件 windows.json

然后使用 acs-engine 部署:

手动部署

(1) 在 Windows Server 中 安装 Docker

(2) 根据前面的下载部分下载 kubelet.exe 和 kube-proxy.exe

(3) 从 Master 节点上面拷贝 Node spec file (kube config)

(4) 配置 CNI 网络插件和基础镜像

(5) 使用 start-kubelet.ps1 启动 kubelet.exe,并使用 start-kubeproxy.ps1 启动 kube-proxy.exe

(6) 如果使用 Host-Gateway 网络插件,还需要使用 AddRoutes.ps1 添加静态路由

详细的操作步骤可以参考 这里

运行 Windows 容器

使用 NodeSelector beta.kubernetes.io/os: windows 将容器调度到 Windows 节点上,比如

运行 DaemonSet

已知问题

Secrets 和 ConfigMaps 只能以环境变量的方式使用

1709和更早版本有这个问题,升级到 1803 即可解决。

Volume 支持情况

Windows 容器暂时只支持 local、emptyDir、hostPath、AzureDisk、AzureFile 以及 flexvolume。注意 Volume 的路径格式需要为 mountPath: "C:\\etc\\foo" 或者 mountPath: "C:/etc/foo"

镜像版本匹配问题

Windows Server version 1709 中必须使用带有 1709 标签的镜像,如

  • microsoft/aspnet:4.7.1-windowsservercore-1709

  • microsoft/windowsservercore:1709

  • microsoft/iis:windowsservercore-1709

同样,在 Windows Server version 1803 中必须使用带有 1803 标签的镜像。而在 Windows Server 2016 上需要使用带有 ltsc2016 标签的镜像,如 microsoft/windowsservercore:ltsc2016

设置 CPU 和内存

从 v1.10 开始,Kubernetes 支持给 Windows 容器设置 CPU 和内存:

Hyper-V 容器

从 v1.10 开始支持 Hyper-V 隔离的容器(Alpha)。 在使用之前,需要配置 kubelet 开启 HyperVContainer 特性开关。然后使用 Annotation experimental.windows.kubernetes.io/isolation-type=hyperv 来指定容器使用 Hyper-V 隔离:

其他已知问题

  • 仅 Windows Server 1709 或更新的版本才支持在 Pod 内运行多个容器(仅支持 Process 隔离)

  • 暂不支持 StatefulSet

  • 暂不支持 Windows Server Container Pods 的自动扩展(Horizontal Pod Autoscaling)

  • Windows 容器的 OS 版本需要与 Host OS 版本匹配,否则容器无法启动

  • 使用 L3 或者 Host GW 网络时,无法从 Windows Node 中直接访问 Kubernetes Services(使用 OVS/OVN 时没有这个问题)

  • 在 VMWare Fusion 的 Window Server 中 kubelet.exe 可能会无法启动(已在 #57124 中修复)

  • 暂不支持 Weave 网络插件

  • Calico 网络插件仅支持 Policy-Only 模式

  • 对于需要使用 : 作为环境变量的 .NET 容器,可以将环境变量中的 : 替换为 __(参考 这里

附录:Docker EE 安装方法

安装 Docker EE 稳定版本

安装 Docker EE 预览版本

升级 Docker EE 版本

参考文档

最后更新于