別慌張: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。針對這種特定用例,有很多選項,包括 kaniko、img 和 buildah 等。
但是,這種變更對開發人員意味著什麼呢?我們還會編寫 Dockerfile 嗎?我們還會使用 Docker 建構東西嗎?
此變更解決了與大多數人用於與 Docker 互動的環境不同的環境。您在開發中使用的 Docker 安裝與 Kubernetes 叢集內部的 Docker 運行時無關。這令人困惑,我們理解。作為開發人員,Docker 對您仍然像在宣布此變更之前一樣有用。Docker 生產的映像實際上並不是 Docker 特有的映像——它是 OCI (開放容器倡議組織) 映像。任何符合 OCI 規範的映像,無論您使用哪種工具來建構它,對 Kubernetes 來說看起來都一樣。containerd 和 CRI-O 都知道如何拉取這些映像並運行它們。這就是為什麼我們有一個關於容器應該是什麼樣子的標準。
因此,這個變更即將到來。它會給某些人帶來問題,但這不是災難性的,而且總體來說是件好事。根據您與 Kubernetes 互動的方式,這可能對您來說毫無意義,或者可能意味著一些工作。從長遠來看,它會讓事情變得更容易。如果這對您來說仍然令人困惑,那也沒關係——這裡有很多事情正在發生;Kubernetes 有很多移動部件,沒有人是 100% 的專家。我們鼓勵提出任何和所有問題,無論經驗水平或複雜程度如何!我們的目標是確保每個人都盡可能了解即將發生的變更。我們希望這已經回答了您的大部分問題並緩解了一些焦慮!❤️
正在尋找更多答案?查看我們的隨附 Dockershim 移除 FAQ (2022 年 2 月更新)。