V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jenrey
V2EX  ›  Kubernetes

初学者问一个略显深入的问题: K8S 如何查看 Pod 的 Cgroup

  •  2
     
  •   jenrey · 2022-08-08 11:27:32 +08:00 · 2686 次点击
    这是一个创建于 830 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一、查看 docker container 的 Cgroup 我是使用如下方式:

    $ docker ps|grep nginx
    $ docker inspect 4e35d36bc919 | grep -i pid
    
    "Pid": 20513,
    "PidMode": "",
    "PidsLimit": null,
    
    $ cd /sys/fs/cgroup/memory
    $ cat cgroup.procs # 20513 ,可以看到 docker nginx 的 container 的 PID 为 20513 的已经生效
    $ cat memory.limit_in_bytes 
    

    二、但是在 K8S 中找了半天也找不到 Pod 的 Cgroups

    # 使用下面命令设置了 CPU 和 Memory
    $ kubectl set resources deployment nginx-deployment -c=nginx --limits=cpu=500m,memory=128Mi
    # 查看是否生效
    $ kubectl get deploy nginx-deployment -oyaml
    
    ...
    spec:
      containers:
        resources:
          limits:
            cpu: 500m
            memory: 128Mi
    ...
    

    得到如上 yaml 证明已经修改 CPU 、Memory 成功了。

    问题:K8S 如何查看 Pod 的 Cgroup ?换句话说我想找到“使用 kubectl set resources 命令设置 CPU 、Memory 的 Cgroup 在 Linux 上的实现”,因为是初学者,所以希望各位前辈通俗易懂最好有命令可以提供一下,不胜感激!!!!感谢每一位回复的前辈,谢谢

    docker 已配置:cgroupdriver=systemd

    docker version:20.10.17

    kubernetes version:v1.22.2

    第 1 条附言  ·  2022-08-08 15:41:36 +08:00

    感谢各位前辈的解答,问题得以解决,总结如下:

    # 查看所有deployment
    $ kubectl get deploy
    
    NAME               READY   
    nginx-deployment   3/3   
    
    # 查看所有ReplicaSet
    $ kubectl get rs
    
    NAME                         DESIRED   CURRENT   READY
    nginx-deployment-754bf85c9   3         3         3
    
    # 查看所有Pod
    $ kubectl get po
    
    NAME                               READY
    nginx-deployment-754bf85c9-49ns4   1/1
    nginx-deployment-754bf85c9-5rxrk   1/1
    nginx-deployment-754bf85c9-lvj49   1/1
    
    # 查看此deployment的所有docker container,拿到3个Pod的docker container ID
    $ docker ps |grep nginx-deployment-754bf85c9
    
    195328818fcf
    badcb27ef1c3
    bae9808897ed
    
    $ docker inspect 195328818fcf |grep -i pid
    	"Pid": 7483,
    $ docker inspect badcb27ef1c3 |grep -i pid
    	"Pid": 7064,
    $ docker inspect bae9808897ed |grep -i pid
    	"Pid": 6642,
    	
    # 列出Pid=7483的所有Cgroups路径,得到下列Cgroups路径
    $ cat /proc/7483/cgroup
    
    8:cpu,cpuacct:/kubepods.slice/kubepods-pod089f877c_815d_4f1d_8a18_c8d4dc528932.slice/docker-195328818fcf8fb487f12939cc883d9bc9b1dd9369bf4ed22dc3c64a79cb91ef.scope
    5:memory:/kubepods.slice/kubepods-pod089f877c_815d_4f1d_8a18_c8d4dc528932.slice/docker-195328818fcf8fb487f12939cc883d9bc9b1dd9369bf4ed22dc3c64a79cb91ef.scope
    
    # 进入Pid=7483的Cgroup Memory路径
    $ cd /sys/fs/cgroup/memory/kubepods.slice/kubepods-pod089f877c_815d_4f1d_8a18_c8d4dc528932.slice/docker-195328818fcf8fb487f12939cc883d9bc9b1dd9369bf4ed22dc3c64a79cb91ef.scope
    
    # 使用pstree命令查看进程关系树
    $ pstree -up 7483
    
    nginx(7483)-+-nginx(7537,systemd-resolve)
                |-nginx(7538,systemd-resolve)
                `-nginx(7539,systemd-resolve)
                
    $ cat cgroup.procs
    7483 # 这个是本进程,下面三个Pid都是子进程号忽略即可
    7537
    7538
    7539
    
    $ cat memory.limit_in_bytes 
    
    134217728 bytes也就是128MB
    
    # 下面是Cgroup CPU系统的示例
    $ cd /sys/fs/cgroup/cpu/kubepods.slice/kubepods-pod089f877c_815d_4f1d_8a18_c8d4dc528932.slice/docker-195328818fcf8fb487f12939cc883d9bc9b1dd9369bf4ed22dc3c64a79cb91ef.scope
    $ cat cpu.cfs_quota_us # 50000
    
    # 最后,查看Pid为7064、6642也是一样的,这里就不展示了。
    
    8 条回复    2022-08-08 15:42:59 +08:00
    root01
        1
    root01  
       2022-08-08 11:38:57 +08:00
    kubectl describe pod podname -n namespace
    andyangyu
        2
    andyangyu  
       2022-08-08 11:47:32 +08:00
    pod 最后也是调度到某一台服务器上的 container ,在那台服务器上查看 container 就行
    kalllllllen
        3
    kalllllllen  
       2022-08-08 11:58:52 +08:00
    用 kubectl describe 就可以
    1point
        4
    1point  
       2022-08-08 12:29:23 +08:00
    cat /sys/fs/cgroup/memory/memory.limit_in_bytes
    jenrey
        5
    jenrey  
    OP
       2022-08-08 13:48:41 +08:00
    @kalllllllen describle 看不到关于此 Pod 的 Cgroup 目录信息。而我在`/sys/fs/cgroup/memory/`下又无法找到此 Pid 的 Cgroups
    jenrey
        6
    jenrey  
    OP
       2022-08-08 14:00:16 +08:00
    @root01 不太行,还是看到不 Cgroup 信息。我在`/sys/fs/cgroup/memory/kubepods.slice/kubepods-pod089f877c_815d_4f1d_8a18_c8d4dc528932.slice`目录找到了 deployment 的 cgroups ,但是我是挨个文件看的,最后发现此目录下的`memory.limit_in_bytes`内的值为 134217728Bytes ,也就是 128MB ,但是我现在希望得到此目录与 Pod 的对应关系。
    martinqian
        7
    martinqian  
       2022-08-08 14:24:02 +08:00
    下面这个方式是可以拿到的,AWS EKS 1.22

    ```bash
    kubectl get pods -n namespace -o wide

    ssh ...
    ps -ax | grep nginx | grep -v grep
    cat /proc/$pid/cgroup
    ```
    jenrey
        8
    jenrey  
    OP
       2022-08-08 15:42:59 +08:00
    @martinqian 感谢您,问题得到解决了,现已总结了具体过程。希望可以帮助到更多的人。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5432 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 05:57 · PVG 13:57 · LAX 21:57 · JFK 00:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.