检查 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 不可见。它们需要被推送到某些注册表,以便 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 Daemonset 中的步骤创建守护进程集。
- 将安装的指标收集器指向 cAdvisor
/metrics
端点,该端点提供全套的 Prometheus 容器指标。
替代方案
- 使用替代的第三方指标收集解决方案。
- 从
/stats/summary
提供的 Kubelet 摘要 API 收集指标。
下一步
- 阅读 从 dockershim 迁移,了解您的下一步措施
- 阅读 dockershim 弃用常见问题 文章以获取更多信息。