2. Kubernetes 基础回顾:Pod、Service、Deployment、StatefulSet 核心概念

在部署 MinIO 存储集群之前,必须牢固掌握 Kubernetes 的四个核心抽象:Pod(最小调度单元)、Service(网络访问抽象)、Deployment(无状态工作负载)和 StatefulSet(有状态工作负载)。MinIO 作为有状态分布式存储,其持久化标识、网络拓扑和扩缩容行为与 StatefulSet 的设计理念高度吻合。

2.1 Pod:最小部署单元

Pod 是 Kubernetes 中可创建和管理的最小计算单元。一个 Pod 可以包含一个或多个容器(通常为一个主容器加若干 sidecar 辅助容器),这些容器共享同一网络命名空间、存储卷和生命周期。

  • 共享 IP 与端口空间:Pod 内所有容器通过 localhost 互相通信。
  • 共享存储卷:Pod 级别的 Volume 可被内部所有容器挂载。
  • 原子调度:Pod 要么全部运行在同一节点,要么全部不运行。
  • 临时性:Pod 被设计为可丢弃的,IP 地址不固定。
MinIO 关联:每个 MinIO 实例运行在一个 Pod 中,但 MinIO 的分布式模式要求 Pod 之间通过固定的 DNS 名称(而非 IP)互相发现,因此不能直接使用普通 Pod。

2.2 Service:稳定的网络访问入口

Service 为一组动态变化的 Pod 提供稳定的虚拟 IP(ClusterIP)和 DNS 名称,实现服务发现与负载均衡。根据访问场景,Service 分为四种类型:

类型 访问范围 典型用途
ClusterIP 集群内部 后端服务间调用(MinIO 内部通信)
NodePort 集群外部(节点 IP + 端口) 开发测试环境暴露服务
LoadBalancer 集群外部(云负载均衡器) 生产环境对外暴露 MinIO S3 API
Headless Service 无 ClusterIP,直接返回 Pod DNS StatefulSet 的有状态网络标识
关键点:MinIO 分布式集群使用 Headless Service(clusterIP: None)为每个 Pod 提供稳定的 DNS 名称,格式为 <pod-name>.<service-name>.<namespace>.svc.cluster.local。
Pod 与 Service 关系示意图 Pod 与 Service 关系 Service (ClusterIP: 10.0.0.1) Pod A 10.0.1.2 Pod B 10.0.1.3 Pod C 10.0.1.4 说明: Service 通过标签选择器(selector)关联 Pod,客户端只需访问 Service 的 ClusterIP 或 DNS 名称, 请求会被自动转发到后端某个健康的 Pod。Pod 的 IP 变化不影响客户端访问。

2.3 Deployment:无状态应用管理

Deployment 是 Kubernetes 中最常用的工作负载控制器,用于管理无状态应用的声明式更新和扩缩容。其核心特性包括:

  • ReplicaSet 管理:Deployment 控制 ReplicaSet,ReplicaSet 确保指定数量的 Pod 副本运行。
  • 滚动更新:支持逐步替换旧版本 Pod,实现零停机发布。
  • 回滚:保留历史版本,可快速回退到任意稳定版本。
  • 水平扩缩:调整副本数,Pod 名称随机生成,无持久标识。
不适用于 MinIO:Deployment 生成的 Pod 名称是随机的(如 nginx-7c8b9d6f8f-abcde),且 Pod 重建后名称和 IP 都会改变。MinIO 分布式集群要求每个节点有固定的标识,因此不能使用 Deployment。

2.4 StatefulSet:有状态应用管理

StatefulSet 是为有状态应用设计的工作负载控制器,解决了 Deployment 无法提供稳定网络标识和持久存储的问题。它是部署 MinIO 分布式集群的唯一正确选择。

特性 Deployment StatefulSet
Pod 命名规则 随机后缀(如 app-6b8d9f-xyz) 有序索引(如 minio-0, minio-1)
网络标识 Pod 重建后 IP 变化 稳定的 DNS 名称(Headless Service)
存储卷 所有 Pod 共享同一卷或临时卷 每个 Pod 绑定独立的 PersistentVolumeClaim
扩缩容顺序 任意顺序创建/删除 按索引顺序(0→N-1 创建,N-1→0 删除)
典型场景 Web 服务、API 网关 数据库、消息队列、分布式存储(MinIO)
MinIO 为何需要 StatefulSet:MinIO 分布式模式使用 http://minio-{0..N-1}.minio-hl.namespace.svc.cluster.local:9000 格式进行节点间通信。StatefulSet 保证每个 Pod 的 DNS 名称在重建后保持不变,这是 MinIO 集群拓扑稳定的基础。
StatefulSet 与 Deployment 对比 StatefulSet vs Deployment 对比 Deployment(无状态) app-6b8d9f-xyz IP: 10.0.1.5 app-6b8d9f-abc IP: 10.0.1.6 ▼ 重建后 Pod 名称和 IP 全变 app-7c9e0g-hij IP: 10.0.2.1 app-7c9e0g-klm IP: 10.0.2.2 StatefulSet(有状态) minio-0 DNS: minio-0.minio-hl minio-1 DNS: minio-1.minio-hl ▼ 重建后 Pod 名称和 DNS 不变 minio-0 DNS: minio-0.minio-hl minio-1 DNS: minio-1.minio-hl 核心差异: StatefulSet 为每个 Pod 分配有序索引(0, 1, 2...),结合 Headless Service 生成固定 DNS 名称。 Pod 无论如何重建,其 DNS 名称和绑定的持久卷都不会改变,这是分布式存储集群的基石。

2.5 核心概念总结

下表汇总了四个核心抽象在 MinIO 部署中的角色:

概念 MinIO 中的角色 关键配置
Pod 运行 MinIO 容器实例 资源限制、健康检查、存储卷挂载
Service Headless Service 提供稳定 DNS;ClusterIP/LB 对外暴露 S3 API clusterIP: None 用于内部发现
Deployment 不用于 MinIO 本身,可用于 MinIO Client 或辅助工具 无状态工具部署
StatefulSet MinIO 分布式集群的主控制器 serviceName 指向 Headless Service