pod中运行的是什么

当启动pod时(pod中包含服务service1, 服务service2)时,pod底层运行如下。

  • pod将默认创建容器sandbox, 常见的sandbox使用pause作为镜像

  • sandbox容器与业务容器本质都作为进程运行。

  • sandbox启动时将初始化network namespace, ipc namespace, uts namespace, user namespace 等命名空间。

  • pod下的其他容器将 加入到与sandbox相同的 network namespace, ipc namespace, uts namespace, user namespace.

  • pod 下的sandbox容器与业务容器的 cgroup namespace,pid namespace 独立。因此默认情况下pod内的业务容器无法看到pod下其他业务容器的进程。

  • 但当pod设置 pod.spec.shareProcessNamespace: true 时,pod中的容器将使用相同的 pid namespace。

进程视图看容器

使用pstree -p 可以树状图的方式查看子父进程管理,如下图

  1. 该pod由containerd-shim启动,称为垫片,该进程由kubelet创建,主要避免kubelet异常时影响已运行的pod。抱持与kubelet的独立。

  2. 该pod 中 pause 即sandbox进程,app即是业务进程。他们为兄弟进程。

           |-containerd-shim(24310)-+-app(77596)-+-{app}(77631)
           |                        |            |-{app}(77633)
           |                        |            |-{app}(77634)
           |                        |            |-{app}(77635)
           |                        |            |-{app}(77652)
           |                        |            |-{app}(77653)
           |                        |            `-{app}(...)
           |                        |-pause(24489)
           |                        |-{containerd-shim}(24313)

容器与空间的关系

根据上面进程图可查到对应进程在 /proc 文件系统下的相关信息

vim /proc/24489/task/24489/ns/

cgroup@  --> cgroup:[4026531835]
ipc@     --> ipc:[4026544105]
mnt@     --> mnt:[4026544103]
net@     --> net:[4026543073]
pid@     --> pid:[4026544106]
pid_for_children@        --> pid:[4026544106]
time@    --> time:[4026531834]
time_for_children@       --> time:[4026531834]
user@    --> user:[4026531837]
uts@     --> uts:[4026544104]
vim /proc/77596/task/77596/ns/
cgroup@  --> cgroup:[4026548136]
ipc@     --> ipc:[4026544105]
mnt@     --> mnt:[4026548134]
net@     --> net:[4026543073]
pid@     --> pid:[4026548135]
pid_for_children@        --> pid:[4026548135]
time@    --> time:[4026531834]
time_for_children@       --> time:[4026531834]
user@    --> user:[4026531837]
uts@     --> uts:[4026544104]

通过对比,容器对应的进程共享 network namespace, ipc namespace, uts namespace, user namespace 等命名空间;pid cgroup mnt等namespace 不共享。

pod在主机上的配置

以sandbox进程ID 24489 反向查询到对应容器ID为 b5f1f874fb1a24e2c1db5be39b3808aec0d73f6ba4596fbafd181b4b6cd3e2b9 检索关联目录

find /run -name b5f1f874fb1a24e2c1db5be39b3808aec0d73f6ba4596fbafd181b4b6cd3e2b9

/run/containerd/runc/k8s.io/b5f1f874fb1a24e2c1db5be39b3808aec0d73f6ba4596fbafd181b4b6cd3e2b9
/run/containerd/io.containerd.grpc.v1.cri/sandboxes/b5f1f874fb1a24e2c1db5be39b3808aec0d73f6ba4596fbafd181b4b6cd3e2b9
/run/containerd/io.containerd.runtime.v2.task/k8s.io/b5f1f874fb1a24e2c1db5be39b3808aec0d73f6ba4596fbafd181b4b6cd3e2b9

/run/containerd/runc/k8s.io/【容器ID】

下可看到state.json 文件,其中存放容器的状态信息

/run/containerd/io.containerd.grpc.v1.cri/sandboxes/【容器ID】

该目录只有容器为sandbox时会有,下面有shm目录,用于挂入pod下的各个容器,通过内存映射支持共享内存通信。

/run/containerd/io.containerd.runtime.v2.task/k8s.io/【容器ID】 该目录下主要有容器的配置信息,日志文件,以及容器rootfs目录。

../
./
rootfs/
address
config.json //配置
init.pid
log.json
log|
options.json
runtime
shim-binary-path
work@    --> /var/lib/containerd/io.containerd.runtime.v2.task/k8s.io/b5f1f874fb1a24e2c1db5be39b3808aec0d73f6ba4596fbafd181b4b6cd3e2b9

rootfs/

容器根文件系统的挂载点,通常是镜像层叠加后的只读根文件系统,作为容器内进程的视图根目录。

address

可能是一个表示容器/任务在某个命名空间或地址的文件,常见于与运行时通讯的地址信息。具体含义依赖运行时实现,通常与命名空间、套接字地址等有关。

config.json

容器的配置信息文件(JSON 格式)。常见字段包括: linux 命名空间、cgroups、资源限制,挂载点、环境变量、命令与工作目录,容器的根文件系统、网络设置等,这个文件通常用于启动时将配置信息传递给运行时(如 runc)来创建容器。

log.json

容器或进程的日志文件,通常以 JSON 结构记录日志条目(时间、级别、消息等),便于后续聚合和分析。

runtime

指向实际使用的运行时实现的目录或二进制(如 /run/namespaces/<id>/runtime 的实现)。常见的是指向 runc、crun、nspod 之类的运行时组件。

shim-binary-path

指向当前容器正在使用的 shim 二进制文件路径。shim 是运行时与容器进程之间的代理,负责转发 IO、信号、退出等事件,并维护运行时和容器进程之间的通信。

work@ --> /var/lib/containerd/io.containerd.runtime.v2.task/k8s.io/【容器ID】

work@ 是一个工作目录,用于容器任务(task)的临时数据、套接字、管道等的工作空间。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