① 背景
② 三种解决策略
最常见: 镜像为了保持'精简化',没有安装'网络'命令,缺少必要的'基础网络软件'
③ pod_id和container_id关系
细节: 一个pod内可以有'多个容器',意味者可以有'多个容器id'
说明: docker ps 默认'容器id'只有前'12'位
案例: 这里假定'只有'一个'容器id'
附加: 贴出'命令'是为了帮助我们后续'自动化'
需求1: 根据'container_name'或'container_id'获取Pid
docker inspect -f {{.State.Pid}} nginx
需求2: 根据'pod_name'精确地获取 'containerID'
kubectl get pod pod_name -o template \
--template='{{range .status.containerStatuses}}{{.containerID}}{{end}}'
docker://cf0873782d587dbca6aa32f49605229da3748600a9926e85b36916141597ec85
上下图对比挖掘的信息 调试容器网络
获取'hostIP'目的: 登录容器'所在的宿主机'执行docker命令,获取到容器所在'宿主机对应的Pid'
④ nsenter简介
nsenter 是一个 'linux 命令行'工具,作用是可以进入linux系统下'某个进程'的'命令空间'
⑤ nsenter 为什么可以起作用
⑥ 案例演示
强调: 我们可以充分利用'容器所在宿主机'的'所有命令',不只是'网络命令'
假设: 获取'宿主机ip [172.25.2.100]'和'container_id',见'上面'案例
常见场景: 使用'宿主机的命令'调试'容器网络'
1) 指定'进程号PID'以及需要进入的'命名空间'后
2) nsenter会帮我们找到对应的命名空间'文件描述符/proc/PID/ns/FD'
见上:/proc/13957/ns/net
3) 然后使用'该命名空间'运行'新'的程序
对比: 'tcpdump案例'
案例: '非交互'方式
linux网络命名空间
遗留: 可以通过什么'命名空间'可以利用'宿主机的命令'下载文件到'容器'中吗?
使用 nsenter 调试容器网络
遗留: K8S 环境下 Pod 网络调试工具 kubectl-debug
容器网络不通要如何调试