k8s网络之(一)如何调试容器网络 nsenter
pod_id和container_id关系。
·
① 背景

② 三种解决策略
最常见: 镜像为了保持'精简化',没有安装'网络'命令,缺少必要的'基础网络软件'

③ 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系统下'某个进程'的'命令空间'
场景: 无法登陆'master'节点,但还要进入'容器',所以只能在worker节点通过'nsenter'进入容器中
![]()

⑤ nsenter 为什么可以起作用

⑥ 案例演示
强调: 我们可以充分利用'容器所在宿主机'的'所有命令',不只是'网络命令'
假设: 获取'宿主机ip [172.25.2.100]'和'container_id',见'上面'案例
常见场景: 使用'宿主机的命令'调试'容器网络'
细节: nsenter -n -t pid --> 进入'容器'的网络命名空间,但是可以使用'宿主机'的网络工具

1) 指定'进程号PID'以及需要进入的'命名空间'后
2) nsenter会帮我们找到对应的命名空间'文件描述符/proc/PID/ns/FD'
见上:/proc/13957/ns/net
3) 然后使用'该命名空间'运行'新'的程序
对比: 'tcpdump案例'
案例: '非交互'方式
遗留: 可以通过什么'命名空间'可以利用'宿主机的命令'下载文件到'容器'中吗?
更多推荐



所有评论(0)