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

根据 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-0web-1),网络标识稳定(通过 Headless Service 提供固定 DNS 记录)。
    • 数据持久化:使用 PersistentVolume 存储数据,Pod 重建后仍能访问原有数据。
    • 通常由 StatefulSet 管理,支持有序部署、扩缩容和更新。
  • 示例:MySQL 数据库集群、Kafka broker 节点、ZooKeeper 集群。

总结

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

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

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

更多推荐