为了减少容器的 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调试运行中的 PodK8S-Debug 工具也是利用了 namespace 的原理,但是对 k8s 的版本有一定限制,官方一直没有 release。
安全隐患通过 ns 原理,我们在宿主机可以访问所有容器信息,甚至不需要 ssh,exec 等命令,这就存在了一定的安全隐患。基于云厂商的 k8s 服务,未来的趋势肯定也是要解决这个隐患。更轻量、更安全是整个行业的趋势。目前有这么几种方案,解决这一问题,业界也在努力中:
基于虚拟化的机密计算:TDX 、SEV 、PEF。
镜像功能卸载:主机上看不到容器镜像。
远程认证:确保运行在机密环境中。
评论