別慌張:Kubernetes 與 Docker

更新: Kubernetes 對 Docker 透過 dockershim 的支援現在已移除。如需更多資訊,請閱讀移除 FAQ。您也可以透過專用的 GitHub 議題討論棄用。


Kubernetes 正在 棄用 Docker 作為 v1.20 之後的容器運行時。

您無需驚慌。情況沒有聽起來那麼戲劇化。

重點摘要:底層運行時的 Docker 正被棄用,轉而支持使用為 Kubernetes 建立的 容器運行時介面 (CRI) 的運行時。Docker 生產的映像將繼續在您的叢集中與所有運行時一起運作,就像它們一直以來一樣。

如果您是 Kubernetes 的終端使用者,對您來說不會有太多改變。這並不意味著 Docker 的末日,也不意味著您不能或不應該再將 Docker 用作開發工具。Docker 仍然是用於建構容器的有用工具,並且從運行 docker build 產生的映像仍然可以在您的 Kubernetes 叢集中運行。

如果您使用的是受管理的 Kubernetes 服務(如 AKS、EKS 或 GKE),您需要確保您的工作節點在使用受支援的容器運行時,然後才能在未來版本的 Kubernetes 中移除 Docker 支援。如果您有節點自訂,您可能需要根據您的環境和運行時需求更新它們。請與您的服務提供者合作,以確保正確的升級測試和規劃。

如果您正在自行部署叢集,您也需要進行更改以避免叢集崩潰。在 v1.20 版本中,您將收到 Docker 的棄用警告。當 Docker 運行時支援在未來版本(目前計劃在 2021 年末的 1.22 版本中)的 Kubernetes 中移除時,將不再受支援,您將需要切換到其他符合規範的容器運行時之一,例如 containerd 或 CRI-O。只需確保您選擇的運行時支援您目前使用的 docker daemon 組態(例如記錄)。

那麼,困惑的原因是什麼?大家都在大驚小怪什麼?

我們在這裡談論的是兩種不同的環境,這造成了混淆。在您的 Kubernetes 叢集內部,有一個稱為容器運行時的東西,它負責拉取和運行您的容器映像。Docker 是該運行時的熱門選擇(其他常見選項包括 containerd 和 CRI-O),但 Docker 並非設計為嵌入在 Kubernetes 內部,這會導致問題。

您看,我們稱之為「Docker」的東西實際上並不是一件東西——它是一個完整的技術堆疊,其中一部分稱為「containerd」,它本身就是一個高階容器運行時。Docker 很酷且有用,因為它有很多 UX 增強功能,使人類在進行開發工作時可以非常輕鬆地與之互動,但這些 UX 增強功能對於 Kubernetes 來說不是必需的,因為它不是人類。

由於這種人性化的抽象層,您的 Kubernetes 叢集必須使用另一個稱為 Dockershim 的工具來獲取它真正需要的東西,即 containerd。這不太好,因為它給了我們另一個必須維護並且可能崩潰的東西。實際上正在發生的事情是,Dockershim 將儘早在 v1.23 版本中從 Kubelet 中移除,這導致移除了對 Docker 作為容器運行時的支援。您可能會想,但是如果 containerd 包含在 Docker 堆疊中,為什麼 Kubernetes 需要 Dockershim 呢?

Docker 不符合 CRI,即 容器運行時介面。如果符合,我們就不需要 shim,這就不會成為問題。但這不是世界末日,您無需驚慌——您只需要將您的容器運行時從 Docker 更改為另一個受支援的容器運行時即可。

需要注意的一件事:如果您今天在叢集內的某個工作流程中依賴底層 docker socket (/var/run/docker.sock),則遷移到不同的運行時將會破壞您使用它的能力。這種模式通常稱為 Docker in Docker。針對這種特定用例,有很多選項,包括 kanikoimgbuildah 等。

但是,這種變更對開發人員意味著什麼呢?我們還會編寫 Dockerfile 嗎?我們還會使用 Docker 建構東西嗎?

此變更解決了與大多數人用於與 Docker 互動的環境不同的環境。您在開發中使用的 Docker 安裝與 Kubernetes 叢集內部的 Docker 運行時無關。這令人困惑,我們理解。作為開發人員,Docker 對您仍然像在宣布此變更之前一樣有用。Docker 生產的映像實際上並不是 Docker 特有的映像——它是 OCI (開放容器倡議組織) 映像。任何符合 OCI 規範的映像,無論您使用哪種工具來建構它,對 Kubernetes 來說看起來都一樣。containerdCRI-O 都知道如何拉取這些映像並運行它們。這就是為什麼我們有一個關於容器應該是什麼樣子的標準。

因此,這個變更即將到來。它會給某些人帶來問題,但這不是災難性的,而且總體來說是件好事。根據您與 Kubernetes 互動的方式,這可能對您來說毫無意義,或者可能意味著一些工作。從長遠來看,它會讓事情變得更容易。如果這對您來說仍然令人困惑,那也沒關係——這裡有很多事情正在發生;Kubernetes 有很多移動部件,沒有人是 100% 的專家。我們鼓勵提出任何和所有問題,無論經驗水平或複雜程度如何!我們的目標是確保每個人都盡可能了解即將發生的變更。我們希望這已經回答了您的大部分問題並緩解了一些焦慮!❤️

正在尋找更多答案?查看我們的隨附 Dockershim 移除 FAQ (2022 年 2 月更新)