检查 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 集成通用发布博客文章中阅读相关内容。

Dockershim vs. CRI with Containerd

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

你无法使用 `docker ps` 或 `docker 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. 查找最新版 cAdvisor 发布,其名称模式为 `vX.Y.Z-containerd-cri`(例如,`v0.42.0-containerd-cri`)。
  2. 按照 cAdvisor Kubernetes Daemonset 中的步骤创建 DaemonSet。
  3. 将已安装的指标收集器指向使用 cAdvisor 的 `/metrics` 端点,该端点提供全套的 Prometheus 容器指标

替代方案

  • 使用替代的第三方指标收集解决方案。
  • 从 `/stats/summary` 提供的 Kubelet 摘要 API 收集指标。

下一步

上次修改时间为 2023 年 3 月 23 日太平洋标准时间上午 11:16:应用代码审查建议 (9b78ecff2c)