轉載於: https://www.cnblogs.com/Fengyinyong/p/14701996.html
參考文章
1.官網:https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes/
2.其他參考:https://blog.csdn.net/MrRight17/article/details/111931094
3.補丁下載:https://www.tenforums.com/windows-10-news/128745-cumulative-update-kb4489899-windows-10-v1809-build-17763-379-mar-12-a.html?
說明:K8S多數情況用於linux系統的集群,目前很少人實踐linux 和 windows 的混合集群。linux 和 windows 的K8S混合集群,是以linux 為Master節點,Windows 為 Node節點的。本示例linux 采用centos7.6,windows 采用 windows server 2019(均為虛擬機)
一、前提准備
1.熟悉linux 的基本使用,熟悉linux 下的K8S集群
2.CentOS7.6:安裝好docker並配置鏡像加速,K8S,並且授予K8S集群的master 角色(主機要求 cpu 內核2個以上,內存2G以上)。
3.Windows server 2019:cpu 內核2個以上,內存2G以上。並且安裝好docke,配置鏡像加速。
4.Windows server 2019 要安裝最新的補丁,即更新服務器。
內網環境下,無法在線更新時,至少要安裝 KB4489899 補丁(補丁下載見底部鏈接)。
5.時間同步:centos的master 主機和 windows server 2019的node 主機時間必須同步,可設置同步時間服務器(方法詳見底部連接)
二、Windows加入集群
(一) 、Master 配置 (在centos 上執行)
1、為 Flannel 准備 Kubernetes 的控制面
在我們的集群中,建議對 Kubernetes 的控制面進行少許准備處理。 建議在使用 Flannel 時為 iptables 鏈啟用橋接方式的 IPv4 流處理, 必須在所有 Linux 節點上執行如下命令:
sudo sysctl net.bridge.bridge-nf-call-iptables=1
2.下載flannel 和配置 linux Flannel
下載最新的 Flannel 清單文件:
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
注意:raw.githubusercontent.com 在國內大概率會被GFW 牆掉,可以手動執行命令 vi /etc/hosts
配置hosts :199.232.28.133 raw.githubusercontent.com
修改 Flannel 清單中的 net-conf.json
部分,將 VNI 設置為 4096,並將 Port 設置為 4789。 結果看起來像下面這樣:
net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan", "VNI": 4096, "Port": 4789 } }
說明: 在 Linux 節點上 VNI 必須設置為 4096,端口必須設置為 4789,這樣才能令其與 Windows 上的 Flannel 互操作。關於這些字段的詳細說明,請參見 VXLAN 文檔。
3. 應用Linux 的 flannel 配置並驗證
kubectl apply -f kube-flannel.yml
應用flannel 配置后,docker會從官網或配置的加速器中(最好是配置docker 加速器)下載flannel相關的鏡像且運行相關的pod。這個過程需要時間,幾分鍾后,執行 kubectl get pods -n kube-system
查看組件運行情況
NAMESPACE NAME READY STATUS RESTARTS AGE ... kube-system kube-flannel-ds-54954 1/1 Running 0 1m
4.添加 Windows Flannel 和 kube-proxy DaemonSet
現在你可以添加 Windows 兼容版本的 Flannel 和 kube-proxy。為了確保你能獲得兼容 版本的 kube-proxy,你需要替換鏡像中的標簽。 下面的例子中展示的是針對 Kubernetes v1.21.0 版本的用法, 不過你應該根據你自己的集群部署調整其中的版本號。
curl -L https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/kube-proxy.yml | sed 's/VERSION/v1.20.0/g' | kubectl apply -f - #也可以使用 wget 命令將kube-proxy.yaml命令先下載下來,再執行sed 和 kube apply 命令。
4.2.flannel:
kubectl apply -f https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/flannel-overlay.yml #建議先用 wget 命令將flannel-overlay,再執行kubectl apply
(二)、配置windows server 2019
前提是在windows server 2019 中已經安裝了docker 且配置了鏡像加速。且具有管理員權限。window下docker安裝參考: https://www.cnblogs.com/deny/p/14982678.html
1.安裝windows 的wins,kubelet,kubeadm。
可以根據自己的需要選擇對應的版本。
1.1 powershell 可執行文件PrepareNode.ps1下載:
curl.exe -LO https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/PrepareNode.ps1
1.2 執行命令,運行PrepareNode.ps1文件,下載並安裝 wins,kubelet,kubeadm‘’
.\PrepareNode.ps1 -KubernetesVersion v1.20.0
注意:執行上面第一條命令下載PrepareNode.ps1文件,可能會非常慢;即使下載文件后,根據文件下載wins、kubelet、kubeadm 可能會非常卡頓。由於上述情況的存在,大概率導致安裝不成功,建議采用手動安裝,步驟如下:
第一步,PrepareNode.ps1 文件下載:
打開瀏覽器,輸入網址 https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/PrepareNode.ps1下載文件,文件下載后,將DownloadFile 函數調用的代碼全部用“#”注釋
第二步、wins,kubelet,kubeadm 安裝文件下載:根據下載的PrepareNode.ps1文件中的DownloadFile 函數,下載安裝文件。
1.瀏覽器輸入 https://dl.k8s.io/v1.20.0/kubernetes-node-windows-amd64.tar.gz,解壓下載后的文件,從kubernetes\node\bin\ 中取出 kubeadm.exe 和 kubelet.exe(根據自己需要的版本下載)
2.瀏覽器輸入 https://k8stestinfrabinaries.blob.core.windows.net/nssm-mirror/nssm-2.24.zip,下載zip 文件,並重命名為 nssm.zip。
3.瀏覽器輸入 https://github.com/Microsoft/SDN/raw/master/Kubernetes/windows/hns.psm1 ,下載psm1文件
4.瀏覽器輸入 https://github.com/rancher/wins/releases/download/v0.0.4/wins.exe,下載wins.exe 文件
第三步、安裝windows下的kubernetes。
1.在c盤根目錄創建文件夾k,並將第一步,第二步的文件 hns.psm1、kubeadm.exe、kubelet.exe、nssm.zip、wins.exe和PrepareNode.ps1 全部放進文件夾k中。
2.在目錄k中,管理員權限 powershell 執行命令初始化windows 下的kubernetes:根據自己的版本來執行。
.\PrepareNode.ps1 -KubernetesVersion v1.20.0
如果執行失敗,刪除C盤根目錄下etc、run、var、opt和k(這幾個目錄有就刪掉), 重新復制nssm-2.24.zip改為nssm.zip, 檢查執行的錯誤並解決,再重新執行。如果是運行不成功,想要卸載,則參考后面的卸載步驟。
(三)、Windows 加入集群
1.master上執行命令查看加入集群的指令。
kubeadm token create --print-join-command
2.在windows 上,執行master上回顯的指令。指令類似於:
kubeadm join 172.16.22.101:6443 --token lzxi5w.qizoch3pqcbc3ozc --discovery-token-ca-cert-hash sha256:02d821acf1b0595943cb046a44356b68a85feb74e920b635713afc1fb732183f
這時候,windows docker 會下載幾個鏡像,會比較慢,需要等待一段時間(內網環境下,需要將鏡像手動導入)。
3.在master 上查看集群的狀態:
kubectl get nodes -o wide
如果windows node 處於not ready 狀況,可能是windows docker 還在下載相關的鏡像,可通過 kubectl -n kube-system get pods -l app=flannel
查看flannel pod的運行情況。也可以通過 kubectl describe pod podname -n namespaces
,根據具體的pod和名稱空間查看flannel的具體情況,以此來分析原因。
三、Windows K8S的卸載
windows 有時候不一定一次就能安裝成功,這時候又已經安裝了一些服務了,就需要K8S進行徹底的卸載。
1.1 master 節點刪除該node。kubectl delete node nodename
1.2 windows 脫離節點。kubeadm reset
1.3 在計算機服務中,找到kubelet 服務和 Rancher wins,將其停止。
1.4 管理員權限 cmd 刪除服務:
sc.exe delete kubelet
sc.exe delete rancher-wins
1.5 防火牆的入站規則中,刪除kubelet配置。
1.6 重啟docker服務
參考文章
1.官網:https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes/
2.其他參考:https://blog.csdn.net/MrRight17/article/details/111931094
3.補丁下載:https://www.tenforums.com/windows-10-news/128745-cumulative-update-kb4489899-windows-10-v1809-build-17763-379-mar-12-a.html?
四、踩的坑
參考文章: https://blog.csdn.net/Mr_rsq/article/details/116803503 Windows 節點加入K8S集群-踩坑大全
1)下載的問題kubelet、kubeadm、wins下載失敗
這幾個包會經常下載失敗,建議提前單獨下載好,放置到C:\k\
目錄下,修改PrepareNode.ps1
powershell腳本,把下載的幾條命令注釋掉
<# DownloadFile $kubeletBinPath https://dl.k8s.io/$KubernetesVersion/bin/windows/amd64/kubelet.exe DownloadFile "$global:KubernetesPath\kubeadm.exe" https://dl.k8s.io/$KubernetesVersion/bin/windows/amd64/kubeadm.exe DownloadFile "$global:KubernetesPath\wins.exe" https://github.com/rancher/wins/releases/download/v0.0.4/wins.exe #>
(2)New-NetFirewallRule : Cannot create a file when that file already exists.
這個錯是由於我們之前執行過PrepareNode.ps1 腳本成功之后,已經在防火牆入站規則中添加過規則條目了,出現這個報錯可以忽略,如果擔心的話就打開控制面板:Control Panel-->System and Security-->Windows Defender Firewall-->Advanced settings-->Inbound Rules 找到kubelet 規則,刪除即可。
(3)windows鏡像下載失敗,如sigwindowstools/kube-proxy:v1.17.5-nanoserver
這個鏡像在hub.docker.com
中是有的,下載之前需要自己在此網站注冊一個賬號,然后手動pull
# docker login 默認就會登錄hub.docker.com,后邊無需再跟此地址 C:\Users\Administrator> docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: rsqlh Password: Login Succeeded C:\Users\Administrator> docker pull sigwindowstools/kube-proxy:v1.17.5-nanoserver
4)flannel報錯:rpc error: code = Internal desc = could not create IP forward entry: The object already exists.
還有如下報錯:
Failed to find any valid interface to use: failed to get default interface: json: cannot unmarshal array into Go value of type struct { IfIndex int "json:\"ifIndex\"" } Couldn't fetch network config: client: etcd cluster is unavailable or misconfigured; error #0: dial tcp 127.0.0.1:2379: i/o timeout ; error #1: dial tcp 127.0.0.1:4001: i/o timeout
如上這些報錯都是由於flannel沒有識別到windows的網卡所導致的,有可能有些機器的網卡名稱特別古怪,形如vEthernet (NIC) 這些flannel在進行序列化的時候都會報錯,解析不了這個網卡名字,所以就需要我們手動在flannel-overlay.yml文件中指定具體網卡名稱。
# -iface 指定具體網卡名稱 # -iface-regex 后邊可以跟網卡通配符 wins cli process run --path /k/flannel/flanneld.exe --args "--kube-subnet-mgr --iface=NIC1 --kubeconfig-file /k/flannel/kubeconfig.yml" --envs "POD_NAME=$env:POD_NAME POD_NAMESPACE=$env:POD_NAMESPACE"
(5)重新初始化windows節點的時候kubelet跟rancher-wins服務如何刪除干凈
# 在PowerShell中執行sc delete並沒有報錯(沒有任何提示),但是實際上服務並沒有被刪除。 # 這是因為在 PowerShell 中,sc 是 cmdlet Set-Content 的別名,應該這樣使用(加上 .exe): sc delete kubelet sc delete rancher-wins # 正確命令如下 sc.exe delete kubelet sc.exe delete rancher-wins