檢查 dockershim 移除是否會影響您
Kubernetes 的 dockershim
元件允許使用 Docker 作為 Kubernetes 的容器執行期。Kubernetes 的內建 dockershim
元件已在 v1.24 版本中移除。
本頁說明您的叢集如何使用 Docker 作為容器執行期,提供使用中 dockershim
所扮演角色的詳細資訊,並顯示您可以採取的步驟,以檢查是否有任何工作負載可能受到 dockershim
移除的影響。
尋找您的應用程式是否依賴 Docker
如果您使用 Docker 來建置您的應用程式容器,您仍然可以在任何容器執行期上執行這些容器。這種 Docker 的使用方式不算是依賴 Docker 作為容器執行期。
當使用替代容器執行期時,執行 Docker 命令可能無法運作或產生非預期的輸出。以下是如何找出您是否依賴 Docker 的方法
- 確保沒有特權 Pod 執行 Docker 命令 (例如
docker ps
)、重新啟動 Docker 服務 (例如systemctl restart docker.service
) 或修改 Docker 特有檔案,例如/etc/docker/daemon.json
。 - 檢查 Docker 組態檔 (例如
/etc/docker/daemon.json
) 中是否有任何私有登錄檔或映像檔鏡像設定。通常需要為另一個容器執行期重新設定這些設定。 - 檢查在 Kubernetes 基礎架構外部的節點上執行的腳本與應用程式是否未執行 Docker 命令。可能是
- SSH 連線至節點以進行疑難排解;
- 節點啟動腳本;
- 直接安裝在節點上的監控與安全代理程式。
- 執行上述特權操作的第三方工具。請參閱從 dockershim 遷移遙測與安全代理程式以取得更多資訊。
- 確保沒有間接依賴 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 整合進入 GA 部落格文章中閱讀相關資訊。
切換至 Containerd 作為容器執行期消除了中間人。所有相同的容器都可以像以前一樣由 Containerd 等容器執行期執行。但是現在,由於容器直接與容器執行期排程,因此它們對 Docker 不可見。因此,您之前可能使用過的任何 Docker 工具或精美 UI 來檢查這些容器都已不再可用。
您無法使用 docker ps
或 docker inspect
命令取得容器資訊。由於您無法列出容器,因此您無法取得日誌、停止容器,或使用 docker exec
在容器內執行任何操作。
注意
如果您透過 Kubernetes 執行工作負載,停止容器的最佳方式是透過 Kubernetes API,而不是直接透過容器執行階段(此建議適用於所有容器執行階段,而不僅僅是 Docker)。您仍然可以使用 docker build
命令拉取映像檔或建置它們。但是 Docker 建置或拉取的映像檔對於容器執行階段和 Kubernetes 是不可見的。它們需要被推送至某些 registry,以便 Kubernetes 可以使用它們。
已知問題
某些檔案系統指標遺失,且指標格式不同
Kubelet /metrics/cadvisor
端點提供 Prometheus 指標,如Kubernetes 系統組件的指標中所述。如果您安裝的指標收集器依賴於該端點,您可能會看到以下問題
- 在 Docker 節點上的指標格式為
k8s_<容器名稱>_<Pod 名稱>_<命名空間>_<Pod UID>_<重新啟動計數>
,但在其他執行階段上的格式則不同。例如,在 containerd 節點上,它是<容器 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 來緩解此問題。
- 尋找最新的 cAdvisor 版本,其名稱模式為
vX.Y.Z-containerd-cri
(例如,v0.42.0-containerd-cri
)。 - 依照 cAdvisor Kubernetes DaemonSet 中的步驟來建立 DaemonSet。
- 將已安裝的指標收集器指向使用 cAdvisor
/metrics
端點,該端點提供完整的 Prometheus 容器指標。
替代方案
- 使用替代的第三方指標收集解決方案。
- 從 Kubelet summary API 收集指標,該 API 在
/stats/summary
提供服務。
下一步
- 閱讀從 dockershim 遷移以了解您的後續步驟
- 閱讀 dockershim 棄用常見問題解答 文章以獲取更多資訊。