【问题标题】:Are the container in a kubernetes pod part of same cgroup?Kubernetes pod 中的容器是否属于同一 cgroup?
【发布时间】:2020-10-24 06:29:15
【问题描述】:

在多容器 Kubernetes pod 中,容器是同一 cgroup(连同 pod)的一部分,还是为每个容器创建单独的 cgroup。

【问题讨论】:

    标签: docker kubernetes kubernetes-pod docker-container cgroups


    【解决方案1】:

    Cgroups

    pod 中的容器共享 cgroup 层次结构的一部分,但每个容器都有自己的 cgroup。我们可以尝试一下并验证自己。

    1. 启动一个多容器 pod。
    # cat mc2.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: two-containers
    spec:
      restartPolicy: Never
      containers:
      - name: container1
        image: ubuntu
        command: [ "/bin/bash", "-c", "--" ]
        args: [ "while true; do sleep 30; done;" ]
    
      - name: container2
        image: ubuntu
        command: [ "/bin/bash", "-c", "--" ]
        args: [ "while true; do sleep 30; done;" ]
    
    # kubectl apply -f mc2.yaml
    pod/two-containers created
    
    1. 在主机上查找进程 cgroups
    # ps -ax | grep while | grep -v grep
    19653 ?        Ss     0:00 /bin/bash -c -- while true; do sleep 30; done;
    19768 ?        Ss     0:00 /bin/bash -c -- while true; do sleep 30; done;
    
    # cat /proc/19653/cgroup
    12:hugetlb:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    11:memory:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    10:perf_event:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    9:freezer:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    8:cpuset:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    7:net_cls,net_prio:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    6:cpu,cpuacct:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    5:blkio:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    4:pids:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    3:devices:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    2:rdma:/
    1:name=systemd:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    0::/
    
    # cat /proc/19768/cgroup
    12:hugetlb:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/e10fa18a63cc26de27f3f79f46631cd814efa3ef7c2f5ace4b84cf5abce89765
    11:memory:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/e10fa18a63cc26de27f3f79f46631cd814efa3ef7c2f5ace4b84cf5abce89765
    10:perf_event:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/e10fa18a63cc26de27f3f79f46631cd814efa3ef7c2f5ace4b84cf5abce89765
    9:freezer:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/e10fa18a63cc26de27f3f79f46631cd814efa3ef7c2f5ace4b84cf5abce89765
    8:cpuset:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/e10fa18a63cc26de27f3f79f46631cd814efa3ef7c2f5ace4b84cf5abce89765
    7:net_cls,net_prio:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/e10fa18a63cc26de27f3f79f46631cd814efa3ef7c2f5ace4b84cf5abce89765
    6:cpu,cpuacct:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/e10fa18a63cc26de27f3f79f46631cd814efa3ef7c2f5ace4b84cf5abce89765
    5:blkio:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/e10fa18a63cc26de27f3f79f46631cd814efa3ef7c2f5ace4b84cf5abce89765
    4:pids:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/e10fa18a63cc26de27f3f79f46631cd814efa3ef7c2f5ace4b84cf5abce89765
    3:devices:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/e10fa18a63cc26de27f3f79f46631cd814efa3ef7c2f5ace4b84cf5abce89765
    2:rdma:/
    1:name=systemd:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/e10fa18a63cc26de27f3f79f46631cd814efa3ef7c2f5ace4b84cf5abce89765
    0::/
    

    如您所见,pod 中的容器共享 cgroup 层次结构,直到 /kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011,然后它们获得自己的 cgroup。 (These containers are under besteffort cgroup because we have not specified the resource requests)

    Another clue that containers run in their own cgroup is that kubernetes allows you to set resource requests at the container level.

    您也可以通过登录容器并查看 /proc/self/cgroup 文件来找到容器的 cgroup。 (如果启用了 cgroup 命名空间,这在最新版本的 kubernetes 中可能不起作用)

    # kubectl exec -it two-containers -c container2 bash
    # root@two-containers:# cat /proc/self/cgroup
    12:hugetlb:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    11:memory:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    10:perf_event:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    9:freezer:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    8:cpuset:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    7:net_cls,net_prio:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    6:cpu,cpuacct:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    5:blkio:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    4:pids:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    3:devices:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    2:rdma:/
    1:name=systemd:/kubepods/besteffort/poda9c80282-3f6b-4d5b-84d5-a137a6668011/ed89697807a981b82f6245ac3a13be232c1e13435d52bc3f53060d61babe1997
    0::/
    

    命名空间

    pod 中的容器默认也共享网络和 IPC 命名空间。

    # cd /proc/19768/ns/
    # /proc/19768/ns# ls -lrt
    total 0
    lrwxrwxrwx 1 root root 0 Jul  4 01:41 uts -> uts:[4026536153]
    lrwxrwxrwx 1 root root 0 Jul  4 01:41 user -> user:[4026531837]
    lrwxrwxrwx 1 root root 0 Jul  4 01:41 pid_for_children -> pid:[4026536154]
    lrwxrwxrwx 1 root root 0 Jul  4 01:41 pid -> pid:[4026536154]
    lrwxrwxrwx 1 root root 0 Jul  4 01:41 net -> net:[4026536052]
    lrwxrwxrwx 1 root root 0 Jul  4 01:41 mnt -> mnt:[4026536152]
    lrwxrwxrwx 1 root root 0 Jul  4 01:41 ipc -> ipc:[4026536049]
    lrwxrwxrwx 1 root root 0 Jul  4 01:41 cgroup -> cgroup:[4026531835]
    
    # cd /proc/19653/ns
    # /proc/19653/ns# ls -lrt
    total 0
    lrwxrwxrwx 1 root root 0 Jul  4 01:42 uts -> uts:[4026536150]
    lrwxrwxrwx 1 root root 0 Jul  4 01:42 user -> user:[4026531837]
    lrwxrwxrwx 1 root root 0 Jul  4 01:42 pid_for_children -> pid:[4026536151]
    lrwxrwxrwx 1 root root 0 Jul  4 01:42 pid -> pid:[4026536151]
    lrwxrwxrwx 1 root root 0 Jul  4 01:42 net -> net:[4026536052]
    lrwxrwxrwx 1 root root 0 Jul  4 01:42 mnt -> mnt:[4026536149]
    lrwxrwxrwx 1 root root 0 Jul  4 01:42 ipc -> ipc:[4026536049]
    lrwxrwxrwx 1 root root 0 Jul  4 01:42 cgroup -> cgroup:[4026531835]
    

    如您所见,容器共享网络和 IPC 命名空间。您还可以使用 pod 规范中的 shareProcessNamespace 字段使容器共享 pid 命名空间。

    https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace


    cgroup:[4026531835] 对于两个容器都是相同的。这(cgroup 命名空间)与它们(容器)所属的 cgroup 不同吗?

    cgroups 限制了一个进程(或一组进程)可以使用的资源(cpu、内存等)。

    命名空间隔离并限制进程(或一组进程)对网络、进程树等系统资源的可见性。有不同的命名空间组,如网络、IPC 等。其中一个命名空间是 cgroup 命名空间。使用 cgroup 命名空间,您可以限制来自进程(或进程组)的其他 cgroup 的可见性

    cgroup 命名空间虚拟化进程的 cgroup 视图。目前,如果您在容器内尝试cat /proc/self/cgroup,您将能够看到从全局 cgroup 根开始的完整 cgroup 层次结构。这可以通过使用 cgroup 命名空间来避免,可以从 kubernetes v1.19 获得。 Docker also supports this from version 20.03。在创建容器时使用 cgroup 命名空间时,您会在容器内看到 cgroup 根为 /,而不是看到全局 cgroup 层次结构。

    https://man7.org/linux/man-pages/man7/cgroup_namespaces.7.html

    【讨论】:

    猜你喜欢
    • 2021-02-14
    • 1970-01-01
    • 2021-08-10
    • 2020-10-24
    • 1970-01-01
    • 2021-04-26
    • 2019-08-12
    • 2023-02-25
    • 1970-01-01
    相关资源
    最近更新 更多