一: 前言

1.使用StatefulSet的场景
a.稳定、唯一的网络标识
b.稳定、持久的存储
c.按照顺序、优雅的部署和扩容
d.按照顺序、优雅的删除和终止
e.按照顺序、自动滚动更新

2.StatefulSet的限制
a.在Kubernetes 1.9版本之前是beta版本,在Kubernetes 1.5版本之前是不提供的。
b.Pod存储由PersistentVolume(storage类或者管理员预先创建)提供。
c.删除或者缩容StatefulSet不会删除与StatefulSet关联的数据卷,这样能够保证数据的安全性。
d.当前的StatefulSets需要一个Headless服务来为Pod提供网络标识,此Headless服务需要通过手工创建。

二:存储供应模式
1.静态资源供应模式,通过PV和PVC完成绑定。
kubernetes实践之StatefulSet
2.动态资源供应模式,通过StorageClass和PVC完成资源动态绑定
kubernetes实践之StatefulSet

三: StatefulSet Nginx 应用实例

1. 创建三个pv (name分别为glusterfs-nginx-0,glusterfs-nginx-1,glusterfs-nginx-2)

点击(此处)折叠或打开

  • apiVersion: v1
  • kind: PersistentVolume
  • metadata:
  •   name: glusterfs-nginx-0
  •   namespace: default
  • spec:
  •   capacity:
  •     storage: 1Gi
  •   accessModes:
  •     - ReadWriteOnce
  •   glusterfs:
  •     endpoints: "glusterfs-cluster"
  •     path: "k8s-volume"
  •     readOnly: false

  • 2.创建三个pvc (name分别为glusterfs-nginx-0,glusterfs-nginx-1,glusterfs-nginx-2)

    点击(此处)折叠或打开

  • kind: PersistentVolumeClaim
  • apiVersion: v1
  • metadata:
  •   name: glusterfs-nginx-0
  •   namespace: default
  • spec:
  •   accessModes:
  •     - ReadWriteOnce
  •   resources:
  •     requests:
  •       storage: 1Gi
  • 3.创建Headless服务

    点击(此处)折叠或打开

  • apiVersion: v1
  • kind: Service
  • metadata:
  •      name: nginx
  •      labels:
  •         name: nginx
  • spec:
  •    ports:
  •    - port: 80
  •      targetPort: 80
  •    clusterIP: None
  •    selector:
  •       role: mongo
  • 4.创建StatefulSet

    点击(此处)折叠或打开

  • apiVersion: apps/v1beta1
  • kind: StatefulSet
  • metadata:
  •      name: nginx
  • spec:
  •    serviceName: "nginx"
  •    replicas: 3
  •    template:
  •       metadata:
  •            labels:
  •               role: nginx
  •       spec:
  •          terminationGracePeriodSeconds: 10
  •          containers:
  •          - name: nginx
  •            image: nginx
  •            ports:
  •            - containerPort: 80
  •            volumeMounts:
  •            - name: glusterfs
  •              mountPath: /usr/share/nginx/html
  •    volumeClaimTemplates:
  •    - metadata:
  •         name: glusterfs
  •      spec:
  •       accessModes: [ "ReadWriteOnce" ]
  •       resources:
  •         requests:
  •           storage: 1Gi
  • 四:备注
    1.StatfuleSet Pod拥有一个唯一的身份标识,它由顺序、稳定的网络标识和稳定的存储所组成。此身份标识一直跟随着Pod,不管它被调度到那个Node上。

    2.对于拥有N个副本集的StatefulSet,在StatefulSet中的每一个Pod都会被指派一个整型的序数,此序数在0和N之间,在整个集合中是唯一的。

    3.在StatefulSet中,每一个Pod的主机名称都由StatefulSet的名称和序数所组成。Pod的主机名称的格式:$(statefulset name)-$(ordinal)。如果创建了三个Pod,这他们的主机名称为web-0,web-1,web-2。StatefulSet能够使用Headless服务来控制Pod的域。Service管理的域的格式为:$(service name).$(namespace).svc.cluster.local,cluster.local是集群域。对于每一个被创建的Pod,它将得到一个DNS子域,格式为: $(podname).$(governing service domain),这里的管理服务在StatefulSet中,通过serviceName设置。

    相关文章: