一、什么是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即可。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