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
# 第一步:执行以下命令创建 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
前提条件
获取镜像地址。镜像来源可以是平台管理员通过工具链集成的镜像仓库,也可以是第三方平台的镜像仓库。
操作步骤 - 配置基本信息
-
在 Container Platform 中,左侧导航栏进入 Workloads > StatefulSets。
-
点击 Create StatefulSet。
-
选择或输入镜像,点击 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 Templates | volumeClaimTemplates 是 StatefulSets 的关键特性,支持为每个 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
操作步骤 - 创建
点击 Create。
健康检查
管理 StatefulSets
使用 CLI 管理 StatefulSet
查看 StatefulSet
您可以查看 StatefulSet 以获取应用信息。
-
查看已创建的 StatefulSet。
-
获取 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,且这是默认值)。
删除 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 的 reclaimPolicy
为 Delete
,则在删除 PVC 时,PV 及其底层存储会自动被删除。
使用 Web 控制台管理 StatefulSet
查看 StatefulSet
- 在 Container Platform 中,进入 Workloads > StatefulSets。
- 找到要查看的 StatefulSet。
- 点击 StatefulSet 名称,查看 详情、拓扑、日志、事件、监控 等信息。
更新 StatefulSet
- 在 Container Platform 中,进入 Workloads > StatefulSets。
- 找到要更新的 StatefulSet。
- 在 Actions 下拉菜单中选择 Update,进入编辑 StatefulSet 页面,可更新
Replicas
、image
、updateStrategy
等参数。
删除 StatefulSet
- 在 Container Platform 中,进入 Workloads > StatefulSets。
- 找到要删除的 StatefulSet。
- 在 Actions 下拉菜单中,点击操作列的 Delete 按钮并确认。