打破 Dockershim 移除焦慮,且看Rancher 如何應對

語言: CN / TW / HK

王海龍, SUSE Rancher 中國社群技術經理,負責 Rancher 中國技術社群的維護和運營。擁有 8 年的雲端計算領域經驗,經歷了 OpenStack 到 Kubernetes 的技術變革,無論底層作業系統 Linux,還是虛擬化 KVM 或是 Docker 容器技術都有豐富的運維和實踐經驗。

前言

早在 2020 年 12 月,Kubernetes 就宣佈將要棄用 Dockershim。在 Kubernetes 中,Dockershim 是一個介面卡元件,Dockershim 介面卡允許 Kubelet 與 Docker 互動,就好像 Docker 是一個與 CRI 相容的執行時一樣。

近日,Kubernetes v1.24 版本正式釋出,最主要的變化就是刪除了 Dockershim。也就是說,Kubernetes v1.24 無法再通過 in-tree 的形式來支援 Docker 作為它的 CRI 執行時。

隨著 Kubernetes 的發展, 雖然 Docker 日漸式微,但還是有大量使用者群體離不開 Docker,或者說暫時無法切換到 containerd 或 CRI-O 作為它的 CRI 執行時。 Rancher 為了滿足繼續使用 Docker 作為 CRI 執行時的需求,通過 RKE 叢集支援外部 Dockershim 繼續使用 Docker 作為 CRI 執行時。

雖然 Rancher 最新的 v2.6.4 目前還不支援 Kubernetes v1.24,但早在 Kubernetes v1.21 中就採用了 Mirantis 和 Docker 宣佈的上游開源社群外部 Dockershim (該專案稱為 cri-dockerd)來確保 RKE 叢集可以繼續使用 Docker。換句話說,你可以像之前一樣繼續基於 Docker Engine 構建 Kubernetes,唯一的區別就是 Dockershim 由內建方案變成了外部方案。

要啟用外部 Dockershim,只需要在 RKE 配置中設定以下選項:

enable_cri_dockerd: true

由於外部 Dockershim 的支援是從 RKE 建立的 Kubernetes 1.21 及以上的版本中開始支援,所以我們需要通過 RKE 建立一個 Kubernetes 1.21 及以上的 Kubernetes 版本才能支援這種方案。

下面將演示如何在 RKE 建立的 Kubernetes 叢集中啟用外部 Dockershim。

通過 RKECLI 建立叢集

說明:

  • RKE 的安裝及使用,請參考官方文件http://docs.rancher.cn/rke, 這裡不再詳細說明。
  • 本次 demo 使用的 RKE 版本為 v1.3.9

配置RKE cluster.yml 檔案

在 RKE 的叢集配置檔案 cluster.yml 中通過增加 enable_cri_dockerd: true 選項來啟用外部 Dockershim 支援。本例使用最精簡檔案示例,如需個性化設定,請根據需求調整選項:

~$ cat cluster.yml
nodes:
  - address: 192.168.205.19
    user: ubuntu
    role:
      - controlplane
      - etcd
      - worker
enable_cri_dockerd: true

通過 RKE 建立 Kubernetes 叢集

~$ rke up
INFO[0000] Running RKE version: v1.3.9
INFO[0000] Initiating Kubernetes cluster
INFO[0000] cri-dockerd is enabled for cluster version [v1.22.7-rancher1-2]
INFO[0000] [certificates] GenerateServingCertificate is disabled, checking if there are unused Kubelet certificates
INFO[0000] [certificates] Generating admin certificates and kubeconfig
...
...
...
INFO[1130] [ingress] ingress controller nginx deployed successfully
INFO[1130] [addons] Setting up user addons
INFO[1130] [addons] no user addons defined
INFO[1130] Finished building Kubernetes cluster successfully

確認啟用cri-dockerd

叢集建立成功後,連線到下游叢集的主機檢視程序,可以發現增加了一個 cri-dockerd 的程序:

[email protected]:~# ps -ef | grep cri-dockerd
root     26211 25813  3 11:26 ?        00:04:13 /opt/rke-tools/bin/cri-dockerd --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --pod-infra-container-image=rancher/mirrored-pause:3.6

