Kubernetes 從 v1.20 開始棄用 Docker,並推薦用戶切換到基於容器運行時接口(CRI)的容器引擎,如 containerd、cri-o 等。若是你使用了雲服務商提供的託管 Kubernetes 服務,那你不用擔憂,像 GKE、AKS 等雲服務商都已經在新版集羣中把默認的運行時切換到 containerd 。node
那對於那些自管的集羣,又如何把容器運行時從 Docker 切換到 Containerd 呢?git
首先,標記節點爲維護模式,並驅逐其上正在運行的 Pod,避免切換過程當中影響應用的正常運行:github
kubectl cordon <node-name>
kubectl drain <node-name> --ignore-daemonsets
複製代碼
而後以 root 用戶登陸到 Node 上面,中止 docker 和 kubelet,並刪除 docker:docker
systemctl stop kubelet
systemctl stop docker
apt purge docker-ce docker-ce-cli
複製代碼
接下來,生成 containerd 配置文件:markdown
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
複製代碼
因爲國內環境沒法訪問 GCR,須要修改 pause 鏡像爲國內能夠訪問的地址,好比替換爲 MCR:ide
...
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "mcr.microsoft.com/oss/kubernetes/pause:1.3.1"
...
複製代碼
接下來,打開 /etc/default/kubelet
,修改 kubelet 啓動選項,配置容器運行時爲 containerd:工具
KUBELET_FLAGS=... --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock
複製代碼
修改完成後, 重啓 containerd 和 kubelet:oop
systemctl daemon-reload
systemctl restart containerd
systemctl restart kubelet
複製代碼
最後,退出 Node,使用 kubectl 命令驗證節點的容器運行時:學習
# kubectl get node <node-name> -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
<node-name> Ready agent 13d v1.18.2 10.241.0.21 <none> Ubuntu 18.04.5 LTS 5.4.0-1039 containerd://1.4.3
複製代碼
能夠發現,容器運行時已經切換到了 containerd,其版本爲 1.4.3。ui
最後,把節點從新加回集羣中:
kubectl uncordon <node-name>
複製代碼
對其餘的節點重複以上步驟,就能夠把集羣的 docker 替換成 containerd。
除了以上的步驟,切換到 containerd 以後,還須要注意 docker.sock 再也不可用,也就意味着不能再在容器裏面執行 docker 命令來構建鏡像了。這裏,我推薦幾種不須要 docker.sock 也能夠構建鏡像的方法。
第一個是 Docker Buildx,這也是 Kubernetes 社區用於構建多體系結構鏡像的方法。好比,你能夠執行下面的命令來構建鏡像:
docker buildx create --driver kubernetes --driver-opt replicas=3 --use
docker buildx build -t example.com/foo --push .
複製代碼
第二個是 Redhat 開源的 Buildah。Buildah 是 Openshift 默認的鏡像構建工具,同時支持 OCI 和 Docker 鏡像格式。Buildah 的使用方法相似於 docker build,如:
# 構建鏡像
buildah bud -t example.com/foo:latest .
# 查詢鏡像列表
buildah images
複製代碼
第三個是 Google 開源的 kaniko。Kaniko 也是不須要 docker daemon 就能夠從 Dockerfile 構建鏡像。在使用 Kaniko 時要注意,它在構建鏡像時須要把構建上下文(context)傳入到 kaniko 命令行中,構建上下文能夠放到標準輸入中,也能夠放到 AWS S三、Azure Blob Storage、GCS Bucket 等存儲中。
Docker 棄用後,能夠把 Kubernetes 容器運行時切換到社區維護並支持 CRI 的容器引擎,如 containerd、cri-o 等。切換以後,也須要注意,原來使用 docker build 構建鏡像的應用須要切換到無需 Dockerd 就能夠構建鏡像的工具,如 docker build、buildah、kaniko 等。
歡迎關注 漫談雲原生 公衆號,學習更多雲原生知識。