StatefulSet

适应场景:

  • [x] 稳固且惟一的网络标识符
  • [x] 稳固且长久的存储
  • [x] 有序,优雅的部署和扩大
  • [x] 有序,优雅的删除和终止
  • [x] 有序而主动的滚动更新

通用的StatefulSet形成:

  • [x] Headless Service
  • [x] StatefulSet
  • [x] volumeClaimTemplate

构建NFS文件系统

装置NFS文件系统
$ yum install -y nfs-common nfs-utils rpcbind$ mkdir /nfsdata /nfs1$ chmod 666 /nfsdata$ chown nfsnobody /nfsdata$ cat /etc/exports/data/nfs1 *(rw,no_root_squash,no_all_squash,sync)/data/nfs2 *(rw,no_root_squash,no_all_squash,sync)$ systemctl start rpcbind$ systemctl start nfs
#  在kubernetes节点或者是minikube主机上用工具挂载测试$ sudo mount -t nfs 172.16.56.138:/data/nfs1 /data$ ls /dataindex.html

StatefulSet/PV/PVC实战

创立PV
$ cat nfs-pv.yaml apiVersion: v1kind: PersistentVolumemetadata:  name: nfspv1spec:  capacity:    storage: 10Gi  accessModes:    - ReadWriteOnce  persistentVolumeReclaimPolicy: Retain  storageClassName: nfs  nfs:    path: /data/nfs1    server: 172.16.56.138    $ kubectl apply -f nfs-pv.yaml$ kubectl get pvNAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGEnfspv1   10Gi       RWO            Retain           Available           nfs                     5s

编排StatefulSet/PV资源
$cat statefulset-demo.yamlapiVersion: v1kind: Servicemetadata:  name: myapp-svc  labels:    app: myapp-svcspec:  ports:  - port: 80    name: web  clusterIP: None  selector:    app: myapp-pod---apiVersion: apps/v1kind: StatefulSetmetadata:  name: myappspec:  serviceName: myapp-svc  replicas: 2  selector:    matchLabels:      app: myapp-pod  template:    metadata:      labels:        app: myapp-pod    spec:      containers:      - name: myapp        image: nginx:latest        ports:        - containerPort: 80          name: web        volumeMounts:        - name: myappdata          mountPath: /usr/share/nginx/html  volumeClaimTemplates:  - metadata:      name: myappdata    spec:      accessModes: [ "ReadWriteOnce" ]      storageClassName: "nfs"            # 动静pvc      resources:        requests:          storage: 2Gi#    volumes:#      - name: myappdata#        persistentVolumeClaim:              #指定pvc#          claimName: nfspv1
$ kubectl apply -f statefulset-demo.yamlservice/myapp-svc createdstatefulset.apps/myapp created$ kubectl get pvNAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                       STORAGECLASS   REASON   AGEnfspv1   10Gi       RWO            Retain           Bound    default/myappdata-myapp-0   nfs                     31s       $ kubectl get pvcNAME                STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGEmyappdata-myapp-0   Bound     nfspv1   10Gi       RWO            nfs            50smyappdata-myapp-1   Pending                                      nfs            38s$ kubectl get statefulsetNAME    READY   AGEmyapp   1/2     60s$ kubectl get podNAME      READY   STATUS    RESTARTS   AGEmyapp-0   1/1     Running   0          75smyapp-1   0/1     Pending   0          63s
$ kubectl describe pod myapp-1...Events:  Type     Reason            Age        From               Message  ----     ------            ----       ----               -------  Warning  FailedScheduling  <unknown>  default-scheduler  error while running "VolumeBinding" filter plugin for pod "myapp-1": pod has unbound immediate PersistentVolumeClaims  Warning  FailedScheduling  <unknown>  default-scheduler  error while running "VolumeBinding" filter plugin for pod "myapp-1": pod has unbound immediate PersistentVolumeClaims

# 测试statefulset是否会随着pod删除而完结$ kubectl exec -ti myapp-0 -- sh# date >/usr/share/nginx/html/index.html# more /usr/share/nginx/html/index.htmlSun Apr 19 17:34:25 UTC 2020$ kubectl delete pod myapp-0# 再次检测,还是存在,未被删除$ kubectl exec -ti myapp-0 -- sh$ more /usr/share/nginx/html/index.htmlSun Apr 19 17:34:25 UTC 2020# 登陆nfs服务器,查看挂载目录nfs-server$ cat /data/nfs1/index.html Sun Apr 19 17:34:25 UTC 2020
能够发现写的数据是存在nfs文件系统上,当删除一个用statefulset创立的pod时候,主动重建后的数据仍然存在,阐明长久化是胜利的

【完结】