Kubernetes StatefulSet
简介
StatefulSet是用于管理有状态应用的负载API对象(workload API object)。
Kubernetes中ReplicaSet,Pod这些都是属于集群的工作负载,它们统称为workload API object
管理一个Pod集合的部署和伸缩,并且保证Pod具有顺序和唯一性。
与Deployment对象相同,StatefulSet的Pod使用相同的模板。不同的是,StatefulSet会给每个Pod一个固定的ID。这些Pod使用一样的模板,但是每个Pod的ID在Pod失败被重新调度情况下保持不变。
如果你想要使用存储卷给你的负载提供持久化,你可以使用StatefulSet。即使StatefulSet中的Pod有可能失败,但是持久化的Pod ID使得现有存储卷很容易匹配到重新调度的Pod,因为重新调度的Pod作为失败Pod的替代者具有和原来Pod一样的ID。
使用场景
StatefulSet适合具有以下需求的应用:
- 稳定,唯一网络ID
 - 稳定,持久化存储
 - 有序,有序可控的部署和伸缩
 - 有序,自动化的有序滚动更新
 
稳定的其中一个含义是在Pod重调度场景下,Pod的一切保持不变。
限制
- 提供给Pod的存储或者通过基于PersistentVolume提供者(动态PV)或者管理员预先提供。
 - 删除StatefulSet不会删除关联的存储卷(PV)。
 - StatefulSet管理的Pod需要先把副本数调成0,因为StatefulSet管理的Pod的销毁是不可控的。
 - 滚动升级中使用默认Pod管理策略可能出现错误,需要手动干预。
 
YAML Components
下面是一个StatefulSet的例子:
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
上面定义了一个Headless Service(名字为nginx),用于控制域名。
StatefulSet(名字为web)指定需要三个nginx副本。volumeClaimTemplates声明使用PV提供者提供的动态PV。
StatefulSet Pod
StatefulSet Pods有唯一的ID,假如有N个副本(序号就是0-N-1),Pod具有唯一的域名,ID和存储。不管Pod被(重)调度哪个节点。
Pod的名字
$(statefulset name)-$(ordinal),上面的例子中叫web-0,web-1,web-2.
Pod主机名和Pod名相同。
Pod DNS
Headless Service 定义的前缀,$(podname).$(service name).$(namespace).svc.cluster.local,比如:web-0.nginx.default.svc.cluster.local 
其中cluster.local为集群DNS(Cluster Domain),default为命名空间名字。

                
            
        
浙公网安备 33010602011771号