K8s排障

Jan 于 2025-11-19 发布 浏览量

K8s 排障

问题概述

在部署 jjt-test 应用时出现多种镜像拉取异常,症状包括:


排障过程

Pod 镜像拉取失败

遇到的问题: kubectl describe pod 显示无法连接 registry-1.docker.io

问题原因: 国内无法访问 Docker Hub。

如何解决:


containerd 配置加速源不生效

遇到的问题:

问题原因: containerd 新版本不再读取 config.toml 里的 mirrors,而是使用 /etc/containerd/certs.d/<registry>/hosts.toml。最开始的加速源配置没有生效。

如何解决:


pause 镜像无法拉取(重大阻塞点)

遇到的问题: 报错:

Failed to pull image "k8s.gcr.io/pause:3.10"

问题原因:

如何解决:

ctr -n k8s.io images pull registry.aliyuncs.com/google_containers/pause:3.10
ctr -n k8s.io images tag registry.aliyuncs.com/google_containers/pause:3.10 k8s.gcr.io/pause:3.10
systemctl restart kubelet

说明:


阿里云 nginx 仓库路径无权限

遇到的问题: 尝试拉取:

registry.cn-hangzhou.aliyuncs.com/library/nginx

报错:

insufficient_scope

问题原因:

如何解决:

docker.m.daocloud.io/library/nginx:1.25.3
kubectl set image deploy/jjt-test jjt=docker.m.daocloud.io/library/nginx:1.25.3

ReplicaSet 残留导致副本不一致

遇到的问题:

kubectl get rs | grep jjt-test

发现多个 ReplicaSet,Deployment 显示 UP-TO-DATE 不一致

问题原因:

如何解决:

kubectl scale deploy jjt-test --replicas=0
kubectl scale deploy jjt-test --replicas=2

Pod IP 正常但无法访问

遇到的问题: Pod IP 如:

10.244.166.140
10.244.219.102

无法访问 nginx 页面

问题原因: Pod IP 属于 CNI 内部网段,外部无法直接访问

如何解决:


三、关键配置

containerd 加速源(正确写法)

## /etc/containerd/certs.d/docker.io/hosts.toml

server = "https://registry-1.docker.io"

[host."https://docker.m.daocloud.io"]
  capabilities = ["pull", "resolve"]

四、crictl 与 ctr 区别总结

对比项 crictl ctr
调用接口 通过 CRI(Container Runtime Interface)调用 containerd 直接调用 containerd API
kubelet 使用关系 kubelet 实际调用的就是 CRI,因此 和 Pod 启动行为完全一致 kubelet 不会使用 ctr,ctr 结果不代表 kubelet 行为
典型用途 调试 K8s 容器、拉取 Pod 镜像、查看 Pod 容器状态 containerd 底层调试、直接管理镜像和快照、非 K8s 环境操作
拉取镜像行为 会遵循 /etc/containerd/certs.d 配置(和 kubelet 一致) 不读取 certs.d,必须额外指定 hosts.toml 或不用加速源
是否支持 k8s sandbox(pause) ✓ 支持 ✓ 支持,但使用 namespace:ctr -n k8s.io
命令风格 类似 docker,对 K8s 运维更友好 更底层,参数多,不适合日常 K8s 运维
典型命令 crictl pull <img> crictl ps ctr -n k8s.io images pull <img>
使用场景 排查 Pod 镜像问题时应该优先使用它 只有在确认 containerd 本身问题时才使用

一句话总结:

crictl 决定 Pod 能否启动,而 ctr 不决定。Pod 拉取失败时看 crictl 的结果最准确。