k8s中无法进入指定的容器排障

Kubernetes排障实录:为什么我死活进不去容器?

作为Kubernetes老司机,你一定遇到过这样的抓狂时刻:想要调试容器,但kubectl exec死活进不去! 别慌,这篇实战指南帮你快速定位问题,覆盖生产环境中90%的进不去容器的疑难杂症!


一、先看门面:Pod状态正常吗?

排查口诀:先看状态再动手

  1. 基础检查命令:

    kubectl get pods -o wide         # 查看Pod状态和所在节点
    kubectl describe pod [pod-name]  # 查看Pod详细事件(关键!)
    kubectl logs [pod-name]          # 查看实时日志
    kubectl logs [pod-name] --previous  # 查看前一个容器的日志(崩溃后必看)
    
  2. 典型异常状态处理:

    • Pending状态:资源不足、镜像拉取失败(重点看Events中的Warning信息)
    • CrashLoopBackOff:容器反复崩溃(用--previous看崩溃前日志)
    • NodeLost/Unhealthy:节点故障(检查节点kubelet状态:systemctl status kubelet

二、权限问题:你被关在门外了吗?

生产环境高频坑点:

  1. RBAC权限不足:

    • 现象:执行exec时提示ForbiddenUnauthorized
    • 快速验证:让集群管理员执行以下命令
      kubectl auth can-i exec pods --as system:serviceaccount:[namespace]:[serviceaccount-name]
      
    • 解决方案:在Role/RoleBinding中添加pods/exec权限
  2. Pod安全策略拦截(PSP):

    • 常见限制:禁止特权容器、限制宿主机目录挂载
    • 应急排查:临时禁用PSP验证(仅限调试,生产慎用!)
      kube-apiserver --disable-admission-plugins=PodSecurityPolicy
      

三、网络迷踪:你的请求去哪了?

生产级网络排查技巧:

  1. 跨节点访问检查:

    # 在Pod所在节点执行
    curl -v telnet://[目标PodIP]:[端口]
    nc -zv [目标PodIP] [端口]
    
  2. CNI插件诊断:

    • Calico:检查calico-node Pod状态
      calicoctl node status
      
    • Flannel:查看/run/flannel/subnet.env配置
  3. 防火墙特别关注:

    • NodePort范围(默认30000-32767)
    • 主机防火墙(iptables/nftables)
    • 云厂商安全组(重点检查入站规则)

四、容器自身:你以为的shell其实不存在

经典踩坑场景:

  1. 没有shell的极简镜像:

    • 典型镜像:scratchalpine(默认没有bash)
    • 应急进入方法:
      kubectl exec -it [pod-name] -- sh  # Alpine镜像用sh
      kubectl exec -it [pod-name] -- /busybox/sh  # 极特殊情况
      
  2. 文件系统只读:

    • 检查点:securityContext.readOnlyRootFilesystem=true
    • 绕过方法(仅调试用):
      securityContext:
        readOnlyRootFilesystem: false
      

五、高阶疑难:这些坑只有老司机懂

  1. Terminated状态残留:

    • 现象:Pod显示Running但容器已终止
    • 必杀技:
      docker ps -a | grep [container-id]  # 查看容器退出码
      journalctl -u kubelet -f           # 查看kubelet日志
      
  2. Ephemeral Containers调试术(v1.23+):

    kubectl debug [pod-name] -it --image=busybox --target=[目标容器]
    
  3. 节点资源枯竭:

    • 检查命令:
      df -h                  # 磁盘空间
      free -h                # 内存
      top                    # CPU
      docker info | grep Space  # Docker存储空间
      

六、终极武器:故障排查流程图

是否Pod Running? → 否 → kubectl describe找原因
               ↓是
是否有exec权限? → 否 → 检查RBAC/ServiceAccount
               ↓是
容器内有无shell? → 无 → 使用debug容器或修改镜像
               ↓有
节点网络是否通? → 否 → 检查CNI/防火墙
               ↓是
检查kubelet日志 → 发现容器启动失败 → 检查镜像/资源限制

记住:遇到问题先看Events日志!80%的问题都能通过kubectl describe找到线索。 希望这篇实战指南能让你在下次遇到"进不去容器"的问题时,快速定位问题,早日下班!

posted on 2025-03-20 09:28  Leo-Yide  阅读(174)  评论(0)    收藏  举报