k8s集群,使用pvc方式實現數據持久化存儲


環境:

系統  華為openEulerOS(CentOS7)
k8s版本 1.17.3
master   192.168.1.244  
node1 192.168.1.245

 

介紹:

Kubernetes中,當Pod重建的時候,數據是會丟失的,Kubernetes也是通過數據卷掛載來提供Pod數據的持久化的。Kubernetes數據卷是對Docker數據卷的擴展,Kubernetes數據卷是Pod級別的,可以用來實現Pod中容器的文件共享。

 

部署:

安裝nfs

兩台節點都需要操作:

yum install -y nfs-utils rpcbind

systemctl start nfs

systemctl start rpcbind

master節點配置nfs

[root@master ~]#vim /etc/exports

/data/iserver-map 192.168.1.0/24(rw,no_root_squash,sync)
/data/iserver-webapps 192.168.1.0/24(rw,no_root_squash,sync)
/data/iserver-license 192.168.1.0/24(rw,no_root_squash,sync)
/data/gisserver-license 192.168.1.0/24(rw,no_root_squash,sync)
/data/gisserver-webapps 192.168.1.0/24(rw,no_root_squash,sync)

注釋:

/data          #代表共享出來的目錄

192.168.1.0/24   #允許192.168.1.0/24的網絡訪問此共享。

rw            #表示權限 讀寫

sync          #表示同步寫入

no_root_squash    #表示客戶機以root訪問時賦予本地root權限

master節點上創建一個共享目錄

[root@master ~]# mkdir /data/

這里/data 目錄需求比較大,可以添加磁盤,相關命令:

fdisk /dev/sdd

mkfs.ext4 /dev/sdd1

mount /dev/sdd1 /data

給data目錄所有權限

chmod 777 /data

啟動nfs服務

[root@master ~]#systemctl start nfs
[root@master ~]#systemctl start rpcbind
[root@k8s-node1 ~]# systemctl restart nfs
[root@k8s-node1 ~]# systemctl restart rpcbind

節點查看nfs

[root@k8s-node1 ~]# showmount 192.168.1.244 -e
Export list for 192.168.1.244:
/data/gisserver-webapps 192.168.1.0/24
/data/gisserver-license 192.168.1.0/24
/data/iserver-license 192.168.1.0/24
/data/iserver-webapps 192.168.1.0/24
/data/iserver-map 192.168.1.0/24

在master上創建pv、pvc、namespace、svc、deployment  yaml文件

mkdir /dwz/iserver -p

vim namespeace-vrgv.yaml

apiVersion: v1
kind: Namespace
metadata:
name: vrgv #namespace名稱為vrgv 
labels:
name: vrgv #namespace標簽為vrgv
vim iserver-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: iserver
  namespace: vrgv
spec:
  replicas: 1
  selector:
    matchLabels:
      app: iserver
  template:
    metadata:
      labels:
        app: iserver
    spec:
      nodeSelector:
        node1: iserver
      hostname: vrgv
      hostAliases:
      - ip: 192.168.1.226                    #這個ip是創建出psql的svc的ip地址
        hostnames:
        - "vrgvtech.com"                      #必須是vrgvtech.com
#      initcontainers:
#      - name: meijie
#        image: iserver:20200827-1
#        command: ['sleep 10']
#        imagePullPolicy: Never
      restartPolicy: Always
      containers:
      - name: iserver
        image: k8s-vrgvgis-standard:20200923                    #填寫iserver服務的鏡像
        imagePullPolicy: Never                #只從本地獲取鏡像
        command: ["/bin/sh","-c","/app/dwz.sh"]
