在 Kubernetes 中,同一个 Pod 内的多个容器既共享一些核心资源以实现协作,又通过隔离机制保证运行独立性。具体划分如下:
一、共用的资源
这些资源由 Pod 级别的配置定义,所有容器共享使用,便于容器间协作:
-
网络命名空间(Network Namespace)
- 所有容器共享同一个 IP 地址和端口空间,可通过
localhost
直接通信(无需跨网络)。 - 共享相同的网络接口、路由表、DNS 配置等,对外表现为一个统一的网络实体。
- 注意:端口不能冲突(同一端口只能被一个容器占用)。
- 所有容器共享同一个 IP 地址和端口空间,可通过
-
存储卷(Volumes)
- Pod 中定义的所有卷(如
emptyDir
、hostPath
、PersistentVolumeClaim
等)可被容器挂载到各自的文件系统路径,实现数据共享。 - 例如:
emptyDir
卷可用于容器间临时数据交换,PVC
卷可共享持久化数据。
- Pod 中定义的所有卷(如
-
IPC 命名空间(IPC Namespace)
- 共享进程间通信机制,如 SystemV 消息队列、共享内存(
shm
)、信号量等,支持容器间高效的本地通信。
- 共享进程间通信机制,如 SystemV 消息队列、共享内存(
-
主机名与 Pod 元数据
- 所有容器共享 Pod 的主机名(由
metadata.name
定义)。 - 通过 Downward API 可获取相同的 Pod 元数据(如 Pod 名称、IP、标签、注解等)。
- 所有容器共享 Pod 的主机名(由
-
PID 命名空间(可选)
- 默认情况下,容器有独立的 PID 命名空间(看不到其他容器的进程),但可通过
shareProcessNamespace: true
配置让所有容器共享 PID 命名空间,此时容器间可看到彼此的进程。
- 默认情况下,容器有独立的 PID 命名空间(看不到其他容器的进程),但可通过
二、隔离的资源
这些资源由容器级别的配置定义,确保容器运行时的独立性和资源可控性:
-
CPU 与内存资源
- 每个容器可通过
resources.requests
和resources.limits
单独配置 CPU/内存的请求和限制,Kubernetes 通过 cgroups 实现资源隔离,防止单个容器过度占用资源影响其他容器。
- 每个容器可通过
-
进程空间(默认 PID 隔离)
- 默认情况下,每个容器有独立的进程树(PID 命名空间),无法看到或操作其他容器的进程(除非显式开启
shareProcessNamespace
)。
- 默认情况下,每个容器有独立的进程树(PID 命名空间),无法看到或操作其他容器的进程(除非显式开启
-
文件系统(除共享卷外)
- 每个容器基于自身镜像拥有独立的根文件系统(
rootfs
),仅通过挂载共享卷的路径实现数据交互,容器自身的文件系统修改不会影响其他容器。
- 每个容器基于自身镜像拥有独立的根文件系统(
-
用户与权限
- 容器可通过
securityContext.runAsUser
等配置指定运行用户/组,不同容器可使用不同的用户上下文,实现权限隔离。
- 容器可通过
-
环境变量与配置
- 容器的环境变量(
env
)、命令(command
)、参数(args
)等由各自配置定义,相互独立(除非通过共享卷或 Downward API 传递)。
- 容器的环境变量(
-
Linux 命名空间隔离
- 除网络、IPC 等共享的命名空间外,其他命名空间(如挂载命名空间
mount namespace
)默认隔离,确保容器的挂载点不互相干扰。
- 除网络、IPC 等共享的命名空间外,其他命名空间(如挂载命名空间
总结
同一个 Pod 内的容器通过共享网络、存储和 IPC 实现紧密协作,同时通过资源限制、进程隔离、文件系统隔离等机制保证运行独立性。这种设计既满足了“紧耦合”服务(如应用与日志收集器)的协作需求,又避免了容器间的资源冲突。