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时候,主动重建后的数据仍然存在,阐明长久化是胜利的