Skip to content

Pod和容器的设计模式

Pod 和容器

容器本质上是进程被隔离,视图受限制单进程

在 Kubernetes(K8s)中,Pod 是最小的调度单位,里面可以包含一个或多个容器,这些容器:

  • 共享网络命名空间(同一个 IP、端口空间);
  • 可以通过 localhost 相互通信;
  • 共享卷(Volume),用于共享数据;
  • 常用于部署紧密协作的一组容器,比如主程序和其 sidecar(如日志采集、代理)

和传统的 Docker Compose 对比:

特性Pod(K8s)Docker Compose
网络同一个网络命名空间(127.0.0.1 可通信)不同容器使用虚拟网络桥接,需通过服务名通信
存储可共享 VolumeVolume 需显式挂载
容器关系紧密耦合,常作为一个单元管理各容器相对独立
应用场景生产环境的微服务部署与调度本地开发、测试场景
调度Kubernetes 控制器调度 PodDocker 引擎直接运行容器

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-data

SiderCar 边车模式

“Sidecar” 是在 Kubernetes 中非常常见的一种设计模式,本质上是将一个辅助功能封装到一个独立的容器中,然后与主业务容器一起组成一个 Pod,使它们在同一环境下运行

最后更新于:

Released under the MIT License.