一、问题背景

实验环境:

  • 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

不要直接认为是镜像问题。

排查顺序:

  1. 看报错:
kubectl describe pod
  1. 看镜像是否存在:
docker images
  1. 看 Pod 跑在哪个节点:
kubectl get pod -o wide

很多时候问题不是 Kubernetes 配置,而是:

Pod 调度到了没有镜像的节点。


这个版本更适合你当前阶段,因为核心只需要记住一句:

Kubernetes 调度 Pod 时,只看节点资源;镜像在哪个节点,Pod 就必须运行在哪个节点,或者所有节点都提前准备镜像。

更多推荐