如何对 Kubernetes Pod 进行故障排除:初学者指南

670 阅读4分钟

image.png

下面将介绍kubernetes pod故障排除以及调试,和其他与 pod 容器相关的问题。

在大多数情况下,可以通过描述 pod 事件来获取 pod 错误详细信息。通过错误信息,可以找出pod故障的原因并进行修复。

如何排查 Pod 错误?

对 Pod 进行故障排除的第一步是获取 Pod 的状态。

kubectl get pods

以下输出显示了状态下的错误状态。

➜  kubectl get pods
NAME                            READY   STATUS                       RESTARTS   AGE
config-service                  0/1     CreateContainerConfigError   0          20s
image-service-fdf74c785-9znfd   0/1     InvalidImageName             0          30s
secret-pod                      0/1     ContainerCreating            0          15s

现在知道了错误类型,下一步是描述单个 pod 并浏览事件以查明导致 pod 错误的原因。

例如,

kubectl describe pod config-service

config-servicepod 名称在哪里。现在让我们详细了解如何排查和调试不同类型的 pod 错误。

image.png

Pod 错误的类型

在深入调试 Pod 之前,了解不同类型的 Pod 错误非常重要。

容器和镜像错误

所有这些错误状态都是kubernetes 容器包Kubernetes 镜像包的一部分

以下是带有错误描述的官方Kubernetes pod 错误列表。

Pod 错误类型错误说明
ErrImagePull如果 kubernetes 无法拉取清单中提到的镜像。
ErrImagePullBackOff容器镜像拉取失败,kubelet 正在退出镜像拉取
ErrInvalidImageName表示错误的镜像名称。
ErrImageInspect无法检查镜像。
ErrImageNeverPull指定的镜像在节点上不存在并且 PullPolicy 设置为 NeverPullImage
ErrRegistryUnavailable尝试连接到注册表时出现 HTTP 错误
ErrContainerNotFound在声明的 pod 中,指定的容器不存在或不受 kubelet 管理。
ErrRunInitContainer容器初始化失败。
ErrRunContainer由于配置错误,Pod 的容器无法成功启动。
ErrKillContainerpod 的容器都没有被成功杀死。
ErrCrashLoopBackOff容器已终止。kubelet 不会尝试重启它。
ErrVerifyNonRoot容器或映像试图以 root 权限运行。
ErrCreatePodSandboxPod 沙箱创建未成功。
ErrConfigPodSandbox未获取 Pod 沙盒配置。
ErrKillPodSandboxPod 沙箱未成功停止。
ErrSetupNetwork网络初始化失败。
ErrTeardownNetwork

现在让我们看看一些最常见的 pod 错误以及如何调试它们。

ErrImagePullBackOff 疑难解答

➜  pods kubectl get pods
NAME                                READY   STATUS             RESTARTS   AGE
nginx-deployment-599d6bdb7d-lh7d9   0/1     ImagePullBackOff   0          7m17s

如果看到ErrImagePullBackOffin pod 状态,很可能是由于以下原因。

  1. registry中不存在指定的镜像。
  2. 镜像名称或标签中的拼写错误。
  3. 由于凭据问题,来自给定registry的镜像拉取访问被拒绝。

如果检查 pod 事件,将看到ErrImagePull错误后跟ErrImagePullBackOff。这意味着 kubelet 不再尝试一次又一次地拉取镜像。

kubectl describe pod <pod-name>

错误参考

Warning  Failed     24m (x4 over 25m)    kubelet            Error: ErrImagePull
  Normal   BackOff    23m (x6 over 25m)    kubelet            Back-off pulling image "ngasdinx:latest"
  Warning  Failed     29s (x110 over 25m)  kubelet            Error: ImagePullBackOff

解决错误:InvalidImageName

➜  pods kubectl get pod
NAME                                READY   STATUS             RESTARTS   AGE
nginx-deployment-6f597fc4cd-j86mm   0/1     InvalidImageName   0          7m26s

如果在清单中指定了错误的镜像像 URL,将收到InvalidImageName错误消息。

例如,如果有一个私有容器注册表并且使用 提及镜像名称https,它会抛出InvalidImageName错误。需要指定镜像名称而不https

解决错误:InvalidImageName

如果在镜像名称中有尾部斜杠,将同时遇到InspectFailed&InvalidImageName错误。可以通过描述 pod 来检查它。

解决错误:带有 url 斜杠的 InvalidImageName

错误参考

Warning  InspectFailed  4s (x6 over 42s)  kubelet            Failed to apply default image tag "registry.hub.docker.com/library//nginx:latest": couldn't parse image reference "registry.hub.docker.com/library//nginx:latest": invalid reference format
  Warning  Failed         4s (x6 over 42s)  kubelet            Error: InvalidImageName

排查 RunContainerError

secret-pod     0/1     RunContainerError            0 (9s ago)   12s

Pod Configmap 和 Secret 错误 [CreateContainerConfigError]

CreateContainerConfigError``Configmaps是与Secretspod相关的常见错误之一。

这通常由于两个原因而发生。

  1. 将错误的 configmap 或密钥引用为环境变量
  2. 引用的配置映射不可用

如果描述 pod,将看到以下错误。

Warning  Failed     3s (x2 over 10s)  kubelet     Error: configmap "nginx-config" not found

如果在键名中有拼写错误,将在 pod 事件中看到以下错误。

Warning  Failed     2s  kubelet  Error: couldn't find key service-names in ConfigMap default/nginx-config

为了纠正这个问题,

  1. 确保已创建配置映射。
  2. 确保已将正确的配置映射名称和密钥名称添加到 env 声明中。

让我们看一下正确的例子。这是一个 configmap,其中是service-namepod 内需要作为 env 变量的键。

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
  namespace: default
data:
  service-name: front-end-service

这是使用键 ( service-name) 和配置映射名称 ( nginx-config)的正确 Pod 定义

apiVersion: v1
kind: Pod
metadata:
  name: config-service
spec:
  containers:
    - name: nginx
      image: nginx
      env:
        - name: SERVICE
          valueFrom:
            configMapKeyRef:
              name: nginx-config
              key: service-name