#        livenessProbe:
#          httpGet:
#            port: 8090                        #探測8090端口
#            path: /iserver          #探測8090端口下的/portal/index.html網頁能否正常打開(根據返回碼)
#          initialDelaySeconds: 100              #容器啟動后第一次執行探測是需要等待多少秒
#          periodSeconds: 2                  #執行探測的頻率。默認是10秒,最小1秒。
#        livenessProbe:
#         exec:
#           command:
#           - /usr/bin/sed
#           - -i
#           - '"s+ServerActive=vrgv+ServerActive=vrgv123_$ZBX_HOST_TAG+" /etc/zabbix/zabbix_agentd.conf'
#         initialDelaySeconds: 1              #容器啟動后第一次執行探測是需要等待多少秒
#         periodSeconds: 2                  #執行探測的頻率。默認是10秒,最小1秒。
        securityContext:
          privileged: true                    #容器內部擁有root權限
        ports:
        - name: iserver8090
          containerPort: 8090
        ports:
        - name: agent10050
          containerPort: 10050
        volumeMounts:
        - name: pv-iserver-map                   #自定義名稱,需要與下面的volumes.name 一致
          mountPath: /app/map
        - name: pv-iserver-webapps                   #自定義名稱,需要與下面的volumes.name 一致
          mountPath: /app/iserver/webapps
        - name: pv-iserver-license                   #自定義名稱,需要與下面的volumes.name 一致
          mountPath: /opt/SuperMap/License
        env:                          #注入容器內的環境變量
        - name: ZBX_HOST_TAG
          value: "123456"
        - name: ServerActive
          value: "zabbixproxy.ops:10051,zabbixproxytls.ops:10051"
      volumes:
      - name: pv-iserver-map                      #自定義名稱
        persistentVolumeClaim:
          claimName: nfs-iserver-map               #pvc名字
      - name: pv-iserver-webapps                      #自定義名稱
        persistentVolumeClaim:
          claimName: nfs-iserver-webapps               #pvc名字
      - name: pv-iserver-license                      #自定義名稱
        persistentVolumeClaim:
          claimName: nfs-iserver-license               #pvc名字

[root@k8s-master iserver]# cat pv-iserver-map.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-iserver-map
  namespace: vrgv
#  labels:
#    type: vrgv                    #與下面pvc中的selector.matchLabels.type一致才能關聯成功
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: pv-iserver-map
  nfs:
    path:  "/data/iserver-map"             #掛載目錄
    server: 192.168.1.244          #共享主機IP
    readOnly: false
[root@k8s-master iserver]# cat pv-iserver-license.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-iserver-license
  namespace: vrgv
#  labels:
#    type: vrgv                    #與下面pvc中的selector.matchLabels.type一致才能關聯成功
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: pv-iserver-license
  nfs:
    path:  "/data/iserver-license"
    server: 192.168.1.244          #共享主機IP
    readOnly: false
[root@k8s-master iserver]# cat pv-iserver-webapps.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-iserver-webapps
  namespace: vrgv
#  labels:
#    type: vrgv                    #與下面pvc中的selector.matchLabels.type一致才能關聯成功
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: pv-iserver-webapps
  nfs:
    path:  "/data/iserver-webapps"
    server: 192.168.1.244          #共享主機IP
    readOnly: false
[root@k8s-master iserver]# cat pvc-iserver-map.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nfs-iserver-map
  namespace: vrgv
spec:
  accessModes:
    - ReadWriteMany                          #讀寫權限,允許被多個node掛載
  resources:
    requests:
      storage: 1Gi
  storageClassName: pv-iserver-map
#  selector:
#      matchLabels:
#        type: "vrgv"
[root@k8s-master iserver]# cat pvc-iserver-license.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nfs-iserver-license
  namespace: vrgv
spec:
  accessModes:
    - ReadWriteMany                          #讀寫權限,允許被多個node掛載
  resources:
    requests:
      storage: 1Gi
  storageClassName: pv-iserver-license
#  selector:
#      matchLabels:
#        type: "vrgv"
[root@k8s-master iserver]# cat pvc-iserver-webapps.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nfs-iserver-webapps
  namespace: vrgv
spec:
  accessModes:
    - ReadWriteMany                          #讀寫權限,允許被多個node掛載
  resources:
    requests:
      storage: 10Gi
  storageClassName: pv-iserver-webapps
#  selector:
#      matchLabels:
#        type: "vrgv"
[root@k8s-master iserver]# cat iserver-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: iserver
  namespace: vrgv
