Kubernetes在1.20版本之後不再將Docker作爲容器運行時使用。不要驚慌😱Docker容器仍然支持,但是dockershim/Docker Kubernetes和containerd之間的層已經棄用,將從1.22+版本中移除。因此,如果你正在運行docker,你需要更改爲支持的容器運行時接口(CRI)。containerd是一個很好的選擇,如果您正在運行Docker,它已經在Kubernetes節點上運行了。
一個明顯的優勢是開銷更少,沒有Docker-shim和Docker翻譯層,如圖所示。
如何遷移
首先,我們檢查當前運行的容器是什麼。我們使用kubectl get node -o
來實現這一點。正如我們所看到的,我們將Docker作爲運行時運行。
現在,我們檢查containerd cli /usr/bin/ctr是否存在,名稱空間moby是否存在,命令:/usr/bin/ctr namespace list
moby是docker的命名空間。我們可以在這個命名空間中列出正在運行的容器
如果一切正常,我們可以更改cri,每次更改一個節點,首先是工作節點,然後是控制節點。如果只有一個控制節點,您將失去對集羣的訪問權,這將是暫時的,它應該自己恢復。
驅逐節點
我們需要封鎖並釋放節點,以便重新調度工作負載。
停止服務
刪除docker(可選)
我們刪除了Docker,這是不必要的,但會讓事情更清楚,以後更不容易出錯,我們會節省一些磁盤空間…
Containerd配置
禁用/etc/containerd/config中的disabled_plugins行。這樣cri接口就加載了
如果containerd沒有配置文件,您可以生成一個新的默認文件。
重啓containerd
systemctl restart containerd
更改runtime
編輯/var/lib/kubelet/kubeadm-flags.env文件;並將containerd運行時添加到標記。--container-runtime=remote
和 --container-runtimeendpoint=unix:///run/containerd/containerd.sock
所以kubeadm-flags文件看起來應該是這樣的。
啓動kubelet
在更改運行時之後,我們可以啓動kubelet服務
systemctl start kubelet
覈對
現在,當我們運行kubectl時,kubectl get nodes -o wide
,我們看到containerd是我們剛剛更改的節點的運行時containerd。
我們剛改變的節點仍然被封鎖。所以我們現在可以解除封鎖了。
如果現在檢查節點上的名稱空間,會看到一個新的名稱空間k8s.io。moby名稱空間現在是空的,在這個名稱空間中沒有運行容器,所有容器現在都在運行k8.io命名空間。
我們已經成功地更改了cri,現在我們可以移動到下一個節點並重復所有操作。
推薦
從Ice到Kubernetes容器技術,微服務架構經歷了什麼?
原創不易,隨手關注或者”在看“,誠摯感謝!
本文分享自微信公衆號 - 雲原生技術愛好者社區(programmer_java)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。