布景

  笔者观察到一些小伙伴不会排查容器问题—例如某个容器A到另一个服务的网络联通问题,小伙伴都寄希望于在容器A中有例如ping,tcpdump等这些排查指令。

  可是,假如咱们把这些指令预装进容器中就违背了容器规划的初衷,容器应该尽量精简,轻便,能在出产环境中占用最小资源并快速启动。因而本文介绍在容器中没有扫除指令时进行问题的排查,这就用到了nsenter这个指令~

问题排查及原理

1、获取容器的id,登录到这个容器所在的宿主机k8s-node-02

用nsenter排查容器网络问题及原理
2、在宿主机上获取容器的Pid
用nsenter排查容器网络问题及原理
3、nsenter -t [Pid] -n,进入容器网络,此刻,能够用宿主机的排查指令进行排查,其等同于在容器里执行。
用nsenter排查容器网络问题及原理

这条指令背面的原理:

A、容器的实质是进程,这个进程用linux的namespace机制实现资源的阻隔,其包括6类namespace——-network namespace(网络资源)、mount namespace(文件体系挂载点)、uts namespace(主机名和域名)、ipc namespace(共享内存和信号量)、pid namspace(进程ID)、user namespace(用户和用户组);同时、操作体系运用cgroup对进程运用的CPU,IO,内存等进行限额。这样,容器看起来就是拥有自己完好的单独的操作体系。

B、nsenter 是一个能够进入上述6类namespace的东西。上述指令 nsenter -t [Pid] -n ,其中 -t 指定了容器进程的ID, -n 代表进入容器进程的network namespace,此刻,当时已经是在容器的网络里。可是咱们并没有进入容器进程的其他namespace,比如文件体系等,所以当时的文件体系仍是处于宿主机的mountnamespace里,因而咱们能够用宿主机的指令来排查容器的网络问题。

本大众号【程序员是只喵】