写点什么

Pod 运行时调试

作者:星际行者
  • 2022-11-12
    北京
  • 本文字数:1396 字

    阅读完需:约 5 分钟

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


  1. 首先找到容器中运行进程的 pid。

  2. 进入 pid 所对应的 namespace。


进入容器的命名空间


# 进入 12688 进程的网络命名空间[root@test1-cluster-34867 ~]# nsenter -t 12688 --net
# 在网络命名空间查看的 ip 情况 【只有 2个网卡】[root@test1-cluster-34867 ~]# ifconfigeth0: 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 ~]# exitlogout
# 进入进程的多个命名空间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 资源隔离情况。


# 查看容器核数,除100000cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
# 获取内存使用cat /sys/fs/cgroup/memory/memory.usage_in_bytescat /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
# 获取磁盘iocat /sys/fs/cgroup/blkio/blkio.throttle.io_service_bytes
# 获取网卡出入流量cat /sys/class/net/eth0/statistics/rx_bytescat /sys/class/net/eth0/statistics/tx_bytes
复制代码


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


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


  1. 基于虚拟化的机密计算:TDX 、SEV 、PEF。

  2. 镜像功能卸载:主机上看不到容器镜像。

  3. 远程认证:确保运行在机密环境中。



发布于: 刚刚阅读数: 4
用户头像

星际行者

关注

编程多年依旧热爱。。。 2019-03-28 加入

还未添加个人简介

评论

发布
暂无评论
Pod 运行时调试_星际行者_InfoQ写作社区