「Kubernetes」- 排查 POD 问题、排查技巧

  CREATED BY JENKINSBOT

问题描述

该笔记将记录:在 Kubernetes 中,常见 Pod 问题排查方法,以及相关问题的处理方法。

解决方案

关于 Pod 调试,分为两种场景:
1)Pod 还未运行,即创建 Pod 失败,或者处于 Waiting Pending 等等状态;
2)Pod 成功创建,但是 Pod 的容器运行失败;

排查创建失败的 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 的信息

kubectl get events

# kubectl get events --namespace=my-namespace

排查运行的 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