Pod和容器的设计模式
Pod 和容器
容器本质上是进程被隔离,视图受限制单进程
在 Kubernetes(K8s)中,Pod 是最小的调度单位,里面可以包含一个或多个容器,这些容器:
- 共享网络命名空间(同一个 IP、端口空间);
- 可以通过 localhost 相互通信;
- 共享卷(Volume),用于共享数据;
- 常用于部署紧密协作的一组容器,比如主程序和其 sidecar(如日志采集、代理)
和传统的 Docker Compose 对比:
| 特性 | Pod(K8s) | Docker Compose |
|---|---|---|
| 网络 | 同一个网络命名空间(127.0.0.1 可通信) | 不同容器使用虚拟网络桥接,需通过服务名通信 |
| 存储 | 可共享 Volume | Volume 需显式挂载 |
| 容器关系 | 紧密耦合,常作为一个单元管理 | 各容器相对独立 |
| 应用场景 | 生产环境的微服务部署与调度 | 本地开发、测试场景 |
| 调度 | Kubernetes 控制器调度 Pod | Docker 引擎直接运行容器 |
Pod 比较适合处理一些超亲密关系,比如说两个容器会进行频繁的文件交换,或者是 RPC 交互
Pod 类似于豌豆荚🫛,而容器就是里面的豆,三个豆要在一起才是一个完整的豆荚
Pod 的实现
网络共享
借助一个 pause 容器来实现
| 特性 | 说明 |
|---|---|
| 超轻量级 | 镜像仅 250KB 左右(汇编/C 静态编译) |
| 资源占用接近零 | 不消耗 CPU,内存占用 ~100KB |
| PID 1 进程 | 作为 Pod 的 init 进程,负责管理子进程 |
| 僵尸进程回收 | 回收孤儿进程避免资源泄漏 |
| 信号中继 | 将 SIGTERM/SIGKILL 转发给所有子容器,实现 Pod 级优雅终止 |
单个 Pod 内的容器只要负责与 localhost 来进行通讯,不需要在意其他的网络复杂性,而且这个 pause 容器是随 Pod 的生命周期是一样的,只要 Pod 不销毁,pause 就不销毁
确保整个 Pod 共享:相同的 IP 地址、相同的端口空间、相同的网络接口、相同的路由表
存储共享
yaml
apiVersion: v1
kind: Pod
metadata:
name: shared-volume-pod
spec:
volumes:
- name: shared-data # 定义名为shared-data的卷
emptyDir: {} # 使用emptyDir类型,这是一个临时目录
containers:
- name: container1
image: busybox
command: ["/bin/sh", "-c", "echo 'Hello from Container1' > /shared-data/file.txt && sleep 3600"]
volumeMounts:
- name: shared-data
mountPath: /shared-data # 在container1中挂载到/shared-data
- name: container2
image: busybox
command: ["/bin/sh", "-c", "cat /shared-data/file.txt && sleep 3600"]
volumeMounts:
- name: shared-data
mountPath: /shared-data # 在container2中同样挂载到/shared-dataSiderCar 边车模式
“Sidecar” 是在 Kubernetes 中非常常见的一种设计模式,本质上是将一个辅助功能封装到一个独立的容器中,然后与主业务容器一起组成一个 Pod,使它们在同一环境下运行