为了减少容器的size,通常不会在容器中集成很多的调试工具。如果需要进入容器环境调试,可以通过主机上的nsenter进入容器的namespace进行调试。

    1. 首先找到容器中运行进程的pid。
    2. 进入pid所对应的namespace。

    进入容器的命名空间

    1. # 进入 12688 进程的网络命名空间
    2. [root@test1-cluster-34867 ~]# nsenter -t 12688 --net
    3. # 在网络命名空间查看的 ip 情况 【只有 2个网卡】
    4. [root@test1-cluster-34867 ~]# ifconfig
    5. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
    6. inet 172.19.3.70 netmask 255.255.0.0 broadcast 0.0.0.0
    7. ether fa:16:3e:3b:0c:4d txqueuelen 0 (Ethernet)
    8. RX packets 65333 bytes 73376361 (69.9 MiB)
    9. RX errors 0 dropped 0 overruns 0 frame 0
    10. TX packets 60041 bytes 11472220 (10.9 MiB)
    11. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    12. lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
    13. inet 127.0.0.1 netmask 255.0.0.0
    14. loop txqueuelen 1000 (Local Loopback)
    15. RX packets 4 bytes 200 (200.0 B)
    16. RX errors 0 dropped 0 overruns 0 frame 0
    17. TX packets 4 bytes 200 (200.0 B)
    18. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    19. # 退出命名空间后,再查看网络,发现是宿主机的网络信息了,比较多就没展示
    20. [root@test1-cluster-34867 ~]# exit
    21. logout
    22. # 进入进程的多个命名空间
    23. nsenter -t 12688 --uts --ipc --net --pid

    需要注意的是,并不是所有资源都有被namespace隔离,例如:SELinux、time、syslog。此外,namespace的隔离也是不全面的,比如/proc、/sys、/dev/sd*没有完全隔离。

    在容器里面执行top
    image.png

    在容器里面执行free -h
    image.png

    上面的命令可以看出,容器里面展示的cpu、memory利用率都是宿主机的,因为top、free主要读取/proc、/sys中的数据。

    Docker的设计者也意识到这样确实存在很大不便,于是从Docker1.8版本以后将分配给容器的cgroup资源挂载到容器内,可以直接在容器内部查看到cgroup资源隔离情况。

    1. # 查看容器核数,除100000
    2. cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
    3. # 获取内存使用
    4. cat /sys/fs/cgroup/memory/memory.usage_in_bytes
    5. cat /sys/fs/cgroup/memory/memory.limit_in_bytes
    6. # 注意这里已经使用的内存usage_in_bytes是包含cache的,详细的情况可以从/sys/fs/cgroup/memory/memory.stat中获取
    7. # 查看容器是否设置oom,oom_kill_disable默认为0表示开启
    8. cat /sys/fs/cgroup/memory/memory.oom_control
    9. # 获取磁盘io
    10. cat /sys/fs/cgroup/blkio/blkio.throttle.io_service_bytes
    11. # 获取网卡出入流量
    12. cat /sys/class/net/eth0/statistics/rx_bytes
    13. cat /sys/class/net/eth0/statistics/tx_bytes

    K8S-Debug
    调试运行中的 Pod
    K8S-Debug工具也是利用了namespace的原理,但是对 k8s的版本有一定限制,官方一直没有release。

    安全隐患
    通过ns原理,我们在宿主机可以访问所有容器信息,甚至不需要ssh,exec等命令,这就存在了一定的安全隐患。基于云厂商的k8s服务,未来的趋势肯定也是要解决这个隐患。更轻量、更安全是整个行业的趋势。目前有这么几种方案,解决这一问题,业界也在努力中:

    1. 基于虚拟化的机密计算:TDX 、SEV 、PEF。
    2. 镜像功能卸载:主机上看不到容器镜像。
    3. 远程认证:确保运行在机密环境中。


    image.png