Kubernetes 部署 kube-state-metrics 遇到 ImagePullBackOff 问题记录
·
一、问题背景
实验环境:
- Kubernetes v1.20.15
- Docker 20.10.24
- 三节点:
- master
- node1
- node2
部署 kube-state-metrics 时,Pod 一直无法启动。
查看:
kubectl get pod -n kube-system
发现:
kube-state-metrics ImagePullBackOff
二、排查过程
1. 查看失败原因
执行:
kubectl describe pod -n kube-system kube-state-metrics
发现:
Failed to pull image:
k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.5.0
原因:
服务器无法访问国外镜像仓库。
2. 检查本地是否有镜像
执行:
docker images | grep kube-state
发现:
k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.5.0
说明 master 节点已经有镜像。
于是怀疑:
是不是 Kubernetes 没使用 master 的镜像?
3. 查看 Pod 调度节点
执行:
kubectl get pod -n kube-system -o wide
发现:
NAME NODE
kube-state-metrics node1
问题找到:
Pod 被调度到了 node1,但是镜像只存在 master。
三、问题原理
Kubernetes 集群中:
每个节点都有自己的 Docker 镜像。
不是:
master 有镜像
↓
所有节点都能使用
而是:
master
└── kube-state-metrics镜像
node1
└── 没有镜像
Pod调度到node1
↓
node1发现没有镜像
↓
尝试去仓库下载
↓
网络无法访问
↓
ImagePullBackOff
四、解决方法
实验环境中,为了简单:
让 kube-state-metrics 固定运行在 master。
修改 YAML:
增加:
spec:
template:
spec:
nodeName: master
表示:
这个 Pod 只能运行在 master 节点。
重新部署:
kubectl delete deployment kube-state-metrics -n kube-system
kubectl apply -f kube-state-metrics.yaml
查看:
kubectl get pod -n kube-system -o wide
结果:
kube-state-metrics Running master
问题解决。
五、这次学到的东西
遇到 Kubernetes
ImagePullBackOff
不要直接认为是镜像问题。
排查顺序:
- 看报错:
kubectl describe pod
- 看镜像是否存在:
docker images
- 看 Pod 跑在哪个节点:
kubectl get pod -o wide
很多时候问题不是 Kubernetes 配置,而是:
Pod 调度到了没有镜像的节点。
这个版本更适合你当前阶段,因为核心只需要记住一句:
Kubernetes 调度 Pod 时,只看节点资源;镜像在哪个节点,Pod 就必须运行在哪个节点,或者所有节点都提前准备镜像。
更多推荐
所有评论(0)