Kubernetes 排错之 Pod 异常
本章介绍 Pod 运行异常的排错方法。
一般来说,无论 Pod 处于什么异常状态,都可以执行以下命令来查看 Pod 的状态
-
kubectl get pod <pod-name> -o yaml
查看 Pod 的配置是否正确 -
kubectl describe pod <pod-name>
查看 Pod 的事件 -
kubectl logs <pod-name> [-c <container-name>]
查看容器日志
这些事件和日志通常都会有助于排查 Pod 发生的问题。
Pod 一直处于 Pending 状态
Pending 说明 Pod 还没有调度到某个 Node 上面。可以通过
kubectl describe pod <pod-name>
命令查看到当前 Pod 的事件,进而判断为什么没有调度。可能的原因包括
- 资源不足,集群内所有的 Node 都不满足该 Pod 请求的 CPU、内存、GPU 等资源
- HostPort 已被占用,通常推荐使用 Service 对外开放服务端口
Pod 一直处于 Waiting 或 ContainerCreating 状态
首先还是通过
kubectl describe pod <pod-name>
命令查看到当前 Pod 的事件。可能的原因包括
- 镜像拉取失败,比如
- 配置了错误的镜像
-
Kubelet 无法访问镜像(国内环境访问
gcr.io
需要特殊处理) - 私有镜像的密钥配置错误
-
镜像太大,拉取超时(可以适当调整 kubelet 的
--image-pull-progress-deadline
和--runtime-request-timeout
选项)
- CNI 网络错误,一般需要检查 CNI 网络插件的配置,比如
- 无法配置 Pod 网络
- 无法分配 IP 地址
- 容器无法启动,需要检查是否打包了正确的镜像或者是否配置了正确的容器参数
Pod 处于 ImagePullBackOff 状态
这通常是镜像名称配置错误或者私有镜像的密钥配置错误导致。这种情况可以使用
docker pull <image>
来验证镜像是否可以正常拉取。
如果是私有镜像,需要首先创建一个 docker-registry 类型的 Secret
kubectl create secret docker-registry my-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
然后在容器中引用这个 Secret
spec:
containers:
- name: private-reg-container