kubernetes实践之StatefulSet
一: 前言
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完成绑定。
2.动态资源供应模式,通过StorageClass和PVC完成资源动态绑定
三: 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设置。