Kubernetes 持久化資料儲存 StorageClass

菜鳥運維筆記發表於2021-09-08

文章連結
PVPVC 模式要先建立好 PV,然後再定義好 PVC 進行一對一的繫結。那麼如果遇到大叢集,也一一的建立嗎?這樣來說維護成本很高,工作量大。這個時候就有了 Kubernetes 提供一種自動建立 PV 的機制,叫 StorageClass ,它的作用就是建立 PV 的模板。

StorageClass 會定義兩部分:

  • PV的屬性:
    比如儲存的大小、型別等
  • PV需要使用到的儲存外掛
    比如Ceph等;

有了這兩部分資訊,Kubernetes 就能夠根據使用者提交的 PVC ,找到對應的 StorageClass ,然後 Kubernetes 就會呼叫 StorageClass 宣告的儲存外掛,自動建立 PV

不過要使用 NFS ,我們就需要一個 nfs-client 的外掛。這個外掛會使 NFS 服務自動幫我們建立 PV

自動建立的 PV 會以 ${namespace}-${pvcName}-${pvName} 的格式儲存
如果 PV 被回收,則會以 archieved-${namespace}-${pvcName}-${pvName} 的格式儲存
詳細可以參考 Github
PV、PVC、NFS不再介紹,沒有完成的請檢視 kubernetes使用PV和PVC管理資料儲存

建立ServiceAccount

建立 ServiceAccount 的目的是為了給 nfs-client 授權。

# 下載 rbac.yaml
wget https://github.com/kubernetes-retired/external-storage/blob/201f40d78a9d3fd57d8a441cfc326988d88f35ec/nfs-client/deploy/rbac.yaml

部署 rbac.yaml

kubectl  apply  -f   rbac.yaml 
# 輸出如下
serviceaccount/nfs-client-provisioner created
clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created
role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created

建立 nfs-client

使用 Deployment 來建立 nfs-client

# 下載 deployment.yaml
wget https://github.com/kubernetes-retired/external-storage/blob/201f40d78a9d3fd57d8a441cfc326988d88f35ec/nfs-client/deploy/deployment.yaml

修改 yaml 如下

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:latest
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs      # 這裡的供應者名稱必須和class.yaml中的provisioner的名稱一致,否則部署不成功
            - name: NFS_SERVER
              value: 10.0.10.51          # 這裡寫NFS伺服器的IP地址或者能解析到的主機名
            - name: NFS_PATH
              value: /home/bsh/nfs       # 這裡寫NFS伺服器中的共享掛載目錄(強調:這裡的路徑必須是目錄中最後一層的資料夾,否則部署的應用將無許可權建立目錄導致Pending)
      volumes:
        - name: nfs-client-root
          nfs:
            server: 10.0.10.51          # NFS伺服器的IP或可解析到的主機名 
            path: /home/bsh/nfs        # NFS伺服器中的共享掛載目錄(強調:這裡的路徑必須是目錄中最後一層的資料夾,否則部署的應用將無許可權建立目錄導致Pending)

⚠️ 注意
value: fuseim.pri/ifs # 這裡的供應者名稱必須和 class.yaml 中的 provisioner 的名稱一致,否則部署不成功

建立檢查

# 部署 nfs-client
kubectl  apply  -f   deployment.yaml
# 輸出如下
deployment.apps/nfs-client-provisioner created

檢視pod

kubectl get pod
# 輸出如下
NAME                                     READY   STATUS    RESTARTS   AGE
nfs-client-provisioner-fd74f99b4-wr58j   1/1     Running   1          30s

建立 StorageClass

class.yaml 內容比較少,可以不用下載,具體內容如下
class.yaml 下載地址

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage
provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
  archiveOnDelete: "false"

⚠️ 注意
provisioner 必須和上面得 Deployment 的 YAML 檔案中 PROVISIONER_NAME 的值保持一致。

建立 storageclass

# 建立 
kubectl  apply  -f  class.yaml 
# 輸出如下
storageclass.storage.k8s.io/managed-nfs-storage created

檢視狀態

kubectl get storageclass
# 輸出如下
NAME                  PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
managed-nfs-storage   fuseim.pri/ifs   Delete          Immediate           false                  53s

建立 PVC

