【问题标题】:Does Kubernetes POD have namespace and cgroup associated with it?Kubernetes POD 是否有与之关联的命名空间和 cgroup?
【发布时间】:2020-10-24 21:48:11
【问题描述】:

Docker 容器具有与之关联的 cgroup 和命名空间,无论它们是在 pod、vm 还是主机中运行。
同样,Kubernetes Pod 是否具有与之关联的命名空间和 cgroup,或者只是 pod 中的容器具有这些(cgroup 和命名空间)关联。如果有,我怎样才能从房东那里找到这些信息?

【问题讨论】:

  • 不确定 cgroup 但 kubernetes pod 有命名空间。您可以检查是否使用kubectl describe pods <name_of_pod>。要获取 pod,请运行 kubectl get pods
  • @mWatney,这是关于 POD 而不是 pod 中的容器。这样其他Q&A就不一样了,不回答这个Q。
  • 我不明白你的意思。每个 pod 都是一个容器或一组容器,答案是解释事物之间的关系。如果您的问题是在 K8S 上是否有类似于 cgroup 的东西,答案是否定的,最接近的是命名空间。
  • 关于您的新问题,请将其作为新问题发布。 StackOverflow 是每个问题一个帖子。

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


【解决方案1】:

documentation我们可以读到:

“豆荚(如鲸鱼荚或豌豆荚)是一组一个或多个容器”

这让我们明白,对于每个 pod,我们都有一个或多个容器以及与之关联的 cgroup。

以下答案证明了这一点。


将此答案发布为社区 Wiki,因为它是来自此 answer 的复制/粘贴。

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)

您还可以通过登录容器并查看 /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

【讨论】:

    【解决方案2】:

    group of whales is called a pod。考虑一个由两只座头鲸组成的豆荚。一头鲸鱼是灰色的,另一头是蓝色的。

    豆荚的颜色是什么?这个问题没有多大意义,因为颜色是每条鲸鱼的属性。

    豆荚的种类是什么?好吧,您可以说它是驼背豆荚,因为豆荚中的所有鲸鱼都是座头鲸,但物种与豆荚无关。它是属于该物种的个体鲸鱼。


    类似的容器组是 Kubernetes 中的一个 pod。 cgroups 和命名空间等属性适用于容器。有时在 pod 级别谈论一些属性(如网络命名空间或 IPC 命名空间)很方便,因为 pod 中的所有容器通常共享相同的网络和 IPC 命名空间。但它们本质上是容器属性。

    【讨论】:

      猜你喜欢
      • 2021-02-14
      • 2020-08-21
      • 2020-10-24
      • 2019-01-16
      • 1970-01-01
      • 2016-02-04
      • 2019-04-25
      • 1970-01-01
      • 2021-11-10
      相关资源
      最近更新 更多