
Kubernetes作为云原生时代的操作系统,其复杂性也给开发者带来了调试挑战。本文将介绍10个实用的Kubernetes调试技巧,涵盖网络、日志、容器和API等多个方面,帮助更高效地诊断和解决集群中的问题。
场景:当需要在本地开发环境中测试与Pod的交互,或者需要从其他设备访问Pod服务时。
# 将Pod的80端口转发到本地8080端口,并监听所有网络接口
kubectl port-forward --address 0.0.0.0 pod/my-web-app 8080:80说明:
场景:当运行中的Pod缺少必要的调试工具(如基于distroless或scratch构建的镜像)时。
# 向运行中的Pod注入一个临时调试容器
kubectl debug pod/my-app-pod \
--image=nicolaka/netshoot \
--target=main-container \
--name=debug-toolbox \
-- /bin/bash说明:
场景:当Pod频繁崩溃难以实时调试时,可创建稳定副本进行事后分析。
# 克隆故障Pod并保持运行状态
kubectl debug pod/crashing-pod \
--copy-to=debug-pod \
--image=busybox \
-- /bin/sh -c "while true; do sleep 3600; done"说明:
场景:当容器因故障重启后,需要查看崩溃前的日志时。
# 查看容器前一次运行的日志
kubectl logs pod/my-app -c main-container --previous
# 查看最近5次重启的日志
for i in {1..5}; do
echo "=== Restart $i ==="
kubectl logs pod/my-app -c main-container --previous --tail=100
done说明:
场景:当需要排查Pod网络连接问题时。
# 检查容器内网络连接
kubectl exec -it network-problem-pod -- nsenter -t 1 -n ss -tulnp
# 查看容器路由表
kubectl exec -it network-problem-pod -- ip route show table all
# 测试DNS解析
kubectl exec -it network-problem-pod -- dig +short kubernetes.default.svc.cluster.local说明:
场景:当控制器或Operator遇到API权限问题时。
# 启动API代理
kubectl proxy --port=8080 &
# 重放失败的API请求
curl -X GET \
" http://localhost:8080/apis/apps/v1/namespaces/default/deployments " \
-H "Authorization: Bearer $(kubectl get secrets -o jsonpath='{.items[?(@.metadata.annotations.kubernetes\.io/service-account\.name=="default")].data.token}' | base64 --decode)"说明:
场景:当需要监控集群状态变化或Pod异常时。
# 监控特定Pod的事件
kubectl get events --field-selector involvedObject.name=problem-pod --watch
# 监控命名空间下所有Pod的重启次数
watch -n 2 'kubectl get pods -n production -o=custom-columns=NAME:.metadata.name,RESTARTS:.status.containerStatuses[0].restartCount'说明:
场景:当需要诊断Pod性能问题或资源不足时。
# 查看Pod资源使用指标
kubectl top pod my-app-pod --containers
# 监控Pod的CPU/内存使用率
kubectl metrics pod my-app-pod --watch
# 检查Pod的资源限制和请求
kubectl get pod my-app-pod -o json | jq '.spec.containers[].resources'说明:
场景:当需要比较运行配置与期望配置时。
# 比较运行中的Deployment与清单文件
kubectl diff -f deployment.yaml
# 获取Pod的当前配置并保存
kubectl get pod my-pod -o yaml > current.yaml
# 与原始配置比较
diff original.yaml current.yaml说明:
场景:当需要调试Job或CronJob问题时。
# 从CronJob创建一次性调试Job
kubectl create job debug-job --from=cronjob/my-cronjob
# 向Job Pod注入调试容器
kubectl debug job/debug-job \
--image=busybox \
--target=main-container \
-- /bin/sh说明:
掌握Kubernetes调试技巧可以显著提高问题诊断效率。从网络诊断到日志分析,从资源监控到配置比较,每个技巧都针对特定的调试场景。将这些方法纳入的Kubernetes运维工具箱,根据实际问题灵活组合使用。
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!