欢迎加入本站的kubernetes技术交流群,微信添加:加Blue_L。
statefulset区别于deployment有两个最重要的特性:有序性,固定性。
适用的场景
StatefulSets 对于需要满足以下一个或多个需求的应用程序很有价值:
- 稳定的、唯一的网络标识符
- 稳定的、持久的存储
- 有序的、优雅的部署和缩放
- 有序的、自动的滚动更新
限制
- pod的持久化存储基于pvc和pv。
- 为保证数据安全,删除或者收缩statefulset并不会自动删除它关联的存储卷。
- 需要手动创建无头服务使pod的dns可解析。
- 删除 statefulset时,并不按照有序性执行,要求有序的话,可以在删除之前将 statefulset 缩放为 0。
- 默认pod管理策略(OrderedReady) 时使用滚动更新,有可能会有更新终止,需要人为修复的状况。
有序性:
- 每个pod都有一个序号
- 部署时和扩容时根据序号递增依次启动新pod
- 缩容时依次根据序号递减依次删除pod
固定标识
statefulset在创建pod的时候会为每个pod分配下面几个固定的标识。
固定网络标识
pod的名称和pod的主机名是根据statefulset的名称和当前pod的序号组成的:$(statefulset-name)-$(ordinal)。dns解析需要无头服务。
规则
Cluster Domain | Service (ns/name) | StatefulSet (ns/name) | StatefulSet Domain | Pod DNS | Pod Hostname |
---|---|---|---|---|---|
cluster.local | default/nginx | default/web | nginx.default.svc.cluster.local | web-{0..N-1}.nginx.default.svc.cluster.local | web-{0..N-1} |
cluster.local | foo/nginx | foo/web | nginx.foo.svc.cluster.local | web-{0..N-1}.nginx.foo.svc.cluster.local | web-{0..N-1} |
kube.local | foo/nginx | foo/web | nginx.foo.svc.kube.local | web-{0..N-1}.nginx.foo.svc.kube.local | web-{0..N-1} |
固定存储
pvc名称规则:$(tpl-metadata.name)-$(podname)
pod标签
每个pod标签里会自动加一个 statefulset.kubernetes.io/pod-name 方便针对单个pod创建service。
pod管理策略
对于部署,扩缩容和更新时的并行度设置。
- OrderedReady(依次)
- Parallel(并行,只影响扩缩操作,对更新策略不生效)
更新策略
- 手动(需要手动删除pod)
- 滚动更新(自动更新)
- 分区(只更新指定序号以及后面的)
强制回滚
因意外滚动更新失败时,在回滚后需要手动删除失败的pod以便回滚流程执行。
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
serviceName: "nginx"
replicas: 3 # by default is 1
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "my-storage-class"
resources:
requests:
storage: 1Gi
操作:
- 创建statefulset
- 删除statefulset
- 扩缩statefulset
- 更新statefulset
- 回滚statefulset
链接
概念:https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
参考:https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/stateful-set-v1/