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 /data
index.html

a.jpg

b.jpg

StatefulSet/PV/PVC实战

创建PV
$ cat nfs-pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfspv1
spec:
  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 pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
nfspv1   10Gi       RWO            Retain           Available           nfs                     5s

c.jpg

编排StatefulSet/PV资源
$cat statefulset-demo.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
  labels:
    app: myapp-svc
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: myapp-pod
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: myapp
spec:
  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.yaml
service/myapp-svc created
statefulset.apps/myapp created

$ kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                       STORAGECLASS   REASON   AGE
nfspv1   10Gi       RWO            Retain           Bound    default/myappdata-myapp-0   nfs                     31s
       
$ kubectl get pvc
NAME                STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
myappdata-myapp-0   Bound     nfspv1   10Gi       RWO            nfs            50s
myappdata-myapp-1   Pending                                      nfs            38s

$ kubectl get statefulset
NAME    READY   AGE
myapp   1/2     60s

$ kubectl get pod
NAME      READY   STATUS    RESTARTS   AGE
myapp-0   1/1     Running   0          75s
myapp-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

d.jpg

e.jpg

# 测试statefulset是否会随着pod删除而结束
$ kubectl exec -ti myapp-0 -- sh
# date >/usr/share/nginx/html/index.html
# more /usr/share/nginx/html/index.html
Sun Apr 19 17:34:25 UTC 2020

$ kubectl delete pod myapp-0

# 再次检测,还是存在,未被删除
$ kubectl exec -ti myapp-0 -- sh
$ more /usr/share/nginx/html/index.html
Sun 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时候,自动重建后的数据依然存在,说明持久化是成功的

f.jpg

【完结】


pa0v0
1 声望0 粉丝