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 版本

參考文檔

Last updated