Kubernetes StatefulSet

简介

StatefulSet是用于管理有状态应用的负载API对象(workload API object)。

Kubernetes中ReplicaSet,Pod这些都是属于集群的工作负载,它们统称为workload API object

管理一个Pod集合的部署和伸缩,并且保证Pod具有顺序和唯一性。

Deployment对象相同,StatefulSetPod使用相同的模板。不同的是,StatefulSet会给每个Pod一个固定的ID。这些Pod使用一样的模板,但是每个Pod的ID在Pod失败被重新调度情况下保持不变。

如果你想要使用存储卷给你的负载提供持久化,你可以使用StatefulSet。即使StatefulSet中的Pod有可能失败,但是持久化的Pod ID使得现有存储卷很容易匹配到重新调度的Pod,因为重新调度的Pod作为失败Pod的替代者具有和原来Pod一样的ID。

使用场景

StatefulSet适合具有以下需求的应用:

  1. 稳定,唯一网络ID
  2. 稳定,持久化存储
  3. 有序,有序可控的部署和伸缩
  4. 有序,自动化的有序滚动更新

稳定的其中一个含义是在Pod重调度场景下,Pod的一切保持不变。

限制

  1. 提供给Pod的存储或者通过基于PersistentVolume提供者(动态PV)或者管理员预先提供。
  2. 删除StatefulSet不会删除关联的存储卷(PV)。
  3. StatefulSet管理的Pod需要先把副本数调成0,因为StatefulSet管理的Pod的销毁是不可控的。
  4. 滚动升级中使用默认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为命名空间名字。

Kubernetes StatefulSet

上一篇:jquery的事件与动画


下一篇:CSS样式(二)