k8s 调试

kubectl debug -it \ rocketmq-console-67bfcb57c8-nlprv \ -n rocketmq \ --image=busybox \ --target=rocketmq-console \ -- /bin/sh 

“PID 看进程,Network 看网卡,IPC 看内存,/proc 是望远镜;
Mount 不共享,所以删文件得先走进 /proc/<pid>/root。”

4. /proc 不是独立 namespace,而是“挂载”+“PID 视角”

  • 因为共享了 PID namespace,内核允许你在 busybox 里访问 /proc/<目标PID>/...
    典型用法:
    复制
    cat /proc/1/environ  # 看目标容器 1 号进程的环境变量
    ls /proc/1/root/app  # 直接浏览目标容器的根文件系统


    创建一个带有完整工具集的边车容器,与业务容器共享进程命名空间和文件系统。

    具体操作步骤

    1. 创建带有工具包的边车容器Pod

    yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: debug-pod-with-sidecar
    spec:
      shareProcessNamespace: true  # 关键:共享进程命名空间
      containers:
      - name: main-app
        image: nginx:alpine  # 你的业务镜像,可能缺少工具
        ports:
        - containerPort: 80
      - name: debug-sidecar
        image: busybox:latest  # 或者使用包含完整工具的镜像
        command: ["sleep"]
        args: ["infinity"]
        resources:
          requests:
            memory: "64Mi"
            cpu: "50m"
          limits:
            memory: "128Mi"
            cpu: "100m"
    1. 通过边车容器调试主容器

    bash
    # 进入边车容器
    kubectl exec -it debug-pod-with-sidecar -c debug-sidecar -- sh
    
    # 在边车容器中查看主容器的进程
    ps aux
    
    # 使用网络工具检查主容器的网络连接
    netstat -tulpn
    nc -zv main-app 80
    
    # 通过共享的 /proc 文件系统查看主容器信息
    cat /proc/1/status  # 查看主容器第一个进程状态
    1. 更强大的工具包边车
      使用包含更全面工具的镜像:

    yaml
    - name: tools-sidecar
      image: nicolaka/netshoot:latest  # 包含网络诊断工具
      # 或者使用 kubectl debug 的默认镜像
      # image: registry.k8s.io/debug:latest
      command: ["sleep"]
      args: ["infinity"]
    使用 nsenter 进入容器命名空间
    方法原理
    直接在节点上通过 nsenter 进入目标容器的 Linux 命名空间,使用宿主机的工具集。
    
    具体操作步骤
    找到目标 Pod 所在的节点和容器 ID
    
    bash
    # 获取 Pod 详细信息
    kubectl get pod <pod-name> -o wide
    
    # 获取容器 ID
    kubectl get pod <pod-name> -o jsonpath='{.status.containerStatuses[0].containerID}'
    # 输出类似: docker://a1b2c3d4e5f6...
    登录到目标节点
    
    bash
    # 如果使用 SSH
    ssh <node-ip-address>
    
    # 或者如果节点在云平台上,可能通过其他方式登录
    使用 nsenter 进入容器命名空间
    
    bash
    # 根据容器ID找到进程PID
    CONTAINER_ID="a1b2c3d4e5f6"  # 从上面获取的实际ID
    PID=$(docker inspect --format '{{.State.Pid}}' $CONTAINER_ID)
    
    # 进入容器的网络命名空间
    nsenter -t $PID -n ip addr show
    nsenter -t $PID -n netstat -tulpn
    nsenter -t $PID -n ss -tulpn
    
    # 进入容器的所有命名空间(类似进入容器内部)
    nsenter -t $PID -m -u -i -n -p sh
    实用的 nsenter 调试命令
    
    bash
    # 网络诊断
    nsenter -t $PID -n tcpdump -i any -w /tmp/debug.pcap
    nsenter -t $PID -n curl -v http://localhost:8080
    
    # 进程诊断
    nsenter -t $PID -p ps aux
    nsenter -t $PID -p lsof -p 1
    
    # 文件系统检查(需要挂载命名空间)
    nsenter -t $PID -m ls -la /app/logs
    nsenter -t $PID -m cat /etc/hosts
    
    # 使用宿主机的strace调试容器内进程
    nsenter -t $PID -p strace -p 1

     




posted @ 2025-11-21 11:06  滴滴滴  阅读(8)  评论(0)    收藏  举报