netshoot介绍
netshoot是一款开源的容器网络诊断工具,本质上是一个容器,里面默认安装了一些常用网络诊断工具,如tcpdump、netstat等,被称为网络排障瑞士军刀容器。
众所周知,容器下网络空间是相互隔离的,与宿主机的网络空间也是隔离的,往往需要通过工具进入容器空间排查问题,但是业务容器不一定安装了常见的调试工具,netshoot在这样的场景提供了很大的便利。
提供了“瑞士军刀”式的开箱即用的工具箱,包括各类网络诊断工具。
通过与业务容器共享网络命名空间,可以不重启、“不侵入”业务容器,对容器网络进行调试排错。
K8s环境下pod中的容器共享网络命名空间,netshoot可以以sidecard对业务容器进行排错。
容器网络介绍
首先来简单介绍容器网络,容器本质是进程,通过Cgroup来进行资源限制、通过Namespace来进行隔离,容器网络也是通过给不同的容器创建不同的网络命名空间来进行隔离。
宿主机通过Linux veth pair和docker0网桥来建立与容器的通信,同宿容器主机通信和不同主机容器通信都可以进行通信,也是K8s环境下各种Overlay网络实现的基础。
不同的网络命名空间下都可以有自己的网络设备、路由表、协议栈、IPtable等。相互之间都是隔离的。直接在容器外围对容器网络进行排障往往不够直接,比较简单的方式就是直接进入到容器的网络空间,在容器的网络空间中,可以使用之前主机上的各类网络工具对容器的网络进行调试。
netshoot镜像构成
netshoot代码比较少,核心代码就是这样一个dockerfile,可以看到里面安装了很多的工具,与另一款Linux系统瑞士军刀busybox不同,netshoot主要关注在网络工具。
netshoot的工具选择策略
网络问题往往会影响到应用的性能,常见的网络问题包括延迟、路由、DNS解析、防火墙等。netshoot以此为出发点,选择的网络相关的工具很大部分参考性能观测工具集。
netshoot使用方式
netshoot的使用场景主要包括docker、DockerCompose、K8s等场景。
docker环境下netshoot可以通过docker的共享网络参数与容器网络命名空间共享。
Docker下网络排障
# 调试某个容器网络
docker run -it --net container:<container_name> nicolaka/netshoot
# 调试宿主机网络
docker run -it --net host nicolaka/netshoot
--net是docker运行时的参数,主要包括none、bridge、host、container等,表示容器启动时网络配置,其中:
none:表示关闭容器的网络,容器将不能进行通信。
bridge:表示通过veth接口进行网络配置,是容器与外界通信的最常见方式,示意图见上方容器网络介绍
host:表示容器使用主机网络,netshoot通过这种方式来对主机的网络进行排障。
container:表示复用另一个容器的网络,netshoot也是通过这种方式对其他容器的网络进行排障。
用法举例:如nestat、nmap等,更多的示例和用法可以参考github。
Docker Compose
docker compose中netshoot容器是通过networker_mode: service:nginx与nginx容器进行网络共享,从而实现对nginx容器的网络抓包。
Kubernetes
K8s环境中,通过创建临时容器的方式来调试
# 临时容器
kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot
# 在宿主机网络下
kubectl run tmp-shell --rm -i --tty --overrides='{"spec": {"hostNetwork": true}}' --image nicolaka/netshoot
通过sidecar方式部署,基于K8s下pod中的容器间天生共享网络命名空间。
总结
简单却流行:netshoot实现原理虽然比较简单,包了一些网络工具,但却也有不少的Star数。同时,另一个K8s环境下的排障工具kubectl-debug也借助netshoot进行pod的诊断调试。
纯手工操作:对于喜欢手动操作的人来说,netshoot确实像瑞士军刀一样方便,手到擒来。遇到问题,直接进入容器进行调试,方便快捷。
与可观测性系统对比:可观测性通过白盒的方式,让业务暴露自身的状态指标,来进行健康状态的诊断,同时对于指标可以进行一些智能化的监控告警;站在使用者的角度,可观测性系统可以将错误异常推送过来,是一种被动发现的机制,可以减轻使用者的负担,从这个角度看,netshoot更像是一种主动诊断的机制。
还在流行:在netshoot中一个issue提到将几个月前刚开源的eBPF工具eCapture(通过ePBF技术获取TLS加密的明文捕获)加入到工具集中,可以看出netshoot生命力还是比较旺盛。
参考
https://github.com/nicolaka/netshoot