检查 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 连接到节点进行故障排除;
- 节点启动脚本;
- 直接安装在节点上的监控和安全 Agent。
- 执行上述特权操作的第三方工具。有关更多信息,请参阅将遥测和安全 Agent 从 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 不可见。它们需要被推送到某个镜像仓库,以便 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 容器度量集。
备选方案
- 使用第三方的替代度量收集方案。
- 从位于
/stats/summary
的 Kubelet summary API 收集度量。
下一步
- 阅读从 dockershim 迁移以了解你的下一步。
- 阅读dockershim 弃用常见问题文章以获取更多信息。