【问题小解决】提供一个直接进入Pod网络命名空间的Shell脚本
我们使用 Kubernetes 时难免发生一些网络问题,往往需要进入容器的网络命名空间 (netns) 中,进行一些网络调试来定位问题,这里直接提供一个脚本,申请各种步骤
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 #!/bin/bash # 函数:进入网络命名空间并进行调试 enter_netns() { local pod_name=$1 local namespace=$2 local container_name=$3 # 获取指定 Pod 中指定容器的容器 ID container_id=$(kubectl -n $namespace get pod $pod_name -o jsonpath="{.status.containerStatuses[?(@.name==\"$container_name\")].containerID}" | sed 's|containerd://||') if [ -z "$container_id" ]; then echo "未找到 Pod $pod_name 中容器 $container_name 在命名空间 $namespace 中的容器 ID" exit 1 fi # 获取容器进程的 PID pid=$(crictl inspect $container_id | grep -i '"pid"' | head -n 1 | awk '{print $2}' | sed 's/,//') if [ -z "$pid" ]; then echo "未找到容器 $container_id 的 PID" exit 1 fi # 进入容器的网络命名空间 echo "进入 Pod $pod_name 中容器 $container_name 的网络命名空间,PID 为 $pid" nsenter -n --target $pid } # 检查是否提供了必要的参数 if [ $# -ne 3 ]; then echo "用法: $0 <pod_name> <namespace> <container_name>" exit 1 fi # 调用函数进入网络命名空间 enter_netns $1 $2 $3 调试网络 成功进入容器的 netns,可以使用节点上的网络工具进行调试网络,可以首先使用ip a验证下 ip 地址是否为 pod ip: