问题描述
该笔记将记录:在 Kubernetes 中,常见 Pod 问题排查方法,以及相关问题的处理方法。
解决方案
关于 Pod 调试,分为两种场景:
1)Pod 还未运行,即创建 Pod 失败,或者处于 Waiting Pending 等等状态;
2)Pod 成功创建,但是 Pod 的容器运行失败;
TODO ! Pod Probe 是如何运行的,Master Fail 是否会影响探针执行?
排查创建失败的 Pod 实例
这里“创建失败”是指 Pod 处于 Pending Waiting 等等状态。
kubectl describe / kubectl get -o yaml
# kubectl describe pod nginx-deployment-1006230814-6winp ... 我们需要关注 Events 字段: 1)相同的信息被压缩在一起,作为同种类型; 2)FirstSeen 表示首次看到这种消息的时间; 3)LastSeen 表示最后看到这种消息的时间; # kubectl get pod nginx-deployment-1006230814-6winp -o yaml ... 将显示更多关于 Pod 的信息
排查运行的 Pod 实例
查看容器日志
kubectl logs ${POD_NAME} ${CONTAINER_NAME} # 前个容器的日志 # 这要求以退出容器存在,即未被清理(通过 docker ps -a 可见) kubectl logs --previous ${POD_NAME} ${CONTAINER_NAME}
到容器中执行命令
通过在容器中执行命令,以排查相关问题:
kubectl exec ${POD_NAME} -c ${CONTAINER_NAME} -- ${CMD} ${ARG1} ${ARG2} ... ${ARGN}
使用临时调试容器
某些容器使用 distroless images,这些镜像里除了二进制程序外不包含任何命令。此时,我们能够使用 kubectl debug 为 Pod 添加临时调试容器,我们能够使用任何镜像来启动该调试容器。
注意事项:集群要启用 EphemeralContainers feature gate 并且 kubectl v1.18+ 版本
在 ephemeral-demo Pod 中,附加临时调试容器:
# kubectl debug -it "ephemeral-demo" --image=busybox --target=ephemeral-demo Defaulting debug container name to debugger-8xzrl. If you don't see a command prompt, try pressing enter. / # # kubectl alpha debug -n ingress-nginx -it ingress-nginx-controller-cdfb85746-5qqlp \ --image=corfr/tcpdump --target=ingress-nginx-controller-cdfb85746-5qqlp error: ephemeral containers are disabled for this cluster (error from server: "the server could not find the requested resource").
附加说明:
1)选项 –target= 是为了共享进程命名空间。如果 Container Runtime 不支持共享进程命名空间,则调试容器无法启动。
2)鉴于我们的 1.18 版本, debug 命令处于 alpha 状态,所以使用 kubectl alpha debug 命令;
3)集群未启用 EphemeralContainers feature gate 才出现错误。
其他创建临时 Pod 的方法:
# 复制已有 Pod 配置 kubectl debug myapp -it --image=ubuntu --share-processes --copy-to=myapp-debug # 复制已有 Pod 配置,并修改其启动命令 kubectl debug myapp -it --copy-to=myapp-debug --container=myapp -- sh # 复制已有 Pod 配置,并修改其镜像 kubectl debug myapp --copy-to=myapp-debug --set-image=*=ubuntu # 创建运行在节点命名空间的 Pod 资源 kubectl debug node/mynode -it --image=ubuntu
相关链接
Pod 各种状态及可能原因:Debug Pods and ReplicationControllers | Kubernetes
参考文献
Debug Running Pods | Kubernetes
Application Introspection and Debugging | Kubernetes