k8s容器的调试利器-nsenter
Nsenter是一个命令行工具,可以让我们进入一个运行中的容器内部。当使用Docker/Contained运行一个容器时,容器内部就像是一个隔离的虚拟机环境,你需要通过命令行进入容器内部来进行管理和操作。通过Nsenter命令,可以使用容器内部的Shell或其它工具,就像在本地主机上执行命令一样方便。
·
一、什么是nsenter
Nsenter是一个命令行工具,可以让我们进入一个运行中的容器内部。当使用Docker/Contained运行一个容器时,容器内部就像是一个隔离的虚拟机环境,你需要通过命令行进入容器内部来进行管理和操作。通过Nsenter命令,可以使用容器内部的Shell或其它工具,就像在本地主机上执行命令一样方便。
二、什么场景能用到
一个最典型的用途就是进入容器的网络命令空间。
k8s环境中,常常会需要在容器内部debug,但是相当多的容器为了轻量级,并不是都包含所需的工具软件,比如curl,wget,ifconfig,tcpdump等,这就让人很抓狂了。
三、支持的参数有哪些
四、具体应该怎么用
比如我们在宿主机vm12上,pod名为tomcat-test-7c7d55d66c-zthvr,查到他的pid为773068
[root@vm12 ~]# kubectl get pod -n default -owide|grep tomcat
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomcat-test-7c7d55d66c-zthvr 1/1 Running 0 45d 172.24.189.75 vm12 <none> <none>
[root@vm12 ~]# crictl ps
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID
09bc7c51f6ada 81cd9536b1e67 46 hours ago Running tomcat 0 02b112885b84c
[root@vm12 ~]# crictl inspect 09bc7c51f6ada |grep -i pid
"pid": 773068,
"pid": 1
"type": "pid"
4.1、直接命令执行Host主机上的各种命令行
进入该pid的网络命名空间的同时,获取pod的IPv4地址
[root@vm12 ~]# nsenter -t 773068 -n ip -4 add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
4: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc noqueue state UP group default link-netnsid 0
inet 172.24.189.75/32 scope global eth0
valid_lft forever preferred_lft forever
4.2、进入交互模式,默认执行[当前bash]
[root@vm12 ~]# kubectl exec -it tomcat-test-7c7d55d66c-smff9 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
bash-4.4# tcpdump -h
bash: tcpdump: command not found
从以上返回结果,首先可以确定pod内部没有安装tcpdump这个软件包的。
但是我们可以直接进到“目标视角”里面去,进行交互式执行cli
[root@vm12 ~]# nsenter -t 773068 -n
#这个时候就已经进入到交互模式了,再次执行tcpdump命令
[root@vm-2-k8s2 ~]# tcpdump -h
tcpdump version 4.9.2
libpcap version 1.5.3
OpenSSL 1.0.2k-fips 26 Jan 2017
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
[ -Q|-P in|out|inout ]
[ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
[ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
[ -Z user ] [ expression ]
可以看到,所有的网络相关的命令行都可以执行(宿主机有的)。
想要退出的话,exit即可。
更多推荐
已为社区贡献33条内容
所有评论(0)