k8s网络之(一)如何调试容器网络 nsenter

①  背景

②  三种解决策略

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

③  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系统下'某个进程'的'命令空间'

扫描二维码关注公众号,回复: 16523570 查看本文章

⑤ 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

容器网络不通要如何调试

猜你喜欢

转载自blog.csdn.net/wzj_110/article/details/131818823
今日推荐