K3s server 启动卡在 “Waiting for containerd to be available” 超过5分钟

10次阅读

K3s server 卡在等待 containerd socket 就绪,需检查其进程、socket 文件存在性与权限、系统 containerd 冲突、cgroup 驱动一致性及日志报错,必要时临时跳过等待诊断。

K3s server 启动卡在 “Waiting for containerd to be available” 超过5分钟ainerd 启动失败,而是 K3s server 在等待 containerd 的 API socket 就绪,但实际 containerd 进程可能已运行、却未正确暴露或权限异常。重点排查 containerd 是否真在运行、socket 文件是否存在且可访问、以及是否被其他进程(如系统 containerd)抢占端口或路径。

检查 containerd 进程和 socket 状态

K3s 内置的 containerd 默认不使用系统全局服务,而是以独立进程运行,并监听 /var/lib/rancher/k3s/agent/containerd/containerd.sock。执行以下命令确认:

  • 运行 ps aux | grep containerd,确认有类似 k3s-containerd 或带 --config /var/lib/rancher/k3s/agent/etc/containerd/config.toml 的进程
  • 检查 socket 文件:ls -l /var/lib/rancher/k3s/agent/containerd/containerd.sock —— 若不存在或权限为 root:root 且非 0600,K3s server 主进程无法连接
  • 手动测试连通性:sudo crictl -r unix:///var/lib/rancher/k3s/agent/containerd/containerd.sock info(需安装 crictl),若报 “connection refused” 或 “no such file”,说明 containerd 未就绪或配置错位

确认无系统 containerd 冲突

如果宿主机已安装并启用了 systemd 的 containerd.service(如 ubuntu 默认安装),K3s 可能因路径冲突或 cgroup 驱动不一致卡住:

  • 运行 sudo systemctl is-active containerd,若返回 active,先停用:sudo systemctl stop containerd && sudo systemctl disable containerd
  • 检查 K3s 日志中是否有 cgroup driver: "systemd" vs "cgroupfs" 类似警告 —— 可通过启动参数统一:--container-runtime-endpoint unix:///var/lib/rancher/k3s/agent/containerd/containerd.sock --kubelet-arg="cgroup-driver=systemd"(需匹配 containerd config 中的 disabled_pluginsplugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options.SystemdCgroup = true

查看 K3s 容器运行时日志定位根因

K3s 启动时会拉起 containerd 子进程,其日志直接输出到 K3s 主日志中:

  • 执行 sudo journalctl -u k3s -n 200 -f(systemd)或 sudo cat /var/lib/rancher/k3s/server/logs/k3s.log | tail -n 100(裸机),搜索关键词:containerdfailed to load pluginfailed to create containerd clientaddress already in use
  • 常见报错示例:failed to load plugin io.containerd.grpc.v1.cri: invalid version "v1": unknown version → 表明 containerd 版本与 K3s 不兼容(如 K3s v1.28+ 要求 containerd ≥ 1.7);此时应升级 K3s 或降级 containerd(不推荐),更稳妥的是重装匹配版本的 K3s

临时绕过等待(仅用于诊断)

若需快速验证是否为等待逻辑本身导致卡顿(而非 containerd 故障),可加启动参数跳过健康检查:

  • sudo k3s server --disable-agent --no-deploy servicelb,traefik --wait-control-plane=false
  • 此模式下 K3s 不阻塞在 containerd 就绪检查,但仅适用于调试 —— 正常部署必须确保 containerd 可用
text=ZqhQzanResources