Pod一直处于Pending状态怎么办?
在部署应用时,经常会遇到Pod卡在Pending状态。这时候先别急着删了重来,得先查清楚原因。执行kubectl describe pod <pod-name>,查看Events部分,通常会提示资源不足、节点选择器不匹配或者存储卷挂载失败。
比如你给Pod指定了一个不存在的NodeSelector,那它自然找不到能运行的节点。又或者集群里所有节点的CPU和内存都被占满了,新Pod也就没法调度。解决办法很简单:调整资源配置请求,或者扩容节点。
服务无法通过ClusterIP访问
明明Service创建成功了,但其他Pod却连不上,这种情况挺常见。先确认目标Pod是否正常运行,并且标签(labels)与Service的selector匹配。一个小疏忽,比如label写成了app: nginx-web而Service还在找app: nginx,就会导致服务发现失效。
可以用kubectl get endpoints <service-name>看看Endpoints有没有被正确绑定。如果为空,基本就是标签对不上。
DNS解析失败
微服务之间靠服务名通信,一旦DNS出问题,整个链路就断了。典型表现是Ping服务名不通,但用IP可以。这时候要检查CoreDNS的Pod是否都在运行,有没有异常重启。
也可以进一个Pod里面执行nslookup kubernetes.default测试默认Service能否解析。如果不行,可能是网络插件配置有问题,比如Calico或Flannel没有正确设置Pod网段路由。
滚动更新卡住不动
执行kubectl set image更新镜像后,Deployment看起来没反应,或者只更新了一个Pod就停了。这多半是因为健康检查没通过。新的Pod启动后,livenessProbe或readinessProbe连续失败,Kubernetes就不敢继续推进更新。
打开describe看一下,经常会看到类似“Readiness probe failed”的记录。这时候需要去查容器日志:kubectl logs <new-pod-name>,看是不是应用启动慢、端口没监听对,或者是依赖的服务还没准备好。
持久化存储挂载失败
StatefulSet用PVC挂载数据盘,结果Pod起不来,报错显示VolumeAttachFailed。这个问题在云厂商环境尤其常见,比如阿里云、AWS的EBS卷没能成功挂载到节点上。
首先要确认StorageClass是否存在,PV是否已绑定。如果是动态供给,还要看云账号权限是否允许创建磁盘。有时候节点重启后,老的卷没卸干净,也会导致新挂载失败。这时候可能需要手动清理CSI驱动状态,或者联系云平台支持介入。
节点状态变成NotReady
某个Worker节点突然变红,状态成了NotReady,上面的Pod全被标记为不可用。先ssh登录该节点,看看kubelet有没有在跑:systemctl status kubelet。经常是因为服务器内存耗尽,OOM杀掉了kubelet进程。
也有可能是Docker或containerd出了问题,执行crictl ps看容器运行时是否响应。修复之后重启kubelet,节点通常能自动恢复。但如果长时间不回,Kubernetes可能会触发驱逐,把Pod调度到别的节点上去。
如何调试容器内部问题?
应用报错,但日志看不出细节,这时候最直接的办法是进容器看。使用kubectl exec -it <pod-name> -- sh进入容器,检查配置文件、网络连接、目录权限等。
如果镜像里没有sh或bash(比如Alpine最小镜像),可以用kubectl debug临时启动一个带工具的调试容器。例如:
kubectl debug -it <pod-name> --image=busybox --target=<container-name>这个命令会附加一个带有netstat、ping、telnet等常用工具的容器,方便排查网络和服务状态。