Kubernetes節點加入,經驗總結
- kubeadm安裝Kubernetes,實踐記錄。
Kubernetes主控節點建立後(方法參見上面的鏈接),就可以隨時添加更多的工作節點進去構建更大的集羣(minikube設計爲單機開發使用,不能添加工作節點),容器實例可以在所有符合條件的node上調度運行,這是Kubernetes最爲強大的功能。
- 因爲容器工作負載可以在任何節點上運行,所以存儲和計算資源都應該設計爲通過網絡接口訪問,資源、服務和計算任務都是浮動的。
- kubeadm join 命令可以添加工作節點。最簡單的方式是通過Token,主控節點上使用kubeadm token命令可以管理集羣所產生的Token。
1、節點命名規則
K8S本身就是採用一套名稱規則來標記和篩選容器的系統。節點的命名有一個統一規劃,後面管理起來會更方便。局域網中直接會根據機器名列出節點,因此不要使用同名,最好加上數字編號,前面用英文字母順序,便於排序。
2、節點加入命令
kubeadm init 結束時會自動產生節點加入的命令,最好記下來。
如果忘了,可以使用kubeadm token create --print-join-command 方法重新生成鏈接Token並打印輸出加入命令。網上搜了好久,終於發現這個方法,不過要1.9以後的版本才支持的,如果不支持這個參數,整個集羣的Kubeadm版本都需要升級到新版本。
3、確保Kubelet已啓動
每一個node的kubelet都必須進去設置cgroup-drive和swap關閉的啓動選項,跟主控節點一樣(參見上民面安裝Kubernetes的方法),然後需要重新啓動,通過systemctl daemon-reload/systemctl restart kubelet來進行。
如果node上顯示添加成功,但Master上顯示不出來,在node機上使用systemctl status kubelet查看下服務的狀態,檢查裏面的各項狀態,單獨處理。
4、確保網絡flannel鏡像可用
quay.io的flannel網絡鏡像下載很慢,最好單獨下載。如下:
docker pull quay.io/coreos/flannel:v0.10.1-amd64
如果用其它網絡驅動,也是一樣,需要確保可用。
5、網絡flannel依賴DNS鏡像
目前flannel網絡0.10.1的DNS需要依賴kube-dns1.14.8版本,不是Kubernetes1.10.2版本安裝時的1.14.10,需要單獨把容器鏡像下載下來。否則,速度太慢,還以爲死機了。如下:
docker pull k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.8
6、Docker代理與Registry指向
Docker的代理也是需要每個node獨立設的,因爲各個節點都是各自向Docker Registry請求下載鏡像,因此一定不要在K8S中使用本地編譯的Docker鏡像,要推送到服務器上,因爲其他節點還是需要從Registry服務器去下載的,建立本地集羣的統一Registry 服務就很重要了,可以使用Harbor 來搭建。
- 配置Harbor私有Docker鏡像服務使用HTTPS,https://my.oschina.net/u/2306127/blog/785281
- Harbor開源容器鏡像服務系統,參考 https://github.com/vmware/harbor
7、docker版本必須一致
docker版本必須一致,否則總是NotReady,然後報CNI錯誤,Network NotReady等。
強制安裝爲18.03.1後變爲Ready。如下方法:
sudo apt install docker-ce=18.03.1~ce-0~ubuntu
可以使用 apt-cache madison docker-ce 查看可用的docker版本。
目前最新的18.05有一些問題,而Nvidia-Docker2只支持到18.03.1,自己編譯的18.05的lib-container-runtime運行時出現CNI錯誤。
8、安裝Nvidia-Docker2和k8s GPU插件
如果需要做機器學習,工作節點上也需要安裝所有的Nvidia驅動、cuCuda、cuTensor、Nvidia-Docker2和Nvidia的K8S插件,不管是不是安裝有Nvidia的顯卡。
安裝方法參考:
- Ubuntu快速玩轉機器學習,https://my.oschina.net/u/2306127/blog/1807648
安裝Kubernetes上的GPU支持軟件:
- NVidia支持的Docker引擎(GPU支持),https://github.com/NVIDIA/nvidia-docker
- NVIDIA的Kubernetes 插件,https://my.oschina.net/u/2306127/blog/1808304
- Kunernetes調度GPU,https://kubernetes.io/docs/tasks/manage-gpus/scheduling-gpus/
9、顯卡最好一樣
GPU節點的顯卡型號最好都一樣,否則調度時可能會出問題,輕者出現異常,重者直接導致節點掛掉。現在Kubernetes無法對GPU內部資源進行識別和調度,基本管理單元是GPU塊數,而且是獨佔。一旦請求GPU的容器獲得資源,無論是否在使用,其它的容器將不能同時請求該GPU,除非原來的容器退出。
10、診斷節點狀態
如果節點在kubectl get node可以看見但狀態一直NotReady,可以使用kubectl describe node my-node的方式,查看詳細的node運行情況。
本文轉移開源中國-Kubernetes加入新節點,經驗總結