1、简介
netshoot是一款开源的容器网络诊断工具,本质上是一个容器,里面默认安装了一些常用网络诊断工具,如tcpdump、netstat等,被称为网络排障瑞士军刀容器。
众所周知,容器下网络空间是相互隔离的,与宿主机的网络空间也是隔离的,往往需要通过工具进入容器空间排查问题,但是业务容器不一定安装了常见的调试工具,netshoot在这样的场景提供了很大的便利。
2、特点
提供了“瑞士军刀”式的开箱即用的工具箱,包括各类网络诊断工具。
通过与业务容器共享网络命名空间,可以不重启、“不侵入”业务容器,对容器网络进行调试排错。
K8s环境下pod中的容器共享网络命名空间,netshoot可以以sidecard对业务容器进行排错。

3、netshoot镜像构成

netshoot代码比较少,核心代码就是这样一个dockerfile,可以看到里面安装了很多的工具,与另一款Linux系统瑞士军刀busybox不同,netshoot主要关注在网络工具。
4、Docker下网络排障
启动容器
# 调试某个容器网络
docker run -it --net container:<container_name> nicolaka/netshoot
# 调试宿主机网络
docker run -it --net host nicolaka/netshoot
Docker Compose
version: "3.6"
services:
tcpdump:
image: docker.io/nicolaka/netshoot
depends_on:
- nginx
command: tcpdump -i eth0 -w data/nginx.pcap
network_mode: service:nginx
volumes:
- $PWD/data:/data
nginx:
image: nginx:alpine
ports:
- 80:80
5、Kubernetes下网络排障
启动pod
# 临时容器
kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot
# 在宿主机网络下
kubectl run tmp-shell --rm -i --tty --overrides='{"spec": {"hostNetwork": true}}' --image nicolaka/netshoot
Kubernetes Yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: netshoot
name: netshoot
spec:
replicas: 1
selector:
matchLabels:
app: netshoot
template:
metadata:
labels:
app: netshoot
spec:
containers:
- image: docker.io/nicolaka/netshoot
name: netshoot
args:
- bin/bash
- -c
- >
while :; do
echo "[$(date +%F\ %T)] hello"
sleep 1
done
6、总结
简单却流行:netshoot实现原理虽然比较简单,包了一些网络工具,但却也有不少的Star数。同时,另一个K8s环境下的排障工具kubectl-debug也借助netshoot进行pod的诊断调试。
纯手工操作:对于喜欢手动操作的人来说,netshoot确实像瑞士军刀一样方便,手到擒来。遇到问题,直接进入容器进行调试,方便快捷。
与可观测性系统对比:可观测性通过白盒的方式,让业务暴露自身的状态指标,来进行健康状态的诊断,同时对于指标可以进行一些智能化的监控告警;站在使用者的角度,可观测性系统可以将错误异常推送过来,是一种被动发现的机制,可以减轻使用者的负担,从这个角度看,netshoot更像是一种主动诊断的机制。
主流产品:在netshoot中一个issue提到将几个月前刚开源的eBPF工具eCapture(通过ePBF技术获取TLS加密的明文捕获)加入到工具集中,可以看出netshoot生命力还是比较旺盛。
欢迎大家扫码关注:

本公众号只写原创,不接广告、不接广告、不接广告。下期小伙伴想学习什么技术,可以私信发我吆。