Cri-dockerd 其實就是從被移除的 Dockershim 中,獨立出來的一個專案。為 Docker Engine 提供了一個墊片(shim),可以通過 Kubernetes CRI 控制 Docker。這意味著你可以像以前一樣繼續基於 Docker Engine 構建 Kubernetes,只需從內建的 Dockershim 切換到外部的 Dockershim 即可。

接下來,我們再觀察 Kubelet 的引數變化:

[email protected]:~# docker inspect kubelet
            "Entrypoint": [
                ...
                "**--container-runtime=remote**",
                "-**-container-runtime-endpoint=/var/run/Dockershim.sock**",
                ...
            ],

可以看到,增加 enable_cri_dockerd: true引數啟動的 Kubernetes 叢集增加了 --container-runtime=remote和 --container-runtime-endpoint=/var/run/Dockershim.sock 兩個 Kubelet 引數。通過這兩個 Kubelet 引數可以設定 Kubernetes 叢集利用外部 Dockershim 繼續使用 Docker 作為 CRI 執行時。

通過Rancher 建立 RKE 叢集

如果你是 Rancher 的長期使用者,你肯定會知道從 Rancher UI上建立的自定義叢集就是通過 RKE 來去實現的。只不過通過 Rancher UI 建立的RKE 叢集可以省去配置 RKE cluster.yml 的煩惱,只需要從 UI 上做一些簡單的配置即可。

本節,將給大家介紹如何通過 Rancher 建立 RKE 叢集並啟用外部 Dockershim 支援。

安裝 Rancher

Rancher 的安裝及使用,請參考官方文件,這裡不再詳細說明。因為RKE 建立的Kubernetes 1.21 及以上的版本中才開始支援外部 Dockershim,並且只有 Rancher v2.6.x 才支援Kubernetes 1.21 或以上版本。所以,我們本次示例選擇 Rancher2.6.4 作為 demo 環境。

建立自定義叢集

在這裡插入圖片描述

通過 Edit as YAML 來設定 enable_cri_dockerd 引數值為 true
在這裡插入圖片描述
將 enable_cri_dockerd 的值修改為 true,儲存並建立叢集
在這裡插入圖片描述

確認啟用cri-dockerd

可以參考上面“通過 RKE CLI 建立叢集”章節的步驟去檢查下游叢集是否成功啟用了 cri-docker,為了節省篇幅,這裡就不重複說明。

常見問題

問:如果要獲得 Rancher 對上游 Dockershim 的支援,我需要升級 Rancher 嗎?

答:對於 RKE,Dockershim 的上游支援從 Kubernetes 1.21 開始。你需要使用支援 RKE 1.21 的 Rancher 版本。詳情請參見我們的支援矩陣。

問:我目前的 RKE 使用 Kubernetes 1.20。為了避免出現不再支援 Dockershim 的情況,我是否需要儘早將 RKE 升級到 Kubernetes 1.21?

答:在使用 Kubernetes 1.20 的 RKE 中,Dockershim 版本依然可用,而且在下一個發行版發行之前不會被棄用。有關時間線的更多資訊,請參見 Kubernetes Dockershim 棄用相關的常見問題。Kubernetes 會發出將會棄用 Dockershim 的警告,而 Rancher 在 RKE 中已經用 Kubernetes 1.21 緩解了這個問題。你可以按照計劃正常升級到 1.21。

問:如果我不想再依賴 Dockershim,我還有什麼選擇?

答:你可以為 Kubernetes 使用不需要 Dockershim 支援的執行時,如 Containerd。RKE2 和 K3s 就是其中的兩個選項。

問:如果我目前使用 RKE1,但想切換到 RKE2,我可以怎樣進行遷移?

答:你可以構建一個新叢集,然後將工作負載遷移到使用 Containerd 的新 RKE2 叢集。Rancher 也在探索就地升級路徑的可能性。

問:如果我已經通過 RKE 建立了 Kubernetes v1.21 以上的叢集,當我切換到外部 Dockershim 是否會對叢集有影響?

答:無影響,因為容器執行時沒有變化,Dockershim 只是由內建方案變成了外部方案。