一、按管理方式分类(核心分类)

根据 Pod 是否由控制器(Controller)管理,可分为自主式 Pod 和控制器管理的 Pod,这是最核心的分类方式。

1. 自主式 Pod(Autonomous Pod)
  • 定义:直接通过 kubectl create 或 YAML 配置创建的独立 Pod,不依赖任何控制器。
  • 特点:
    • 生命周期完全独立,无自动重建能力:若 Pod 所在节点故障、容器崩溃且无法恢复,或被手动删除,Pod 会永久消失,不会自动重建。
    • 无扩缩容能力:无法通过简单命令实现副本数调整。
    • 无更新 / 回滚机制:若需更新应用版本,需手动删除旧 Pod 并创建新 Pod。
  • 适用场景:仅用于临时测试或演示,绝对不建议在生产环境使用。
  • 示例 YAML:

    yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: standalone-pod
    spec:
      containers:
      - name: nginx
        image: nginx:latest
    
2. 控制器管理的 Pod(Controller-Managed Pod)
  • 定义:由 Kubernetes 控制器创建和管理的 Pod,控制器会持续监控 Pod 状态,确保其符合 “期望状态”(如副本数、健康状态等)。
  • 核心特性:
    • 自动重建:若 Pod 故障(如容器崩溃、节点宕机),控制器会自动在其他节点创建新 Pod 替换。
    • 扩缩容支持:可通过调整控制器的 replicas 字段轻松实现 Pod 副本数增减。
    • 更新与回滚:支持滚动更新(如 Deployment)、有序更新(如 StatefulSet),并能回滚到历史版本。
  • 常见控制器及对应 Pod 场景:
    控制器类型管理的 Pod 特点典型应用场景
    Deployment无状态 Pod,副本完全一致,可任意替换Web 服务、API 接口、无状态应用
    StatefulSet有状态 Pod,拥有固定名称、网络标识和持久化存储数据库(MySQL、PostgreSQL)、分布式系统(Kafka、ZooKeeper)
    DaemonSet每个节点(或匹配标签的节点)仅运行一个相同的 Pod日志收集(如 Fluentd)、监控代理(如 Prometheus Node Exporter)
    Job一次性任务 Pod,完成后自动终止(退出码为 0)数据备份、批处理任务
    CronJob定时任务 Pod,按时间规则重复执行 Job定时数据同步、日志清理
  • 示例:由 Deployment 管理的 Pod 会自动带上 controller-revision-hash 标签,标识其所属的控制器版本。

二、按容器类型分类(Pod 内部结构)

一个 Pod 可包含多种功能的容器,按角色分为基础容器、初始化容器和应用容器。

1. 基础容器(Infrastructure Container)
  • 定义:每个 Pod 都会自动包含的特殊容器,默认由 k8s.gcr.io/pause 镜像创建(也称为 “Pause 容器”)。
  • 作用:
    • 作为 Pod 中所有容器的网络命名空间载体:使 Pod 内的所有容器共享同一 IP 地址、端口空间和主机名。
    • 维持 Pod 的生命周期:即使应用容器全部退出,Pause 容器仍会运行,确保 Pod 状态可被 K8s 识别。
    • 简化容器间的进程管理:Pause 容器作为 Pod 的 “根容器”,统一管理信号转发。
  • 特点:占用资源极少(CPU / 内存可忽略),用户无需手动配置。
2. 初始化容器(Init Containers)
  • 定义:在应用容器启动前执行的一次性容器,用于完成 Pod 启动前的初始化工作。
  • 作用:
    • 环境准备:如下载配置文件、初始化数据库 schema、设置权限等。
    • 依赖检查:等待其他服务(如数据库、API)就绪后,再启动应用容器(避免应用启动后因依赖未就绪而失败)。
    • 安全性提升:可在初始化容器中执行敏感操作(如解密配置),完成后销毁,避免应用容器包含敏感逻辑。
  • 特点:
    • 按定义顺序串行执行(前一个完成后,下一个才启动)。
    • 必须全部成功退出(退出码为 0),否则应用容器不会启动。
    • 若初始化失败,K8s 会根据 Pod 重启策略重试。
  • 示例 YAML:

    yaml

    spec:
      initContainers:
      - name: wait-for-db
        image: busybox:1.35
        command: ['sh', '-c', 'until nslookup db-service; do sleep 2; done']  # 等待数据库服务就绪
      containers:
      - name: app
        image: my-app:latest
    
3. 应用容器(Application Containers / Main Containers)
  • 定义:运行实际业务逻辑的容器,是 Pod 的核心工作负载。
  • 特点:
    • 可包含一个或多个容器,容器间通常存在紧密协作关系(如 “应用容器 + 日志收集容器”)。
    • 并行启动(无严格顺序,除非通过初始化容器控制)。
    • 共享 Pod 的网络和存储资源(可通过 localhost 通信,通过 Volume 共享文件)。
  • 常见组合模式:
    • 边车模式(Sidecar):辅助主容器工作的容器(如日志收集、监控代理、代理服务)。例如:Nginx 主容器 + 日志收集容器(Fluentd)。
    • 适配器模式(Adapter):将主容器输出的数据转换为统一格式(如指标适配)。
    • 初始化模式:与 Init 容器类似,但更侧重动态配置(需长期运行)。

三、按应用状态分类

根据 Pod 承载的应用是否需要保存状态,可分为无状态 Pod 和有状态 Pod(通常与控制器类型对应)。

1. 无状态 Pod(Stateless Pod)
  • 定义:Pod 不依赖持久化存储,重启或重建后,通过配置即可恢复正常工作,所有副本完全一致(可互换)。
  • 特点:
    • 无唯一标识需求:IP、名称可变化,不影响功能。
    • 数据存储在临时目录(emptyDir)或外部服务(如对象存储)。
    • 通常由 Deployment 管理。
  • 示例:前端静态页面服务(Nginx)、API 服务(无本地缓存)。
2. 有状态 Pod(Stateful Pod)
  • 定义:Pod 依赖持久化状态(如数据库数据、配置文件),需要固定标识(名称、网络地址),副本不可随意互换。
  • 特点:
    • 有唯一标识:名称固定(如 web-0、web-1),网络标识稳定(通过 Headless Service 提供固定 DNS 记录)。
    • 数据持久化:使用 PersistentVolume 存储数据,Pod 重建后仍能访问原有数据。
    • 通常由 StatefulSet 管理,支持有序部署、扩缩容和更新。
  • 示例:MySQL 数据库集群、Kafka broker 节点、ZooKeeper 集群。

总结

Pod 的分类可从多个维度理解:

  • 管理方式:区分自主式(临时测试)和控制器管理(生产环境主流),核心是控制器提供的高可用能力。
  • 容器类型:基础容器(网络载体)、初始化容器(前置准备)、应用容器(业务核心),共同构成 Pod 的完整功能。
  • 应用状态:无状态(可互换,Deployment 管理)和有状态(需固定标识,StatefulSet 管理),对应不同的数据持久化需求。
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