有状态 无状态

有状态服务(Stateful Service)
需要存储持久化数据

无状态服务(Stateless Service)
不需要存储持久化数据,并且多个实例对于同一个请求响应的结果是完全一致的

特点

Pod 副本的创建默认会按照序列号升序处理,副本的更新和删除会按照序列号降序处理
Pod 的名称的形式为 - name-0,name-1
配合 headless service , 每个 pod 会有一条 dns 条目(pod名.svc名.namespace名 )
pod 重建后 ip改变但是 podname 及对应的 dns 解析不变
pod重建后正常访问之前的存储数据,基于 pvc

示例


  1. apiVersion: apps/v1
  2. kind: StatefulSet
  3. metadata:
  4. name: nginx-sts
  5. spec:
  6. serviceName: nginx-sts-svc
  7. replicas: 3
  8. selector:
  9. matchLabels:
  10. app: nginx-sts
  11. template:
  12. metadata:
  13. labels:
  14. app: nginx-sts
  15. spec:
  16. containers:
  17. - image: nginx
  18. name: nginx-sts-pod

image.png

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: nginx-sts-svc
  5. spec:
  6. ports:
  7. - port: 80
  8. protocol: TCP
  9. targetPort: 80
  10. clusterIP: None
  11. selector:
  12. app: nginx-sts

副本 pod 对 svc 的解析
image.png

其它 pod 对 svc 的解析
image.png

删除一个 pod 后 解析变化 nginx-sts-1 由 172.11.140.92 重建 172.11.140.82
image.png

pod 重建 ip 会变化,但是 对应的主机名不变
image.png

image.png

注意点

必须指定 serviceName

sts.spec

podManagementPolicy

OrderedReady 默认,有序
Parallel 并发

updateStrategy

updateStrategy:
type: RollingUpdate
rollingUpdate:
partition: 2 # 更新大于等于这个索引的 pod

volumeClaimTemplates

volumeClaimTemplates:
- apiVersion:
kind:
metadata:
spec: