部署 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 1709+ 和 Docker Version 17.06+

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

下载

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

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

或者从 Kubernetes 源码编译

  1. go get -u k8s.io/kubernetes
  2. cd $GOPATH/src/k8s.io/kubernetes
  3. # Build the kubelet
  4. KUBE_BUILD_PLATFORMS=windows/amd64 make WHAT=cmd/kubelet
  5. # Build the kube-proxy
  6. KUBE_BUILD_PLATFORMS=windows/amd64 make WHAT=cmd/kube-proxy
  7. # You will find the output binaries under the folder _output/local/bin/windows/

网络插件

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

  1. wincni 等 L3 路由网络插件,路由配置在 TOR 交换机、路由器或者云服务中
  2. Host Gateway 网络插件,跟上面类似但将 IP 路由配置到每台主机上面
  3. Azure VNET CNI Plugin
  4. Open vSwitch (OVS) & Open Virtual Network (OVN) with Overlay
  5. Flannel v0.10.0+
  6. Calico v3.0.1+
  7. 未来还会支持 win-l2bridge (host-gateway) 和 win-overlay (vxlan)

L3 路由拓扑

Windows - 图1

wincni 网络插件配置示例

  1. {
  2. "cniVersion": "0.2.0",
  3. "name": "l2bridge",
  4. "type": "wincni.exe",
  5. "master": "Ethernet",
  6. "ipam": {
  7. "environment": "azure",
  8. "subnet": "10.10.187.64/26",
  9. "routes": [{
  10. "GW": "10.10.187.66"
  11. }]
  12. },
  13. "dns": {
  14. "Nameservers": [
  15. "11.0.0.10"
  16. ]
  17. },
  18. "AdditionalArgs": [{
  19. "Name": "EndpointPolicy",
  20. "Value": {
  21. "Type": "OutBoundNAT",
  22. "ExceptionList": [
  23. "11.0.0.0/8",
  24. "10.10.0.0/16",
  25. "10.127.132.128/25"
  26. ]
  27. }
  28. },
  29. {
  30. "Name": "EndpointPolicy",
  31. "Value": {
  32. "Type": "ROUTE",
  33. "DestinationPrefix": "11.0.0.0/8",
  34. "NeedEncap": true
  35. }
  36. },
  37. {
  38. "Name": "EndpointPolicy",
  39. "Value": {
  40. "Type": "ROUTE",
  41. "DestinationPrefix": "10.127.132.213/32",
  42. "NeedEncap": true
  43. }
  44. }
  45. ]
  46. }

OVS 网络拓扑

Windows - 图2

部署

kubeadm

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

  1. kubeadm.exe join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>

Azure

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

