检查 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 集成正式发布博客文章中阅读相关内容。
切换到 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_<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作为独立的守护进程集来缓解此问题。
- 找到名称模式为
vX.Y.Z-containerd-cri
的最新cAdvisor 版本(例如,v0.42.0-containerd-cri
)。 - 按照cAdvisor Kubernetes 守护进程集中的步骤创建守护进程集。
- 将已安装的指标收集器指向使用 cAdvisor
/metrics
端点,该端点提供完整的Prometheus 容器指标集。
替代方案
- 使用其他第三方指标收集解决方案。
- 从在
/stats/summary
上提供的 Kubelet 摘要 API 收集指标。
后续步骤
- 阅读从 dockershim 迁移以了解您的后续步骤
- 阅读dockershim 弃用常见问题解答文章以获取更多信息。