StatefulSets

目录

理解 StatefulSets

请参考 Kubernetes 官方文档:StatefulSets

StatefulSet 是 Kubernetes 的一种工作负载 API 对象,专为管理有状态应用设计,提供以下功能:

  • 稳定的网络身份:DNS 主机名格式为 <statefulset-name>-<ordinal>.<service-name>.ns.svc.cluster.local
  • 稳定的持久存储:通过 volumeClaimTemplates 实现。
  • 有序部署/扩缩容:Pod 按顺序创建/删除:Pod-0 → Pod-1 → Pod-N。
  • 有序滚动更新:Pod 按逆序号更新:Pod-N → Pod-0。

在分布式系统中,可以部署多个 StatefulSets 作为独立组件,提供专门的有状态服务(例如 Kafka brokersMongoDB shards)。

创建 StatefulSets

使用 CLI 创建 StatefulSet

前提条件

  • 确保已配置并连接到集群的 kubectl

YAML 文件示例

# example-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # 必须与 .spec.template.metadata.labels 匹配
  serviceName: 'nginx' # 该无头 Service 负责 Pod 的网络身份
  replicas: 3 # 定义期望的 Pod 副本数(默认:1)
  minReadySeconds: 10 # 默认值为 0
  template: # 定义 StatefulSet 的 Pod 模板
    metadata:
      labels:
        app: nginx # 必须与 .spec.selector.matchLabels 匹配
    spec:
      terminationGracePeriodSeconds: 10
      containers:
        - name: nginx
          image: registry.k8s.io/nginx-slim:0.24
          ports:
            - containerPort: 80
              name: web
          volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
  volumeClaimTemplates: # 定义 PersistentVolumeClaim (PVC) 模板。每个 Pod 会基于此动态创建唯一的 PersistentVolume (PV)。
    - metadata:
        name: www
      spec:
        accessModes: ['ReadWriteOnce']
        storageClassName: 'my-storage-class'
        resources:
          requests:
            storage: 1Gi
---
# example-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
    - port: 80
      name: web
  clusterIP: None
  selector:
    app: nginx

通过 YAML 创建 StatefulSet

# 第一步:执行以下命令创建 example-statefulset.yaml 中定义的 StatefulSet
kubectl apply -f example-statefulset.yaml

# 第二步:验证 StatefulSet 及其关联的 Pods 和 PVC 的创建状态:
kubectl get statefulset web # 查看 StatefulSet
kubectl get pods -l app=nginx # 查看该 StatefulSet 管理的 Pods
kubectl get pvc -l app=nginx # 查看 volumeClaimTemplates 创建的 PVC

使用 Web 控制台创建 StatefulSet

前提条件

获取镜像地址。镜像来源可以是平台管理员通过工具链集成的镜像仓库,也可以是第三方平台的镜像仓库。

  • 对于前者,管理员通常会将镜像仓库分配给您的项目,您可以使用其中的镜像。如果找不到所需的镜像仓库,请联系管理员分配。

  • 对于第三方平台的镜像仓库,请确保当前集群可以直接拉取镜像。

操作步骤 - 配置基础信息

  1. 容器平台,左侧导航栏进入 工作负载 > StatefulSets

  2. 点击 创建 StatefulSet

  3. 选择输入镜像,点击 确认

INFO

注意:使用 Web 控制台集成的镜像仓库时,可以通过 已集成 过滤镜像。集成项目名称 例如 images (docker-registry-projectname),其中包含该 Web 控制台中的项目名 projectname 和镜像仓库中的项目名 containers。

基础信息 区域,配置 StatefulSet 工作负载的声明式参数:

参数说明
副本数 (Replicas)定义 StatefulSet 中期望的 Pod 副本数(默认:1)。根据工作负载需求和预期请求量调整。
更新策略 (Update Strategy)控制 StatefulSet 滚动更新时的分阶段更新行为。默认且推荐使用 RollingUpdate 策略。
Partition 值:Pod 更新的序号阈值。
  • 序号 ≥ partition 的 Pod 立即更新。
  • 序号 < partition 的 Pod 保持之前的规格。
