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 brokers、MongoDB shards)。
创建 StatefulSets
使用 CLI 创建 StatefulSet
前提条件
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
前提条件
获取镜像地址。镜像来源可以是平台管理员通过工具链集成的镜像仓库,也可以是第三方平台的镜像仓库。
操作步骤 - 配置基本信息
-
在 Container Platform,左侧导航栏进入 Workloads > StatefulSets。
-
点击 Create StatefulSet。
-
选择或输入镜像,点击 确认。
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-0 、web-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 以获取应用信息。
kubectl describe statefulsets
扩缩容 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
使用了 reclaimPolicy
为 Delete
的 StorageClass,则在删除 PVC 时,PV 及其底层存储会自动被删除。
使用 Web 控制台管理 StatefulSet
查看 StatefulSet
- 在 Container Platform,进入 Workloads > StatefulSets。
- 找到要查看的 StatefulSet。
- 点击 StatefulSet 名称,查看 详情、拓扑、日志、事件、监控 等信息。
更新 StatefulSet
- 在 Container Platform,进入 Workloads > StatefulSets。
- 找到要更新的 StatefulSet。
- 在 操作 下拉菜单中选择 更新,进入编辑 StatefulSet 页面,可更新
Replicas
、image
、updateStrategy
等参数。
删除 StatefulSet
- 在 Container Platform,进入 Workloads > StatefulSets。
- 找到要删除的 StatefulSet。
- 在 操作 下拉菜单中点击 删除 按钮并确认。