檢查 dockershim 移除是否影響你

Kubernetes 的 `dockershim` 元件允許使用 Docker 作為 Kubernetes 的容器執行時。Kubernetes 內建的 `dockershim` 元件已在 v1.24 版本中移除。

本文解釋了你的叢集如何使用 Docker 作為容器執行時,詳細說明了 `dockershim` 在使用時所扮演的角色,並展示了你可以採取的步驟來檢查是否有任何工作負載可能受到 `dockershim` 移除的影響。

查詢你的應用程式是否依賴 Docker

如果你使用 Docker 構建應用程式容器,你仍然可以在任何容器執行時上執行這些容器。這種 Docker 使用不算是對 Docker 作為容器執行時的依賴。

當使用替代容器執行時時,執行 Docker 命令可能不起作用或產生意外輸出。以下是你如何發現你是否依賴 Docker:

  1. 確保沒有特權 Pod 執行 Docker 命令(如 `docker ps`)、重新啟動 Docker 服務(如 `systemctl restart docker.service`)或修改 Docker 特定檔案(如 `/etc/docker/daemon.json`)。
  2. 檢查 Docker 配置檔案(如 `/etc/docker/daemon.json`)中是否存在任何私有倉庫或映象映象設定。這些通常需要為其他容器執行時重新配置。
  3. 檢查在 Kubernetes 基礎設施之外的節點上執行的指令碼和應用程式是否執行 Docker 命令。這可能是:
    • SSH 到節點進行故障排除;
    • 節點啟動指令碼;
    • 直接安裝在節點上的監控和安全代理。
  4. 執行上述特權操作的第三方工具。更多資訊請參閱從 dockershim 遷移遙測和安全代理
  5. 確保沒有對 dockershim 行為的間接依賴。這是一個極端情況,不太可能影響你的應用程式。某些工具可能配置為響應 Docker 特定的行為,例如,在故障排除說明中對特定指標發出警報或搜尋特定日誌訊息。如果你配置了此類工具,請在遷移前在測試叢集上測試其行為。

Docker 依賴解釋

容器執行時是能夠執行構成 Kubernetes Pod 的容器的軟體。Kubernetes 負責 Pod 的編排和排程;在每個節點上,kubelet 使用容器執行時介面作為抽象,以便你可以使用任何相容的容器執行時。

在最初的版本中,Kubernetes 僅支援一種容器執行時:Docker。在 Kubernetes 專案歷史的後期,叢集操作員希望採用額外的容器執行時。CRI 的設計旨在提供這種靈活性——並且 kubelet 開始支援 CRI。然而,由於 Docker 在 CRI 規範發明之前就已存在,Kubernetes 專案建立了一個介面卡元件,即 `dockershim`。`dockershim` 介面卡允許 kubelet 與 Docker 互動,就像 Docker 是一個 CRI 相容的執行時一樣。

你可以在Kubernetes Containerd 整合通用釋出部落格文章中閱讀相關內容。

Dockershim vs. CRI with Containerd

切換到 Containerd 作為容器執行時消除了中間層。所有相同的容器都可以像以前一樣由 Containerd 等容器執行時執行。但現在,由於容器直接與容器執行時排程,它們對 Docker 不可見。因此,你以前可能用於檢查這些容器的任何 Docker 工具或精美 UI 都將不再可用。

你無法使用 `docker ps` 或 `docker inspect` 命令獲取容器資訊。由於你無法列出容器,因此無法獲取日誌、停止容器或使用 `docker exec` 在容器內執行任何操作。

你仍然可以使用 `docker build` 命令拉取映象或構建它們。但是 Docker 構建或拉取的映象對容器執行時和 Kubernetes 不可見。它們需要推送到某個倉庫,以便 Kubernetes 可以使用它們。

已知問題

某些檔案系統指標缺失且指標格式不同

Kubelet `/metrics/cadvisor` 端點提供 Prometheus 指標,如Kubernetes 系統元件的指標中所述。如果你安裝了依賴該端點的指標收集器,你可能會看到以下問題:

  • Docker 節點上的指標格式是 `k8s_<container-name>_<pod-name>_<namespace>_<pod-uid>_<restart-count>`,但其他執行時上的格式不同。例如,在 containerd 節點上是 `<container-id>`。
  • 某些檔案系統指標缺失,如下所示:
    container_fs_inodes_free
    container_fs_inodes_total
    container_fs_io_current
    container_fs_io_time_seconds_total
    container_fs_io_time_weighted_seconds_total
    container_fs_limit_bytes
    container_fs_read_seconds_total
    container_fs_reads_merged_total
    container_fs_sector_reads_total
    container_fs_sector_writes_total
    container_fs_usage_bytes
    container_fs_write_seconds_total
    container_fs_writes_merged_total
    

解決方法

你可以透過使用 cAdvisor 作為獨立 DaemonSet 來緩解此問題。

  1. 查詢最新版 cAdvisor 釋出,其名稱模式為 `vX.Y.Z-containerd-cri`(例如,`v0.42.0-containerd-cri`)。
  2. 按照 cAdvisor Kubernetes Daemonset 中的步驟建立 DaemonSet。
  3. 將已安裝的指標收集器指向使用 cAdvisor 的 `/metrics` 端點,該端點提供全套的 Prometheus 容器指標

替代方案

  • 使用替代的第三方指標收集解決方案。
  • 從 `/stats/summary` 提供的 Kubelet 摘要 API 收集指標。

下一步

上次修改時間為 2023 年 3 月 23 日太平洋標準時間上午 11:16:應用程式碼審查建議 (9b78ecff2c)