为了减少容器的size,通常不会在容器中集成很多的调试工具。如果需要进入容器环境调试,可以通过主机上的nsenter进入容器的namespace进行调试。
- 首先找到容器中运行进程的pid。
- 进入pid所对应的namespace。
进入容器的命名空间
# 进入 12688 进程的网络命名空间
[root@test1-cluster-34867 ~]# nsenter -t 12688 --net
# 在网络命名空间查看的 ip 情况 【只有 2个网卡】
[root@test1-cluster-34867 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.19.3.70 netmask 255.255.0.0 broadcast 0.0.0.0
ether fa:16:3e:3b:0c:4d txqueuelen 0 (Ethernet)
RX packets 65333 bytes 73376361 (69.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 60041 bytes 11472220 (10.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 4 bytes 200 (200.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4 bytes 200 (200.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 退出命名空间后,再查看网络,发现是宿主机的网络信息了,比较多就没展示
[root@test1-cluster-34867 ~]# exit
logout
# 进入进程的多个命名空间
nsenter -t 12688 --uts --ipc --net --pid
需要注意的是,并不是所有资源都有被namespace隔离,例如:SELinux、time、syslog。此外,namespace的隔离也是不全面的,比如/proc、/sys、/dev/sd*没有完全隔离。
在容器里面执行top
在容器里面执行free -h
上面的命令可以看出,容器里面展示的cpu、memory利用率都是宿主机的,因为top、free主要读取/proc、/sys中的数据。
Docker的设计者也意识到这样确实存在很大不便,于是从Docker1.8版本以后将分配给容器的cgroup资源挂载到容器内,可以直接在容器内部查看到cgroup资源隔离情况。
# 查看容器核数,除100000
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
# 获取内存使用
cat /sys/fs/cgroup/memory/memory.usage_in_bytes
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
# 注意这里已经使用的内存usage_in_bytes是包含cache的,详细的情况可以从/sys/fs/cgroup/memory/memory.stat中获取
# 查看容器是否设置oom,oom_kill_disable默认为0表示开启
cat /sys/fs/cgroup/memory/memory.oom_control
# 获取磁盘io
cat /sys/fs/cgroup/blkio/blkio.throttle.io_service_bytes
# 获取网卡出入流量
cat /sys/class/net/eth0/statistics/rx_bytes
cat /sys/class/net/eth0/statistics/tx_bytes
K8S-Debug
调试运行中的 Pod
K8S-Debug工具也是利用了namespace的原理,但是对 k8s的版本有一定限制,官方一直没有release。
安全隐患
通过ns原理,我们在宿主机可以访问所有容器信息,甚至不需要ssh,exec等命令,这就存在了一定的安全隐患。基于云厂商的k8s服务,未来的趋势肯定也是要解决这个隐患。更轻量、更安全是整个行业的趋势。目前有这么几种方案,解决这一问题,业界也在努力中:
- 基于虚拟化的机密计算:TDX 、SEV 、PEF。
- 镜像功能卸载:主机上看不到容器镜像。
- 远程认证:确保运行在机密环境中。