別慌:Kubernetes 和 Docker

更新: Kubernetes 透過 dockershim 對 Docker 的支援現已移除。欲瞭解更多資訊,請閱讀移除常見問題解答。您也可以透過專門的 GitHub issue 討論此棄用。


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

你無需驚慌。這不像聽起來那麼 драматиc。

總而言之,Docker 作為底層執行時正在被棄用,轉而支援使用為 Kubernetes 建立的 容器執行時介面 (CRI) 的執行時。Docker 生成的映象將繼續在您的叢集中與所有執行時一起工作,一如既往。

如果您是 Kubernetes 的終端使用者,那麼對您來說,變化不會太大。這並不意味著 Docker 的消亡,也不意味著您不能或不應該再使用 Docker 作為開發工具。Docker 仍然是構建容器的有用工具,執行 docker build 生成的映象仍然可以在您的 Kubernetes 叢集中執行。

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

如果您正在自己搭建叢集,您也需要進行更改以避免叢集中斷。在 v1.20 中,您將收到 Docker 的棄用警告。當 Docker 執行時支援在未來版本(目前計劃在 2021 年底釋出的 1.22 版本中移除)的 Kubernetes 中移除時,它將不再受支援,您需要切換到其他相容的容器執行時之一,例如 containerd 或 CRI-O。只需確保您選擇的執行時支援您當前使用的 docker 守護程式配置(例如日誌記錄)。

那麼,為什麼會有這種困惑,大家又在為什麼而恐慌呢?

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

你看,我們稱之為“Docker”的東西實際上不是一回事——它是一個完整的技術棧,其中一部分叫做“containerd”,它本身就是一個高階容器執行時。Docker 酷且有用,因為它有很多使用者體驗增強功能,使人類在開發工作中能夠輕鬆地與它互動,但這些使用者體驗增強功能對於 Kubernetes 來說並非必需,因為它不是人類。

由於這種對人類友好的抽象層,你的 Kubernetes 叢集必須使用另一個名為 Dockershim 的工具來獲取它真正需要的東西,即 containerd。這並不好,因為它給我們增加了另一個需要維護且可能出現故障的東西。實際上發生的事情是,Dockershim 將最早在 v1.23 版本中從 Kubelet 中移除,從而導致對 Docker 作為容器執行時的支援被移除。你可能會想,如果 containerd 包含在 Docker 棧中,為什麼 Kubernetes 還需要 Dockershim?

Docker 不符合 容器執行時介面 (CRI)。如果它符合,我們就不需要墊片,這也就不是問題了。但這並非世界末日,你也不必驚慌——你只需要將容器執行時從 Docker 更改為另一個受支援的容器執行時即可。

需要注意的一點是:如果您今天在叢集內的工作流中依賴底層 docker 套接字 (/var/run/docker.sock),那麼切換到不同的執行時將導致您無法使用它。這種模式通常被稱為 Docker in Docker。針對這種特定用例,有很多替代方案,包括 kanikoimgbuildah 等。

那麼,這種變化對開發者意味著什麼呢?我們仍然編寫 Dockerfile 嗎?我們仍然使用 Docker 構建東西嗎?

這個變更所涉及的環境與大多數人使用 Docker 進行互動的環境不同。您在開發中使用的 Docker 安裝與 Kubernetes 叢集中的 Docker 執行時無關。我們理解這令人困惑。作為開發者,Docker 在此變更公佈之前對您仍然有用。Docker 生成的映象並不是 Docker 特有的映象——它是一個 OCI (開放容器倡議) 映象。任何符合 OCI 標準的映象,無論您使用什麼工具構建它,對 Kubernetes 來說都將是一樣的。 containerdCRI-O 都知道如何拉取這些映象並執行它們。這就是我們制定容器外觀標準的理由。

所以,這個變化即將到來。它會給一些人帶來問題,但並非災難性的,總的來說是件好事。取決於你與 Kubernetes 互動的方式,這可能對你毫無影響,也可能意味著一些工作。從長遠來看,這會使事情變得更容易。如果這仍然讓你感到困惑,那也沒關係——這裡有很多事情發生;Kubernetes 有很多活動部件,沒有人能百分之百精通所有這些。我們鼓勵提出任何和所有問題,無論經驗水平或複雜程度如何!我們的目標是確保每個人都儘可能多地瞭解即將發生的變化。我們希望這已經回答了您的大部分問題,並緩解了一些焦慮!❤️

正在尋找更多答案?請檢視我們隨附的 Dockershim 移除常見問題解答 (2022 年 2 月更新)