下面将介绍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 错误。
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 的容器无法成功启动。 |
ErrKillContainer | pod 的容器都没有被成功杀死。 |
ErrCrashLoopBackOff | 容器已终止。kubelet 不会尝试重启它。 |
ErrVerifyNonRoot | 容器或映像试图以 root 权限运行。 |
ErrCreatePodSandbox | Pod 沙箱创建未成功。 |
ErrConfigPodSandbox | 未获取 Pod 沙盒配置。 |
ErrKillPodSandbox | Pod 沙箱未成功停止。 |
ErrSetupNetwork | 网络初始化失败。 |
ErrTeardownNetwork |
现在让我们看看一些最常见的 pod 错误以及如何调试它们。
ErrImagePullBackOff 疑难解答
➜ pods kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-599d6bdb7d-lh7d9 0/1 ImagePullBackOff 0 7m17s
如果看到ErrImagePullBackOffin pod 状态,很可能是由于以下原因。
- registry中不存在指定的镜像。
- 镜像名称或标签中的拼写错误。
- 由于凭据问题,来自给定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
如果在镜像名称中有尾部斜杠,将同时遇到InspectFailed&InvalidImageName错误。可以通过描述 pod 来检查它。
错误参考
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相关的常见错误之一。
这通常由于两个原因而发生。
- 将错误的 configmap 或密钥引用为环境变量
- 引用的配置映射不可用
如果描述 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
为了纠正这个问题,
- 确保已创建配置映射。
- 确保已将正确的配置映射名称和密钥名称添加到 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