最近在嘗試建立windows的node in K8S
以下是我的筆記,有興趣的同學可以參考一下
大部分步驟都跟微軟的文件差不多
Kubernetes on Windows
只有一小部分有些差異,主要是因為我的測試環境是在GCP上,所以在GCP firewall的設定上記得要allow pods跟service的網段,還有在建instance時在網路部分要將IP forwarding的功能開起來,以及routing要加,這樣不同node之間的pod才有辦法正常溝通



- build up a master node (Linux)
由於目前windows server只能作為K8S的work node,所以我們還是需要建立一台Linux的server作為master node,在GCP我是使用CentOS 7的 image來作為master node,至於要怎麼建立master node我相信在網路上都有很多文件,以下是我的作法- update system and install docker
yum update -y yum install docker -y service docker start chkconfig docker on
- 由於只是測試環境,為了方便我會關閉firewall跟SELINUX
service firewalld stop chkconfig firewalld off setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
- create repo for K8S
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg exclude=kube* EOF
- install kubeadm
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes systemctl enable kubelet && systemctl start kubelet cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system sysctl -w net.ipv4.ip_forward=1
- initial master node
kubeadm init --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config sudo sysctl net.bridge.bridge-nf-call-iptables=1
- 安裝網路模組for K8S
根據微軟的文件如果要可以跟windows server相容建議是安裝flannel並使用host-gw模式 - 將特定DS(daemonset)設定成只能跑在Linux node
因為目前這些DS只能跑在Linux的container上,所以會把他們設成只跑在Linux server上kubectl patch ds/kube-proxy --patch "$(cat node-selector-patch.yml)" -n=kube-system kubectl patch ds/kube-flannel-ds-amd64 --patch "$(cat node-selector-patch.yml)" -n=kube-system
patch的yml檔可以從這下載node-selector-patch.yml
- 到這windows node的K8S master node就完成了,接下來就是確認kube-system pods是否都有正常運作,還有DS的設定有沒有生效跟DS是否設成rolling update
確認pods是否running 確認DS的是否有限制只跑在linux node 確認DS是否設成RollingUpdate
- update system and install docker
- join a windows work node
- 這邊我是使用GCP的Windows Server version 1803 Datacenter Core image作為work node,K8S的文件上是說windows 1709以上的版本都有支援,但要注意container的image只能使用跟OS同版本號的,不然會跑不起來,以下command都是使用Powerhsell操作
- install docker(這邊會需要重開機)
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force Install-Package -Name Docker -ProviderName DockerMsftProvider Restart-Computer -Force
- pull docker image
請下載與你OS相同的版本,這邊根據微軟的文件是要下載microsoft/nanoserver,但我後來發現k8s的docker file image不是用microsoft/nanoserver而是用mcr.microsoft.com/windows/nanoserver,所以我這邊就直接下載mcr.microsoft.com/windows/nanoserverdocker pull mcr.microsoft.com/windows/nanoserver:1803
- tag docker image
docker tag mcr.microsoft.com/windows/nanoserver:1803 mcr.microsoft.com/windows/nanoserver:latest
- 準備工作目錄for K8S
mkdir c:\k
- copy master node的驗證檔($HOME/.kube/config)到c:\k目錄,有了這個才可以連到master node(可以用SCP copy,現在powershell也有SCP可以用喔)
- 下載安裝7-zip
- 下載Kubernetes binaries for windwos,並用7-zip將它解壓縮到c:\k目錄,其中會包含kubectl, kubelet, and kube-proxy這些binaries,我是下載1.13.1版,可以從這下載kubernetes
- 設定環境變數for K8S
$env:Path += ";C:\k" [Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\k", [EnvironmentVariableTarget]::Machine) $env:KUBECONFIG="C:\k\config" [Environment]::SetEnvironmentVariable("KUBECONFIG", "C:\k\config", [EnvironmentVariableTarget]::User)
-
下載Flannel for window
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 wget https://github.com/Microsoft/SDN/archive/master.zip -o master.zip Expand-Archive master.zip -DestinationPath master mv master/SDN-master/Kubernetes/flannel/l2bridge/* C:/k/ rm -recurse -force master,master.zip
- join node
cd c:\k .\start.ps1 -ManagementIP <Windows Node IP> -ClusterCIDR <pod-network-cidr> -ServiceCIDR <service-cidr> -KubeDnsServiceIP <Kube-dns Service IP>
到這就成功join windows node到K8S了,請確定3支Powershell(kubelet, flanneld, kube-proxy)都有順利跑起來,有時Flannel 會跑不起來,需要手動再跑一次
[Environment]::SetEnvironmentVariable("NODE_NAME", "<Windows_Worker_Hostname>") .\flanneld.exe --kubeconfig-file=c:\k\config --iface=<Windows_Worker_Node_IP> --ip-masq=1 --kube-subnet-mgr=1
- 這邊我是使用GCP的Windows Server version 1803 Datacenter Core image作為work node,K8S的文件上是說windows 1709以上的版本都有支援,但要注意container的image只能使用跟OS同版本號的,不然會跑不起來,以下command都是使用Powerhsell操作
- deploy a win-webserver on windows node
wget https://raw.githubusercontent.com/Microsoft/SDN/master/Kubernetes/flannel/l2bridge/manifests/simpleweb.yml -O win-webserver.yaml kubectl apply -f win-webserver.yaml
記得要把yml檔裡container的版本改成與你的windows node OS相同 確認pods是否running 確認service port access from internet
e-markets