StatefulSet是控制器的一种,可以创建独特身份的POD。它提供有序的部署和伸缩。

  • 使用statefulset

  • 使用限制

  • 组成部分

  • pod识别

  • 保证部署和伸缩

使用statefulset

statefulset对以下应用是有价值的。

  • 稳定、唯一的网络访问地址

  • 稳定、持久的存储

  • 有序、优雅的部署和伸缩

  • 有序。优雅的删除和终止

上述描述中,稳定等同于在POD再次调度之后可以持久。如果应用不需要稳定的认证或有序的部署、删除、伸缩,你可以使用无状态的副本(例如Deployment或ReplicaSet)来部署你的应用,这将更适合无状态应用。

使用限制

  • Statefulset目前为bate版本,在1.5之前在任何发布版中都不可用

  • 类似所有alpha/beta资源,你可以通过apiserver参数--runtime-config禁用Statefulset

  • POD使用的持久化存储可以是基于storage class的动态卷,也可以是预先管理员分配的

  • 删除或缩减Statefulset不会删除分配的volumes。这是为了确保数据安全,数据比自动清除与statefulset关联的资源更重要

  • Statefulset当前需要一个Headless Service提供网络访问地址

  • 目前需要手动完成更新存在Statefulset

组成部分

  • 下面的示例描述Statefulset的组件。

  • 一个名为nginx的Headless Service,用于控制网络访问

  • 名为web的Statefulset,启动三个副本POD

  • volumeClaimTemplates将提供持久化存储

---
apiVersion: v1
kind: Service
metadata:
    name: nginx
    labels:
       app: nginx
spec:
   ports:
   - port: 80
     name: web
   clusterIP: None
   selector:
     app: nginx
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
    name: webspec:
    serviceName: "nginx"
    replicas: 3
    template:
        metadata:
              labels:
                 app: nginx
        spec:
            terminationGracePeriodSeconds: 10
            containers:
            - name: nginx
               p_w_picpath: gcr.io/google_containers/nginx-slim:0.8
               ports:
               - containerPort: 80
                 name: web
               volumeMounts:
               - name: www
                 mountPath: /usr/share/nginx/html
    volumeClaimTemplates:
    - metadata:
            name: www
            annotations:
                volume.beta.kubernetes.io/storage-class: anything
       spec:
           accessModes: [ "ReadWriteOnce" ]
           resources:
               requests:
                   storage: 1Gi

POD身份识别

StatefulSet POD有一个独特的身份识别,由一个序号、一个稳定的网络身份和稳定的存储。身份绑定POD,不管POD被调度到哪个节点上。

1)序号索引

Statefulset有N个实例,每个POD将被分配一个唯一的整数序号,范围在[1,N]。

2)稳定的网络ID

StatefulSet的每个POD的名称是由StatefulSet的名称和Pod序号组成。POD名称的格式为$(statefulset name)-$(ordinal)。上述示例中创建的POD名称为web-0,web-1,web-2。statefulset使用Headless Service控制POD的域名。service域名的格式为$(service name).$(namespace).svc.cluster.local,cluster.local为cluster domain。每个POD创建后会有一个匹配的域名,格式为$(podname).$(service_domain)。下表为示例,描述cluster domain、service name和statefulset name如何相互作用。

Cluster Domain Service (ns/name) StatefulSet (ns/name)
StatefulSet DomainPod DNSPod Hostnamecluster.localdefault/nginxdefault/webnginx.default.svc.cluster.localweb-{0..N-1}.nginx.default.svc.cluster.localweb-{0..N-1} cluster.localfoo/nginxfoo/webnginx.foo.svc.cluster.localweb-{0..N-1}.nginx.foo.svc.cluster.localweb-{0..N-1}kube.localfoo/nginx foo/webnginx.foo.svc.kube.local web-{0..N-1}.nginx.foo.svc.kube.localweb-{0..N-1} 

说明:Cluster Domain默认会被设置为cluster.local,除非额外配置。

3)稳定的存储

kubernets从volumeClaimTemplates创建PVC,在上述nginx的示例中,每个POD将得到一个从storage class分配的1G大小的PV。当POD调度到节点上时,volumeMounts挂载与PV关联的PVC。

说明:与PVC关联的PV,在POD或Statefulset删除之后不会被删除。必须手动删除。

保证部署和伸缩