示例
  • Replicas=5(Pods:web-0 ~ web-4)
  • Partition=3(仅更新 web-3 和 web-4)
卷声明模板 (Volume Claim Templates)volumeClaimTemplates 是 StatefulSet 的关键特性,支持为每个 Pod 动态创建独立的持久存储。StatefulSet 中的每个 Pod 副本都会基于预定义模板自动获得专属的 PersistentVolumeClaim (PVC)。
  • 1. 动态 PVC 创建:自动为每个 Pod 创建唯一 PVC,命名格式为 <statefulset-name>-<claim-template-name>-<pod-ordinal>示例web-www-web-0web-www-web-1
  • 2. 访问模式:支持所有 Kubernetes 访问模式。
    • ReadWriteOnce (RWO - 单节点读写)
    • ReadOnlyMany (ROX - 多节点只读)
    • ReadWriteMany (RWX - 多节点读写)
  • 3. 存储类:通过 storageClassName 指定存储后端。未指定时使用集群默认 StorageClass。支持多种云/本地存储类型(如 SSD、HDD)。
  • 4. 容量:通过 resources.requests.storage 配置存储容量。示例:1Gi。若 StorageClass 支持,支持动态扩容。

操作步骤 - 配置 Pod

Pod 部分,请参考 Deployment - 配置 Pod

操作步骤 - 配置容器

Containers 部分,请参考 Deployment - 配置容器

操作步骤 - 创建

点击 创建

健康检查

管理 StatefulSets

使用 CLI 管理 StatefulSet

查看 StatefulSet

您可以查看 StatefulSet 以获取应用信息。

  • 查看 StatefulSet 是否已创建。

    kubectl get statefulsets
  • 获取 StatefulSet 详细信息。

    kubectl describe statefulsets

扩缩容 StatefulSet

  • 修改已有 StatefulSet 的副本数:

    kubectl scale statefulset <statefulset-name> --replicas=<new-replica-count>
  • 示例:

    kubectl scale statefulset web --replicas=5

更新 StatefulSet(滚动更新)

当修改 StatefulSet 的 Pod 模板(例如更改容器镜像)时,Kubernetes 默认执行滚动更新(前提是 updateStrategy 设置为 RollingUpdate,且这是默认值)。

  • 首先编辑 YAML 文件(如 example-statefulset.yaml)进行所需更改,然后应用:

    kubectl apply -f example-statefulset.yaml
  • 然后可以监控滚动更新进度:

    kubectl rollout status statefulset/<statefulset-name>

删除 StatefulSet

删除 StatefulSet 及其关联的 Pods:

kubectl delete statefulset <statefulset-name>

默认情况下,删除 StatefulSet 不会删除其关联的 PersistentVolumeClaims (PVCs) 或 PersistentVolumes (PVs),以防止数据丢失。若需同时删除 PVC,请显式执行:

kubectl delete pvc -l app=<label-selector-for-your-statefulset> # 示例:kubectl delete pvc -l app=nginx

另外,如果您的 volumeClaimTemplates 使用的 StorageClass 的 reclaimPolicyDelete,则在删除 PVC 时,PV 及其底层存储也会自动删除。

使用 Web 控制台管理 StatefulSet

查看 StatefulSet

  1. 容器平台,导航至 工作负载 > StatefulSets
  2. 找到您要查看的 StatefulSet。
  3. 点击 StatefulSet 名称查看 详情拓扑日志事件监控 等信息。

更新 StatefulSet

  1. 容器平台,导航至 工作负载 > StatefulSets
  2. 找到您要更新的 StatefulSet。
  3. 操作 下拉菜单中选择 更新,进入编辑 StatefulSet 页面,可更新 ReplicasimageupdateStrategy 等参数。

删除 StatefulSet

  1. 容器平台,导航至 工作负载 > StatefulSets
  2. 找到您要删除的 StatefulSet。
  3. 操作 下拉菜单中点击 删除 按钮并确认。