14.statefulset服务

有状态的控制器有以下几个特点

稳定,独特的网络标识符。
稳定,持久的存储。
有序,优雅的部署和扩展。
有序的自动滚动更新。

使用限制

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中这里需要对应设置很不便利

原文地址:https://www.cnblogs.com/leleyao/p/10502416.html