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. Container Platform 中,左侧导航栏进入 Workloads > StatefulSets

  2. 点击 Create StatefulSet

  3. 选择输入镜像,点击 Confirm

INFO

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

Basic Info 部分,配置 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 TemplatesvolumeClaimTemplates 是 StatefulSets 的关键特性,支持为每个 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

操作步骤 - 创建

点击 Create

健康检查

管理 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. Container Platform 中,进入 Workloads > StatefulSets
  2. 找到要查看的 StatefulSet。
  3. 点击 StatefulSet 名称,查看 详情拓扑日志事件监控 等信息。

更新 StatefulSet

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

删除 StatefulSet

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