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

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

# 第 2 步:验证 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. Container Platform,左侧导航栏进入 Workloads > StatefulSets

  2. 点击 Create StatefulSet

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

INFO

注意:使用 Web 控制台集成的镜像仓库中的镜像时,可以通过 已集成 进行筛选。集成项目名称,例如镜像 (docker-registry-projectname),其中 projectname 是该 Web 控制台中的项目名,也是镜像仓库中的项目名。

基本信息 部分,配置 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 - Configure Pod

操作步骤 - 配置容器

Containers 部分,请参考 Deployment - Configure Containers

操作步骤 - 创建

点击 创建

健康检查

管理 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 使用了 reclaimPolicyDelete 的 StorageClass,则在删除 PVC 时,PV 及其底层存储会自动被删除。

使用 Web 控制台管理 StatefulSet

查看 StatefulSet

  1. Container Platform,进入 Workloads > StatefulSets
  2. 找到要查看的 StatefulSet。
  3. 点击 StatefulSet 名称,查看 详情拓扑日志事件监控 等信息。

更新 StatefulSet

  1. Container Platform,进入 Workloads > StatefulSets
  2. 找到要更新的 StatefulSet。
  3. 操作 下拉菜单中选择 更新,进入编辑 StatefulSet 页面,可更新 ReplicasimageupdateStrategy 等参数。

删除 StatefulSet

  1. Container Platform,进入 Workloads > StatefulSets
  2. 找到要删除的 StatefulSet。
  3. 操作 下拉菜单中点击 删除 按钮并确认。