建立 tomcat-storageclass-pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: tomcat
  annotations:
    volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 500Mi

部署 yaml

kubectl  apply  -f tomcat-storageclass-pvc.yaml
# 輸出如下
persistentvolumeclaim/tomcat created

檢視狀態

kubectl get pvc
# 輸出如下
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
tomcat       Bound    pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec   500Mi      RWX            managed-nfs-storage   48s

pod 使用新增 pvc

還拿之前的 tomcat 做實驗,我們把 tomcat 目錄下的 logs 拿到本地 nfs 中。

⚠️ 注意
如果遇到使用PVC 建立 pod 的時候發現無法建立成功。出現一下報錯的時候請參考 kubernetes 使用 PCV 建立 pod 報錯 persistentvolume-controller waiting for a volume to be created
cnsre運維部落格|Linux運維|自動化運維|雲端計算|運維監控

具體 yaml 如下:

apiVersion: apps/v1 
kind: Deployment   
metadata:             
  name: tomcat-deployment     
  labels:       
    app: tomcat  
spec:          
  replicas: 3
  selector:      
    matchLabels: 
      app: tomcat
  minReadySeconds: 1
  progressDeadlineSeconds: 60
  revisionHistoryLimit: 2
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:        
    metadata:  
      labels:  
        app: tomcat
    spec:         
      containers:     
      - name: tomcat     
        image: wenlongxue/tomcat:tomcat-demo-62-123xw2    
        imagePullPolicy: Always          
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "2Gi"
            cpu: "80m"
          limits: 
            memory: "2Gi" 
            cpu: "80m"
        readinessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 180
          periodSeconds: 5
          timeoutSeconds: 3
          successThreshold: 1
          failureThreshold: 30
        volumeMounts:
        - mountPath: "/usr/local/tomcat/logs"
          name: tomcat
# pvc 部分
      volumes:
      - name: tomcat
        persistentVolumeClaim:
          claimName: tomcat
---
# Service 服務部分
apiVersion: v1
kind: Service
metadata:      
  name: tomcat-service
  labels:      
    app: tomcat 
spec:        
  selector:   
    app: tomcat  
  ports:
  - name: tomcat-port 
    protocol: TCP      
    port: 8080         
    targetPort: 8080   
  type: ClusterIP 
---
# ingress 服務部分
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tomcat
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  tls:
  - hosts:
    - tomcat.cnsre.cn
    secretName: tls-secret
  rules:
  - host: tomcat.cnsre.cn
    http:
      paths:
      - path: "/"
        pathType: Prefix
        backend:
          service:
            name: tomcat-service
            port:
              number: 8080

部署 pod 服務

kubectl  apply  -f tomcatc.yaml
# 輸出如下
deployment.apps/tomcat-deployment created

檢視狀態

kubectl get pod
# 輸出如下
NAME                                     READY   STATUS    RESTARTS   AGE
nfs-client-provisioner-fd74f99b4-wr58j   1/1     Running   0          76m
tomcat-deployment-7588b5c8fd-cnwvt       1/1     Running   0          59m
tomcat-deployment-7588b5c8fd-kl8fj       1/1     Running   0          59m
tomcat-deployment-7588b5c8fd-ksbg9       1/1     Running   0          59m

檢視 PV PVC

[root@master tomccat]# kubectl  get  pv,pvc
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM            STORAGECLASS          REASON   AGE
persistentvolume/pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec   500Mi      RWX            Delete           Bound    default/tomcat   managed-nfs-storage            65m

NAME                           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
persistentvolumeclaim/tomcat   Bound    pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec   500Mi      RWX            managed-nfs-storage   65m

檢視 nfs server 目錄中資訊

[root@node1 ~]# ll /home/bsh/nfs/default-tomcat-pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec/
總用量 220
-rw-r-----. 1 root root  22217 9月   3 14:49 catalina.2021-09-03.log
-rw-r-----. 1 root root      0 9月   3 14:41 host-manager.2021-09-03.log
-rw-r-----. 1 root root   2791 9月   3 14:49 localhost.2021-09-03.log
-rw-r-----. 1 root root 118428 9月   3 15:31 localhost_access_log.2021-09-03.txt
-rw-r-----. 1 root root      0 9月   3 14:41 manager.2021-09-03.log

文章連結

相關文章