環境:
系統 | 華為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策略 在刪除pvc后PV變為Released不可用狀態, 若想重新被使用,需要管理員刪除pv,重新創建pv,刪除pv並不會刪除存儲的資源,只是刪除pv對象而已;若想保留數據,請使用該Retain,
Recycle策略 – 刪除pvc自動清除PV中的數據,效果相當於執行 rm -rf /thevolume/*. 刪除pvc時.pv的狀態由Bound變為Available.此時可重新被pvc申請綁定
Delete – 刪除存儲上的對應存儲資源,例如 AWS EBS、GCE PD、Azure Disk、OpenStack 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掛載沒有異常,已經實現持久化存儲
需要注意的是:同步數據初始化時只能從外部映射到內部,通過判斷腳本可實現在初始化之后,判斷是否需要內部映射到外部