別慌: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。針對這種特定用例,有很多替代方案,包括 kaniko、img 和 buildah 等。
那麼,這種變化對開發者意味著什麼呢?我們仍然編寫 Dockerfile 嗎?我們仍然使用 Docker 構建東西嗎?
這個變更所涉及的環境與大多數人使用 Docker 進行互動的環境不同。您在開發中使用的 Docker 安裝與 Kubernetes 叢集中的 Docker 執行時無關。我們理解這令人困惑。作為開發者,Docker 在此變更公佈之前對您仍然有用。Docker 生成的映象並不是 Docker 特有的映象——它是一個 OCI (開放容器倡議) 映象。任何符合 OCI 標準的映象,無論您使用什麼工具構建它,對 Kubernetes 來說都將是一樣的。 containerd 和 CRI-O 都知道如何拉取這些映象並執行它們。這就是我們制定容器外觀標準的理由。
所以,這個變化即將到來。它會給一些人帶來問題,但並非災難性的,總的來說是件好事。取決於你與 Kubernetes 互動的方式,這可能對你毫無影響,也可能意味著一些工作。從長遠來看,這會使事情變得更容易。如果這仍然讓你感到困惑,那也沒關係——這裡有很多事情發生;Kubernetes 有很多活動部件,沒有人能百分之百精通所有這些。我們鼓勵提出任何和所有問題,無論經驗水平或複雜程度如何!我們的目標是確保每個人都儘可能多地瞭解即將發生的變化。我們希望這已經回答了您的大部分問題,並緩解了一些焦慮!❤️
正在尋找更多答案?請檢視我們隨附的 Dockershim 移除常見問題解答 (2022 年 2 月更新)。