手动部署

  1. 在 Windows Server 中 安装 Docker

    1. Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
    2. Install-Package -Name Docker -ProviderName DockerMsftProvider
    3. Restart-Computer -Force
  2. 根据前面的下载部分下载或者编译 kubelet.exe 和 kube-proxy.exe

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

  4. 创建 HNS 网络,配置 CNI 网络插件

    1. wget https://github.com/Microsoft/SDN/archive/master.zip -o master.zip
    2. Expand-Archive master.zip -DestinationPath master
    3. mkdir C:/k/
    4. mv master/SDN-master/Kubernetes/windows/* C:/k/
    5. rm -recurse -force master,master.zip
  5. 使用 start-kubelet.ps1 启动 kubelet.exe,并使用 start-kubeproxy.ps1 启动 kube-proxy.exe

    ```sh

./start-kubelet.ps1 -ClusterCidr 192.168.0.0/16
./start-kubeproxy.ps1

  1. 6. 如果使用 Host-Gateway 网络插件,还需要使用 [AddRoutes.ps1](https://github.com/Microsoft/SDN/blob/master/Kubernetes/windows/AddRoutes.ps1) 添加静态路由
  2. 详细的操作步骤可以参考 [这里](https://github.com/MicrosoftDocs/Virtualization-Documentation/blob/live/virtualization/windowscontainers/kubernetes/getting-started-kubernetes-windows.md)。
  3. ## 运行 Windows 容器
  4. 使用 NodeSelector `beta.kubernetes.io/os: windows` 将容器调度到 Windows 节点上,比如
  5. ```yaml
  6. apiVersion: extensions/v1beta1
  7. kind: Deployment
  8. metadata:
  9. name: iis
  10. spec:
  11. replicas: 1
  12. template:
  13. metadata:
  14. labels:
  15. app: iis
  16. spec:
  17. nodeSelector:
  18. beta.kubernetes.io/os: windows
  19. containers:
  20. - name: iis
  21. image: microsoft/iis
  22. resources:
  23. limits:
  24. memory: "128Mi"
  25. cpu: 2
  26. ports:
  27. - containerPort: 80
  28. ---
  29. apiVersion: v1
  30. kind: Service
  31. metadata:
  32. labels:
  33. app: iis
  34. name: iis
  35. namespace: default
  36. spec:
  37. ports:
  38. - port: 80
  39. protocol: TCP
  40. targetPort: 80
  41. selector:
  42. app: iis
  43. type: NodePort

运行 DaemonSet

  1. apiVersion: extensions/v1beta1
  2. kind: DaemonSet
  3. metadata:
  4. name: my-DaemonSet
  5. labels:
  6. app: foo
  7. spec:
  8. template:
  9. metadata:
  10. labels:
  11. app: foo
  12. spec:
  13. containers:
  14. - name: foo
  15. image: microsoft/windowsservercore:1709
  16. nodeSelector:
  17. beta.kubernetes.io/os: windows

已知问题

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

  1. kind: ConfigMap
  2. apiVersion: v1
  3. metadata:
  4. name: example-config
  5. data:
  6. example.property.1: hello
  7. example.property.2: world
  8. ---
  9. apiVersion: v1
  10. kind: Pod
  11. metadata:
  12. name: my-configmap-pod
  13. spec:
  14. containers:
  15. - name: my-configmap-pod
  16. image: microsoft/windowsservercore:1709
  17. env:
  18. - name: EXAMPLE_PROPERTY_1
  19. valueFrom:
  20. configMapKeyRef:
  21. name: example-config
  22. key: example.property.1
  23. - name: EXAMPLE_PROPERTY_2
  24. valueFrom:
  25. configMapKeyRef:
  26. name: example-config
  27. key: example.property.2
  28. nodeSelector:
  29. beta.kubernetes.io/os: windows

Volume 支持情况

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

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: hostpath-pod
  5. spec:
  6. containers:
  7. - name: hostpath-nano
  8. image: microsoft/nanoserver:1709
  9. stdin: true
  10. tty: true
  11. volumeMounts:
  12. - name: blah
  13. mountPath: "C:\\etc\\foo"
  14. readOnly: true
  15. nodeSelector:
  16. beta.kubernetes.io/os: windows
  17. volumes:
  18. - name: blah
  19. hostPath:
  20. path: "C:\\AzureData"
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: empty-dir-pod
  5. spec:
  6. containers:
  7. - image: microsoft/nanoserver:1709
  8. name: empty-dir-nano
  9. stdin: true
  10. tty: true
  11. volumeMounts:
  12. - mountPath: /cache
  13. name: cache-volume
  14. - mountPath: C:/scratch
  15. name: scratch-volume
  16. volumes:
  17. - name: cache-volume
  18. emptyDir: {}
  19. - name: scratch-volume
  20. emptyDir: {}
  21. nodeSelector:
  22. beta.kubernetes.io/os: windows

镜像版本匹配问题

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

  1. microsoft/aspnet:4.7.1-windowsservercore-1709
  2. microsoft/windowsservercore:1709
  3. microsoft/iis:windowsservercore-1709

而在 Windows Server 2016 上需要使用带有 ltsc2016 标签的镜像,如 microsoft/windowsservercore:ltsc2016

v1.9 版本已知问题

  • 仅 Windows Server 1709 或更新的版本才支持在 Pod 内运行多个容器(仅支持 Process 隔离)
  • 暂不支持以 Volume 挂载的方式使用 Secrets 和 ConfigMaps
  • 暂不支持 StatefulSet
  • 暂不支持 Windows Server Container Pods 的自动扩展(Horizontal Pod Autoscaling)
  • 暂不支持 Hyper-V 隔离方式
  • Windows 容器的 OS 版本需要与 Host OS 版本匹配,否则容器无法启动
  • 使用 L3 或者 Host GW 网络时,无法从 Windows Node 中直接访问 Kubernetes Services(使用 OVS/OVN 时没有这个问题)
  • 在 VMWare Fusion 的 Window Server 中 kubelet.exe 可能会无法启动(已在 #57124 中修复)
  • 暂不支持 Weave 网络插件
  • Calico 网络插件仅支持 Policy-Only 模式

参考文档