Kubernetes StatefulSet 简单示例模板
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web # StatefulSet 名称
labels:
app: nginx # 应用标签
spec:
serviceName: "nginx" # 关联的Headless Service名称,用于网络标识
replicas: 3 # 副本数量
selector:
matchLabels:
app: nginx # 必须匹配spec.template.metadata.labels
# Pod模板
template:
metadata:
labels:
app: nginx # 必须匹配spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10 # 优雅终止等待时间(秒)
containers:
- name: nginx # 容器名称
image: nginx:1.19 # 容器镜像
ports:
- containerPort: 80 # 容器暴露端口
name: web # 端口名称
volumeMounts:
- name: www # 挂载的卷名称,对应volumes中的名称
mountPath: /usr/share/nginx/html # 挂载到容器内的路径
# 卷声明模板(PVC模板)
volumeClaimTemplates:
- metadata:
name: www # 卷名称,与volumeMounts中的name对应
spec:
accessModes: [ "ReadWriteOnce" ] # 访问模式
storageClassName: "standard" # 存储类名称
resources:
requests:
storage: 1Gi # 存储空间请求大小
配套的Headless Service示例
apiVersion: v1
kind: Service
metadata:
name: nginx # Service名称,与StatefulSet中的serviceName对应
labels:
app: nginx
spec:
ports:
- port: 80 # Service端口
name: web # 端口名称
clusterIP: None # 设置为None表示创建Headless Service
selector:
app: nginx # 选择器标签,与StatefulSet中的标签匹配
关键特性注释说明
- 有序部署与扩展:
- StatefulSet中的Pod是按顺序创建的,从0到N-1
- 缩容时按相反顺序终止,从N-1到0
- 稳定的网络标识:
- 每个Pod会获得一个稳定的主机名:
<statefulset-name>-<ordinal-index>
- 示例中Pod名称将为:web-0, web-1, web-2
- 每个Pod会获得一个稳定的主机名:
- 稳定的持久化存储:
volumeClaimTemplates
为每个Pod创建独立的PVC- PVC命名格式:
<volumeClaimTemplate-name>-<pod-name>
- 示例中PVC名称将为:www-web-0, www-web-1, www-web-2
- 更新策略:
- 默认更新策略是RollingUpdate(可以显式指定)
- 也可以配置为OnDelete策略
- 服务发现:
- 通过Headless Service可以发现所有Pod
- DNS记录格式:
<pod-name>.<service-name>.<namespace>.svc.cluster.local
注意事项
- 删除StatefulSet时不会自动删除关联的PVC,需要手动删除
- 缩容前应确保数据已备份,因为缩容会删除PVC
- 确保配置适当的Pod反亲和性以避免所有副本运行在同一节点上
- 考虑配置适当的资源请求和限制
- 对于生产环境,建议配置就绪探针(readinessProbe)和存活探针(livenessProbe)
评论需开启科学上网!