spec:
  type: NodePort
  ports:
  - name: iserver
    nodePort: 30010       #端口可自定義
    port: 8090
    protocol: TCP
  selector:
    app: iserver
  sessionAffinity: ClientIP

創建各資源

[root@k8s-master iserver]# kubectl create -f iserver-deployment.yaml
[root@k8s-master iserver]# kubectl create -f iserver-svc.yaml
[root@k8s-master iserver]# kubectl create -f pv-iserver-map.yaml 
[root@k8s-master iserver]# kubectl create -f pv-iserver-license.yaml 
[root@k8s-master iserver]# kubectl create -f pv-iserver-webapps.yaml 
[root@k8s-master iserver]# kubectl create -f pvc-iserver-map.yaml 
[root@k8s-master iserver]# kubectl create -f pvc-iserver-license.yaml 
[root@k8s-master iserver]# kubectl create -f pvc-iserver-webapps.yaml 
[root@k8s-master iserver]# kubectl create -f namespeace-vrgv.yaml

注釋:

      ReadWriteOnce   讀寫權限,並且只能被單個Node掛載

      ReadOnlyMany    只讀權限,允許被多個Node掛載

      ReadWriteMany   讀寫權限,允許被多個Node掛載

Retain 管理員回收:kubectl delete pv pv-name 創建:kubectl apply -f pv-name.yaml Retain策略 在刪除pvcPV變為Released不可用狀態, 若想重新被使用,需要管理員刪除pv,重新創建pv,刪除pv並不會刪除存儲的資源,只是刪除pv對象而已;若想保留數據,請使用該Retain,

Recycle策略刪除pvc自動清除PV中的數據,效果相當於執行 rm -rf /thevolume/*. 刪除pvc.pv的狀態由Bound變為Available.此時可重新被pvc申請綁定

Delete 刪除存儲上的對應存儲資源,例如 AWS EBSGCE PDAzure DiskOpenStack Cinder Volume ,NFS不支持delete策略

storageClassName :在pvc的請求存儲大小和訪問權限與創建的pv一致的情況下 根據storageClassName進行與pv綁定。常用在pvc需要和特定pv進行綁定的情況下。舉例:當有創建多個pv設置存儲的大小和訪問權限一致時,且pv,pvc沒有配置storageClassName時,pvc會根據存儲大小和訪問權限去隨機匹配。如果配置了storageClassName會根據這三個條件進行匹配。當然也可以用其他方法實現pvc與特定pv的綁定如標簽.

pv是沒有namespace的概念,也就沒有租戶的概念,但 pvc 有租戶的概念,當需要在某個 namespace 下使用 pvc 時,需要指定該 pvc 所屬 namespace

 

 

查看pv狀態

[root@k8s-master iserver]# kubectl get pv
NAME                   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                        STORAGECLASS           REASON   AGE
pv-iserver-license     10Gi       RWX            Retain           Bound    vrgv/nfs-iserver-license     pv-iserver-license              12h
pv-iserver-map         10Gi       RWX            Retain           Bound    vrgv/nfs-iserver-map         pv-iserver-map                  12h
pv-iserver-webapps     20Gi       RWX            Retain           Bound    vrgv/nfs-iserver-webapps     pv-iserver-webapps              12h

注釋:STATUS可能存在一下4個階段之一

      Available 可用狀態,還未與某個PVC綁定

      Bound     已與某個PVC綁定

      Released  綁定得PVC已經刪除,資源已釋放,但沒有被集群回收

      Failed    自動資源回收失敗

 

查看pod狀態

[root@k8s-master iserver]# kubectl get pod -n vrgv
NAME                       READY   STATUS    RESTARTS   AGE
iserver-74b6497d98-kxdbw   1/1     Running   0          44m

如狀態是running,說明pvc掛載沒有異常,已經實現持久化存儲

需要注意的是:同步數據初始化時只能從外部映射到內部,通過判斷腳本可實現在初始化之后,判斷是否需要內部映射到外部

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM