检查 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 集成进入 GA 博客文章中阅读有关此内容的信息。

Dockershim vs. CRI with Containerd

切换到 Containerd 作为容器运行时消除了中间人。所有相同的容器都可以像以前一样由 Containerd 等容器运行时运行。但现在,由于容器直接与容器运行时进行调度,因此它们对 Docker 不可见。因此,您可能以前用来检查这些容器的任何 Docker 工具或花哨的 UI 都不可用。

您无法使用 docker psdocker 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. 找到具有名称模式 vX.Y.Z-containerd-cri 的最新 cAdvisor 版本(例如,v0.42.0-containerd-cri)。
  2. 按照 cAdvisor Kubernetes Daemonset 中的步骤创建 daemonset。
  3. 将安装的指标收集器指向使用 cAdvisor 的 /metrics 端点,该端点提供完整的 Prometheus 容器指标 集。

备选方案

  • 使用其他第三方指标收集解决方案。
  • 从 Kubelet 摘要 API 收集指标,该 API 在 /stats/summary 上提供服务。

下一步

上次修改时间:2023 年 3 月 23 日下午 11:16 PST:应用代码审查的建议 (9b78ecff2c)