在節點上將容器運行時從 Docker Engine 變更為 containerd

此任務概述了將您的容器執行階段從 Docker 更新到 containerd 所需的步驟。 它適用於執行 Kubernetes 1.23 或更早版本的叢集運營商。 這也涵蓋了從 dockershim 遷移到 containerd 的範例情境。 可以從此頁面中選擇替代的容器執行階段。

開始之前

安裝 containerd。 有關更多資訊,請參閱 containerd 的安裝文件,有關具體先決條件,請遵循containerd 指南

排空節點

kubectl drain <node-to-drain> --ignore-daemonsets

<node-to-drain> 替換為您要排空的節點名稱。

停止 Docker daemon

systemctl stop kubelet
systemctl disable docker.service --now

安裝 Containerd

遵循指南以取得安裝 containerd 的詳細步驟。

  1. 從官方 Docker 儲存庫安裝 containerd.io 套件。 有關為您的 Linux 發行版設定 Docker 儲存庫和安裝 containerd.io 套件的說明,請參閱containerd 入門

  2. 組態 containerd

    sudo mkdir -p /etc/containerd
    containerd config default | sudo tee /etc/containerd/config.toml
    
  3. 重新啟動 containerd

    sudo systemctl restart containerd
    

啟動 Powershell 會話,將 $Version 設定為所需的版本(例如:$Version="1.4.3"),然後執行以下命令

  1. 下載 containerd

    curl.exe -L https://github.com/containerd/containerd/releases/download/v$Version/containerd-$Version-windows-amd64.tar.gz -o containerd-windows-amd64.tar.gz
    tar.exe xvf .\containerd-windows-amd64.tar.gz
    
  2. 解壓縮和組態

    Copy-Item -Path ".\bin\" -Destination "$Env:ProgramFiles\containerd" -Recurse -Force
    cd $Env:ProgramFiles\containerd\
    .\containerd.exe config default | Out-File config.toml -Encoding ascii
    
    # Review the configuration. Depending on setup you may want to adjust:
    # - the sandbox_image (Kubernetes pause image)
    # - cni bin_dir and conf_dir locations
    Get-Content config.toml
    
    # (Optional - but highly recommended) Exclude containerd from Windows Defender Scans
    Add-MpPreference -ExclusionProcess "$Env:ProgramFiles\containerd\containerd.exe"
    
  3. 啟動 containerd

    .\containerd.exe --register-service
    Start-Service containerd
    

組態 kubelet 以使用 containerd 作為其容器執行階段

編輯檔案 /var/lib/kubelet/kubeadm-flags.env 並將 containerd 執行階段新增到標誌;--container-runtime-endpoint=unix:///run/containerd/containerd.sock

使用 kubeadm 的使用者應注意,kubeadm 工具會將每個主機的 CRI socket 作為註解儲存在該主機的 Node 物件中。 若要變更它,您可以在具有 kubeadm /etc/kubernetes/admin.conf 檔案的機器上執行以下命令。

kubectl edit no <node-name>

這將啟動一個文字編輯器,您可以在其中編輯 Node 物件。 若要選擇文字編輯器,您可以設定 KUBE_EDITOR 環境變數。

  • kubeadm.alpha.kubernetes.io/cri-socket 的值從 /var/run/dockershim.sock 變更為您選擇的 CRI socket 路徑(例如 unix:///run/containerd/containerd.sock)。

    請注意,新的 CRI socket 路徑理想情況下必須以 unix:// 為前綴。

  • 儲存文字編輯器中的變更,這將更新 Node 物件。

重新啟動 kubelet

systemctl start kubelet

驗證節點是否健康

執行 kubectl get nodes -o wide,containerd 會顯示為我們剛變更的節點的執行階段。

移除 Docker Engine

如果節點顯示為健康,請移除 Docker。

sudo yum remove docker-ce docker-ce-cli

sudo apt-get purge docker-ce docker-ce-cli

sudo dnf remove docker-ce docker-ce-cli

sudo apt-get purge docker-ce docker-ce-cli

先前的命令不會移除主機上的映像檔、容器、卷或自訂組態檔案。 若要刪除它們,請遵循 Docker 的說明以解除安裝 Docker Engine

解除封鎖節點

kubectl uncordon <node-to-uncordon>

<node-to-uncordon> 替換為您先前排空的節點名稱。

此頁面上的項目參考第三方產品或專案,這些產品或專案提供 Kubernetes 所需的功能。 Kubernetes 專案作者不對這些第三方產品或專案負責。 有關更多詳細資訊,請參閱 CNCF 網站指南

在提出新增額外第三方連結的變更之前,您應該閱讀內容指南

上次修改時間:2023 年 7 月 12 日 早上 8:05 PST:將解除封鎖步驟新增至 containerd 遷移文件 (#41796) (a17face3ee)