有状态的控制器有以下几个特点
稳定,独特的网络标识符。
稳定,持久的存储。
有序,优雅的部署和扩展。
有序的自动滚动更新。
使用限制
StatefulSet是1.9之前的beta资源,在1.5之前的任何Kubernetes版本中都没有。 给定Pod的存储必须由PV根据请求进行配置storage class,或者由管理员预先配置。 删除和/或缩放StatefulSet将不会删除与StatefulSet关联的卷。这样做是为了确保数据安全,这通常比自动清除所有相关的StatefulSet资源更有价值。 StatefulSets目前要求HEADLESS负责Pod的网络身份。您有责任创建此服务。 删除StatefulSet时,StatefulSets不提供对pod终止的任何保证。要在StatefulSet中实现pod的有序和正常终止,可以在删除之前将StatefulSet缩减为0
组件
名为nginx的无头服务用于控制网络域。
StatefulSet,名为web,有一个Spec,表明nginx容器的3个副本将在唯一的Pod中启动。
该volumeClaimTemplates将使用提供稳定的存储PersistentVolumes由PersistentVolume置备供应。
下面我们来简单创建一个redis的state服务(未作主从配置)
首先要创建三个可用pv 供其使用 每个node节点都要安装nfs工具否则会卡住
[root@master pvc]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv-test-1 5Gi RWO Recycle Available slow 5s pv-test-2 5Gi RWO Recycle Available slow 5s pv-test-3 5Gi RWO Recycle Available slow 5s [root@master pvc]# cat pv.ymal apiVersion: v1 kind: PersistentVolume metadata: name: pv-test-1 namespace: default spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: slow nfs: path: /kube_pv server: 10.24.2.125 --- apiVersion: v1 kind: PersistentVolume metadata: name: pv-test-2 namespace: default spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: slow nfs: path: /kube_pv server: 10.24.2.125 --- apiVersion: v1 kind: PersistentVolume metadata: name: pv-test-3 namespace: default spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: slow nfs: path: /kube_pv server: 10.24.2.125
启动stateful
[root@master stateful]# cat redis-state.ymal apiVersion: v1 kind: Service metadata: name: redis-state-svc namespace: default spec: selector: app: redis clusterIP: "None" ports: - port: 6379 name: redis --- apiVersion: apps/v1 kind: StatefulSet metadata: name: redis-state spec: serviceName: redis-state-svc replicas: 3 selector: matchLabels: app: redis template: metadata: labels: app: redis spec: containers: - name: redis image: redis:4-alpine ports: - containerPort: 6379 name: redis volumeMounts: - name: redis-data mountPath: /data volumeClaimTemplates: - metadata: name: redis-data spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "slow" volumeMode: Filesystem resources: requests: storage: 2Gi
statefu 会根据副本数量启动的有编号的pod,并在更新或者删除的时候顺序操作。
这里应注意一点我们的redis镜像中默认启动过程中会对/data 目录进行chown 但是在nfs中这里需要对应设置很不便利