1. 程式人生 > >附010.Kubernetes永久儲存之GlusterFS超融合部署

附010.Kubernetes永久儲存之GlusterFS超融合部署

一 前期準備

1.1 基礎知識

在Kubernetes中,使用GlusterFS檔案系統,操作步驟通常是: 建立brick-->建立volume-->建立PV-->建立PVC-->Pod掛載PVC 如果要建立多個PV,則需要手動重複執行,可通過Heketi管理glusterfs。 Heketi是用來管理GlusterFS卷的生命週期的,並提供了一個RESTful API介面供Kubernetes呼叫,因為GlusterFS沒有提供API呼叫的方式,所以我們藉助heketi。通過Heketi,Kubernetes可以動態配置GlusterFS卷,Heketi會動態在叢集內選擇bricks建立所需的volumes,確保資料的副本會分散到叢集不同的故障域內,同時Heketi還支援GlusterFS多叢集管理,便於管理員對GlusterFS進行操作。 Heketi要求在每個glusterfs節點上配備裸磁碟,用於Heketi建立PV和VG。通過Hekete,Kubernetes中使用PV步驟為: 建立StorageClass-->建立PVC-->Pod掛載PVC 這種方式稱為基於StorageClass的動態資源供應。 提示:本實驗基於Kubernetes部署glusterfs,同時glusterfs管理元件Heketi也使用Kubernetes部署。

1.2 架構示意

提示:本實驗不涉及Kubernetes部署,Kubernetes部署參考001-019。

1.3 相關規劃




主機

IP

磁碟

備註

k8smaster01

172.24.8.71


Kubernetes master節點

k8smaster02

172.24.8.72


Kubernetes master節點

k8smaster03

172.24.8.73


Kubernetes master節點

k8snode01

172.24.8.74

sdb

Kubernetes node節點

glusterfs節點

k8snode02

172.24.8.75

sdb

Kubernetes node節點

glusterfs節點

k8snode03

172.24.8.76

sdb

Kubernetes node節點

glusterfs節點

磁碟規劃

k8snode01 k8snode02 k8snode03
PV sdb1 sdb1 sdb1

1.4 部署條件 超融合部署需要具有已經部署的Kubernetes叢集管理訪問許可權。如果Kubernetes節點滿足以下要求,則可以選擇將GlusterFS作為超融合服務部署:
  • 必須至少有三個節點用於glusterfs;
  • 每個節點必須至少連線一個裸磁碟裝置,以供heketi使用。這些裝置上不得包含任何資料,heketi將會格式化和分割槽此裝置;
  • 每個節點必須開啟以下端口才能進行GlusterFS通訊:
    • 2222:GlusterFS pod的sshd埠;
    • 24007:GlusterFS守護程式;
    • 24008:GlusterFS管理;
    • 49152——49251:主機上每個卷的每個brick都需要有獨立的埠。對於每塊新brick,將從49152開始使用一個新埠。建議每臺主機的預設範圍為49152-49251,也可根據需要進行調整。
  • 必須載入以下核心模組:
    • dm_snapshot
    • dm_mirror
    • dm_thin_pool
  • 對於核心模組,可通過lsmod | grep <name>檢視模組是否存在,並modprobe <name>載入給定的模組。
  • 每個節點都要求該mount.glusterfs命令可用。在所有基於Red Hat的作業系統下,此命令由glusterfs-fuse軟體包提供。
注意:節點上安裝的GlusterFS客戶端版本應儘可能接近伺服器的版本。要獲取已安裝的版本,可通過glusterfs --version或kubectl exec <pod> -- glusterfs --version命令檢視。

1.5 其他準備

所有節點NTP配置; 所有節點新增相應主機名解析:
  1 172.24.8.71 k8smaster01
  2 172.24.8.72 k8smaster02
  3 172.24.8.73 k8smaster03
  4 172.24.8.74 k8snode01
  5 172.24.8.75 k8snode02
  6 172.24.8.76 k8snode03
注意:若非必要,建議關閉防火牆和SELinux。

二 規劃裸裝置

2.1 確認磁碟

  1 [root@k8snode01 ~]# fdisk /dev/sdb -l		#檢查sdb是否為裸磁碟

三 安裝glusterfs-fuse

3.1 安裝相應RPM源

  1 [root@k8snode01 ~]# yum -y install centos-release-gluster
  2 [root@k8snode01 ~]# yum -y install glusterfs-fuse		#安裝glusterfs-fuse
提示:k8snode01、k8snode02、k8snode03類似操作,根據1.4要求安裝glusterfs-fuse元件; 安裝相應源之後,會在/etc/yum.repos.d/目錄多出檔案CentOS-Storage-common.repo,內容如下: # CentOS-Storage.repo # # Please see http://wiki.centos.org/SpecialInterestGroup/Storage for more # information
[centos-storage-debuginfo] name=CentOS-$releasever - Storage SIG - debuginfo baseurl=http://debuginfo.centos.org/$contentdir/$releasever/storage/$basearch/ gpgcheck=1 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Storage

3.2 載入相應模組

  1 [root@k8snode01 ~]# cat > /etc/sysconfig/modules/glusterfs.modules <<EOF
  2 #!/bin/bash
  3 
  4 for kernel_module in dm_snapshot dm_mirror dm_thin_pool;do
  5     /sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1
  6     if [ \$? -eq 0 ]; then
  7         /sbin/modprobe \${kernel_module}
  8     fi
  9 done;
 10 EOF
 11 [root@k8snode01 ~]# chmod +x /etc/sysconfig/modules/glusterfs.modules
 12 [root@k8snode01 ~]# lsmod |egrep "dm_snapshot|dm_mirror|dm_thin_pool"	#所有glusterfs node節點檢查
提示:可通過modprobe <name>載入給定的模組。

四 Kubernetes部署glusterfs

4.1 Node tag

  1 [root@k8smaster01 ~]# kubectl label nodes k8snode01 storagenode=glusterfs
  2 [root@k8smaster01 ~]# kubectl label nodes k8snode02 storagenode=glusterfs
  3 [root@k8smaster01 ~]# kubectl label nodes k8snode03 storagenode=glusterfs
提示:在後續使用DaemonSet部署時候kube-templates/glusterfs-daemonset.yaml存在如下針對label的Selector: spec: nodeSelector: storagenode: glusterfs

4.2 下載glusterfs-Kubernetes

  1 [root@k8smaster01 ~]# yum -y install git
  2 [root@k8smaster01 ~]# git clone https://github.com/gluster/gluster-kubernetes.git

4.3 修改glusterfs拓撲

  1 [root@k8smaster01 ~]# cd gluster-kubernetes/deploy/
  2 [root@k8smaster01 deploy]# cp topology.json.sample topology.json
  3 [root@k8smaster01 deploy]# vi topology.json
  1 {
  2   "clusters": [
  3     {
  4       "nodes": [
  5         {
  6           "node": {
  7             "hostnames": {
  8               "manage": [
  9                 "k8snode01"
 10               ],
 11               "storage": [
 12                 "172.24.8.74"
 13               ]
 14             },
 15             "zone": 1
 16           },
 17           "devices": [
 18             "/dev/sdb"
 19           ]
 20         },
 21         {
 22           "node": {
 23             "hostnames": {
 24               "manage": [
 25                 "k8snode02"
 26               ],
 27               "storage": [
 28                 "172.24.8.75"
 29               ]
 30             },
 31             "zone": 1
 32           },
 33           "devices": [
 34             "/dev/sdb"
 35           ]
 36         },
 37         {
 38           "node": {
 39             "hostnames": {
 40               "manage": [
 41                 "k8snode03"
 42               ],
 43               "storage": [
 44                 "172.24.8.76"
 45               ]
 46             },
 47             "zone": 1
 48           },
 49           "devices": [
 50             "/dev/sdb"
 51           ]
 52         }
 53       ]
 54     }
 55   ]
 56 }
提示:heketi配置檔案及介紹參考《附009.Kubernetes永久儲存之GlusterFS獨立部署》。 若需要修改heketi的暴露方式,若需要修改為NodePort,可參考https://lichi6174.github.io/glusterfs-heketi/。 所有部署相關yaml位於/root/gluster-kubernetes/deploy/kube-templates,本實驗採用預設引數。

4.4 配置heketi

  1 [root@k8smaster01 deploy]# cp heketi.json.template heketi.json
  2 [root@k8smaster01 deploy]# vi heketi.json
  3 {
  4     "_port_comment": "Heketi Server Port Number",
  5     "port" : "8080",
  6 
  7     "_use_auth": "Enable JWT authorization. Please enable for deployment",
  8     "use_auth" : true,				#開啟使用者認證
  9 
 10     "_jwt" : "Private keys for access",
 11     "jwt" : {
 12         "_admin" : "Admin has access to all APIs",
 13         "admin" : {
 14             "key" : "admin123"			#管理員密碼
 15         },
 16         "_user" : "User only has access to /volumes endpoint",
 17         "user" : {
 18             "key" : "xianghy"			#使用者密碼
 19         }
 20     },
 21 
 22     "_glusterfs_comment": "GlusterFS Configuration",
 23     "glusterfs" : {
 24 
 25         "_executor_comment": "Execute plugin. Possible choices: mock, kubernetes, ssh",
 26         "executor" : "${HEKETI_EXECUTOR}",	        #本實驗使用Kubernetes方式
 27 
 28         "_db_comment": "Database file name",
 29         "db" : "/var/lib/heketi/heketi.db",	        #heketi資料儲存
 30 
 31         "kubeexec" : {
 32             "rebalance_on_expansion": true
 33         },
 34 
 35         "sshexec" : {
 36             "rebalance_on_expansion": true,
 37             "keyfile" : "/etc/heketi/private_key",
 38             "port" : "${SSH_PORT}",
 39             "user" : "${SSH_USER}",
 40             "sudo" : ${SSH_SUDO}
 41         }
 42     },
 43 
 44     "backup_db_to_kube_secret": false
 45 }

4.5 相關修正

新版Kubernetes的# kubectl get pod命令無--show-all選項,需要如下操作修正部署gk-deploy指令碼。
  1 [root@k8smaster01 deploy]# vi gk-deploy
  2 924 #heketi_pod=$(${CLI} get pod --no-headers --show-all --selector="heketi" | awk '{print $1}')
  3 925 heketi_pod=$(${CLI} get pod --no-headers --selector="heketi" | awk '{print $1}')

由於國內glusterfs映象可能無法pull,建議通過VPN等方式提前pull映象,然後上傳至所有glusterfs node節點。
  1 [root@VPN ~]# docker pull gluster/gluster-centos:latest
  2 [root@VPN ~]# docker pull heketi/heketi:dev
  3 [root@VPN ~]# docker save -o gluster_latest.tar gluster/gluster-centos:latest
  4 [root@VPN ~]# docker save -o heketi_dev.tar heketi/heketi:dev
  5 [root@k8snode01 ~]# docker load -i gluster_latest.tar
  6 [root@k8snode01 ~]# docker load -i heketi_dev.tar
  7 [root@k8snode01 ~]# docker images
  8 

4.6 正式部署

  1 [root@k8smaster01 deploy]# ./gk-deploy -h			#檢視部署引數
  2 [root@k8smaster01 deploy]# kubectl create ns heketi		#建議部署在獨立的namespace中
  3 [root@k8smaster01 deploy]# ./gk-deploy -g -n heketi topology.json --admin-key admin123 --user-key xianghy
  4 ……
  5 Do you wish to proceed with deployment?
  6 
  7 [Y]es, [N]o? [Default: Y]: y
提示:部署指令碼更多引數參考:https://github.com/gluster/gluster-kubernetes/blob/master/deploy/gk-deploy。 注意:若部署失敗,需要通過下方式徹底刪除後重新部署:
  1 [root@k8smaster01 deploy]# ./gk-deploy --abort --admin-key admin123 --user-key xianghy -y -n heketi
  2 [root@k8smaster01 deploy]# kubectl delete -f kube-templates/ -n heketi
glusterfs node節點需要執行如下徹底清理:
  1 [root@k8snode01 ~]# dmsetup ls
  2 [root@k8snode01 ~]# dmsetup remove_all
  3 [root@k8snode01 ~]# rm -rf /var/log/glusterfs/
  4 [root@k8snode01 ~]# rm -rf /var/lib/heketi
  5 [root@k8snode01 ~]# rm -rf /var/lib/glusterd/
  6 [root@k8snode01 ~]# rm -rf /etc/glusterfs/
  7 [root@k8snode01 ~]# dd if=/dev/zero of=/dev/sdb bs=512k count=1
  8 [root@k8snode01 ~]# wipefs -af /dev/sdb

4.7 Kubernetes叢集檢視驗證

  1 [root@k8smaster01 ~]# kubectl get nodes --show-labels | grep -E 'NAME|node'
  2 [root@k8smaster01 ~]# kubectl get all -n heketi
  1 [root@k8smaster01 ~]# kubectl get pods -o wide -n heketi

4.8 gluster叢集檢視驗證

  1 [root@k8smaster01 ~]# kubectl exec -it heketi-65f4555d74-72hrf -n heketi -- heketi-cli cluster list --user admin --secret admin123								#叢集列表
  2 [root@k8smaster01 ~]# kubectl -n heketi exec -ti heketi-65f4555d74-72hrf /bin/bash                               [root@heketi-65f4555d74-72hrf /]# heketi-cli cluster list --user admin --secret admin123	#進入heketi容器檢視
  3 [root@k8smaster01 ~]# curl http://10.254.111.219:8080/hello
  4 Hello from Heketi
注意:使用4.6指令碼為一鍵部署,也可使用gluster-kubernetes/deploy/目錄下的檔案,分開逐步部署,整理部署思路如下:
  1. 使用glusterfs-daemonset.json部署glusterfs DaemonSet;
  2. 對node節點進行打標籤;
  3. 使用heketi-service-account.json部署Heketi的服務帳戶;
  4. 對Heketi所建立的服務帳戶授權;
  5. 建立secret;
  6. 轉發本地8080埠至deploy-heketi。
獨立部署完整過程參考:https://jimmysong.io/kubernetes-handbook/practice/using-heketi-gluster-for-persistent-storage.html。

五 安裝heketi-cli

由於在master節點管理heketi需要進入heketi容器或者使用kubectl exec -ti 方式,建議直接在master節點安裝heketi客戶端,直接管理、

5.1 安裝heketi服務

  1 [root@k8smaster01 ~]# yum -y install centos-release-gluster
  2 [root@k8smaster01 ~]# yum -y install heketi-client

5.2 配置heketi

  1 [root@k8smaster01 ~]# echo "export HEKETI_CLI_SERVER=http://$(kubectl get svc heketi -n heketi -o go-template='{{.spec.clusterIP}}'):8080" >> /etc/profile.d/heketi.sh
  2 [root@k8smaster01 ~]# echo "alias heketi-cli='heketi-cli --user admin --secret admin123'" >> ~/.bashrc
  3 [root@k8smaster01 ~]# source /etc/profile.d/heketi.sh
  4 [root@k8smaster01 ~]# source ~/.bashrc
  5 [root@k8smaster01 ~]# echo $HEKETI_CLI_SERVER
  6 http://heketi:8080

5.3 叢集管理

  1 [root@k8smaster01 ~]# heketi-cli cluster list
  2 Clusters:
  3 Id:67004a06fbcb4fa525bcec1fbaa9ef2d [file][block]
  4 [root@k8smaster01 ~]# heketi-cli cluster info 67004a06fbcb4fa525bcec1fbaa9ef2d	#叢集詳細資訊
  5 Cluster id: 67004a06fbcb4fa525bcec1fbaa9ef2d
  6 Nodes:
  7 40cdd4c1d0c389939193d6dea3c5bfe8
  8 62873c54cf61025fda91e6d44433378b
  9 d48986357840d28653304e7170599da5
 10 Volumes:
 11 5f15f201d623e56b66af56313a1975e7
 12 Block: true
 13 
 14 File: true
 15 [root@k8smaster01 ~]# heketi-cli topology info 67004a06fbcb4fa525bcec1fbaa9ef2d	#檢視拓撲資訊
 16 [root@k8smaster01 ~]# heketi-cli node list					        #檢視所有node
 17 Id:40cdd4c1d0c389939193d6dea3c5bfe8     Cluster:67004a06fbcb4fa525bcec1fbaa9ef2d
 18 Id:62873c54cf61025fda91e6d44433378b     Cluster:67004a06fbcb4fa525bcec1fbaa9ef2d
 19 Id:d48986357840d28653304e7170599da5     Cluster:67004a06fbcb4fa525bcec1fbaa9ef2d
 20 [root@k8smaster01 ~]# heketi-cli node info 40cdd4c1d0c389939193d6dea3c5bfe8  	#node節點資訊
 21 [root@k8smaster01 ~]# heketi-cli volume create --size=2 --replica=2		        #預設為3副本的replica模式
  1 [root@k8smaster01 ~]# heketi-cli volume list					#列出所有卷
  2 [root@k8smaster01 ~]# heketi-cli volume info fc296ab350dcc36e00dd3b3643a04645	#卷資訊
  3 [root@k8smaster01 ~]# heketi-cli volume delete fc296ab350dcc36e00dd3b3643a04645	#刪除卷

六 Kubernetes動態掛載glusterfs

6.1 StorageClass動態儲存

kubernetes共享儲存provider模式: 靜態模式(Static):叢集管理員手工建立PV,在定義PV時設定後端儲存的特性; 動態模式(Dynamic):叢集管理員不需要手工建立PV,而是通過StorageClass的設定對後端儲存進行描述,標記為某種"型別(Class)";此時要求PVC對儲存的型別進行說明,系統將自動完成PV的建立及與PVC的繫結;PVC可以宣告Class為"",說明PVC禁止使用動態模式。 基於StorageClass的動態儲存供應整體過程如下圖所示:
  1. 叢集管理員預先建立儲存類(StorageClass);
  2. 使用者建立使用儲存類的持久化儲存宣告(PVC:PersistentVolumeClaim);
  3. 儲存持久化宣告通知系統,它需要一個持久化儲存(PV: PersistentVolume);
  4. 系統讀取儲存類的資訊;
  5. 系統基於儲存類的資訊,在後臺自動建立PVC需要的PV;
  6. 使用者建立一個使用PVC的Pod;
  7. Pod中的應用通過PVC進行資料的持久化;
  8. 而PVC使用PV進行資料的最終持久化處理。
提示:關於Kubernetes的部署參考《附003.Kubeadm部署Kubernetes》。

6.2 定義StorageClass

關鍵字說明:
  • provisioner:表示儲存分配器,需要根據後端儲存的不同而變更;
  • reclaimPolicy: 預設即”Delete”,刪除pvc後,相應的pv及後端的volume,brick(lvm)等一起刪除;設定為”Retain”時則保留資料,若需刪除則需要手工處理;
  • resturl:heketi API服務提供的url;
  • restauthenabled:可選引數,預設值為”false”,heketi服務開啟認證時必須設定為”true”;
  • restuser:可選引數,開啟認證時設定相應使用者名稱;
  • secretNamespace:可選引數,開啟認證時可以設定為使用持久化儲存的namespace;
  • secretName:可選引數,開啟認證時,需要將heketi服務的認證密碼儲存在secret資源中;
  • clusterid:可選引數,指定叢集id,也可以是1個clusterid列表,格式為”id1,id2”;
  • volumetype:可選引數,設定卷型別及其引數,如果未分配卷型別,則有分配器決定卷型別;如”volumetype: replicate:3”表示3副本的replicate卷,”volumetype: disperse:4:2”表示disperse卷,其中‘4’是資料,’2’是冗餘校驗,”volumetype: none”表示distribute卷
提示:關於glusterfs各種不同型別的卷見《004.RHGS-建立volume》。
  1 [root@k8smaster01 ~]# echo -n "admin123" | base64		#將密碼轉換為64位編碼
  2 YWRtaW4xMjM=
  3 [root@k8smaster01 ~]# mkdir -p heketi
  4 [root@k8smaster01 ~]# cd heketi/
  5 [root@k8smaster01 ~]# vi heketi-secret.yaml			#建立用於儲存密碼的secret
  6 apiVersion: v1
  7 kind: Secret
  8 metadata:
  9   name: heketi-secret
 10   namespace: heketi
 11 data:
 12   # base64 encoded password. E.g.: echo -n "mypassword" | base64
 13   key: YWRtaW4xMjM=
 14 type: kubernetes.io/glusterfs
 15 [root@k8smaster01 heketi]# kubectl create -f heketi-secret.yaml	#建立heketi
 16 [root@k8smaster01 heketi]# kubectl get secrets -n heketi
 17 NAME                                 TYPE                                  DATA   AGE
 18 default-token-6n746                  kubernetes.io/service-account-token   3      144m
 19 heketi-config-secret                 Opaque                                3      142m
 20 heketi-secret                        kubernetes.io/glusterfs               1      3m1s
 21 heketi-service-account-token-ljlkb   kubernetes.io/service-account-token   3      143m
 22 [root@kubenode1 heketi]# vim gluster-heketi-storageclass.yaml	#正式建立StorageClass
 23 apiVersion: storage.k8s.io/v1
 24 kind: StorageClass
 25 metadata:
 26   name: gluster-heketi-storageclass
 27 parameters:
 28   resturl: "http://10.254.111.219:8080"
 29   clusterid: "67004a06fbcb4fa525bcec1fbaa9ef2d"
 30   restauthenabled: "true"					#若heketi開啟認證此處也必須開啟auth認證
 31   restuser: "admin"
 32   secretName: "heketi-secret"					#name/namespace與secret資源中定義一致
 33   secretNamespace: "heketi"
 34   volumetype: "replicate:3"
 35 provisioner: kubernetes.io/glusterfs
 36 reclaimPolicy: Delete
 37 [root@k8smaster01 heketi]# kubectl create -f gluster-heketi-storageclass.yaml
注意:storageclass資源建立後不可變更,如修改只能刪除後重建。
  1 [root@k8smaster01 heketi]# kubectl get storageclasses		#檢視確認
  2 NAME                          PROVISIONER               AGE
  3 gluster-heketi-storageclass   kubernetes.io/glusterfs   85s
  4 [root@k8smaster01 heketi]# kubectl describe storageclasses gluster-heketi-storageclass

6.3 定義PVC

  1 [root@k8smaster01 heketi]# vi gluster-heketi-pvc.yaml
  2 apiVersion: v1
  3 kind: PersistentVolumeClaim
  4 metadata:
  5   name: gluster-heketi-pvc
  6   annotations:
  7     volume.beta.kubernetes.io/storage-class: gluster-heketi-storageclass
  8 spec:
  9   accessModes:
 10   - ReadWriteOnce
 11   resources:
 12     requests:
 13       storage: 1Gi
注意:accessModes可有如下簡寫:
  • ReadWriteOnce:簡寫RWO,讀寫許可權,且只能被單個node掛載;
  • ReadOnlyMany:簡寫ROX,只讀許可權,允許被多個node掛載;
  • ReadWriteMany:簡寫RWX,讀寫許可權,允許被多個node掛載。
  1 [root@k8smaster01 heketi]# kubectl create -f gluster-heketi-pvc.yaml -n heketi
  2 [root@k8smaster01 heketi]# kubectl get pvc -n heketi
  3 [root@k8smaster01 heketi]# kubectl describe pvc gluster-heketi-pvc -n heketi
  4 [root@k8smaster01 heketi]# kubectl get pv -n heketi
  5 [root@k8smaster01 heketi]# kubectl describe pv pvc-ca949559-094a-11ea-8b3c-000c29fa7a79 -n heketi
  1 [root@k8smaster01 heketi]# kubectl describe endpoints glusterfs-dynamic-ca949559-094a-11ea-8b3c-000c29fa7a79 -n heketi
提示:由上可知:PVC狀態為Bound,Capacity為1G。檢視PV詳細資訊,除容量,引用storageclass資訊,狀態,回收策略等外,同時可知GlusterFS的Endpoint與path。EndpointsName為固定格式:glusterfs-dynamic-PV_NAME,且endpoints資源中指定了掛載儲存時的具體地址。

6.4 確認檢視

通過5.3所建立的資訊:
  • volume與brick已經建立;
  • 主掛載點(通訊)在172.24.8.41節點,其餘兩個節點備選;
  • 三副本的情況下,所有節點都會建立brick。
  1 [root@k8smaster01 ~]# kubectl get pod -n heketi
  2 [root@k8smaster01 ~]# kubectl exec -ti glusterfs-b854k -n heketi -- lsblk	#glusterfs節點檢視
  3 [root@k8smaster01 ~]# kubectl exec -ti glusterfs-b854k -n heketi -- df -hT	#glusterfs節點檢視
  4 [root@k8smaster01 ~]# kubectl exec -ti glusterfs-b854k -n heketi -- gluster volume list
  5 [root@k8smaster01 ~]# kubectl exec -ti glusterfs-b854k -n heketi -- gluster volume info vol_29ba6f9665522ad5893412e61799a433				#glusterfs節點檢視

6.5 Pod掛載測試

  1 [root@xxx ~]# yum -y install centos-release-gluster
  2 [root@xxx ~]# yum -y install glusterfs-fuse					#安裝glusterfs-fuse
提示:本環境master節點也允許分發pod,因此所有master也必須安裝glusterfs-fuse以便於正常掛載,同時版本需要和glusterfs節點一致。
  1 [root@k8smaster01 heketi]# vi gluster-heketi-pod.yaml
  2 kind: Pod
  3 apiVersion: v1
  4 metadata:
  5   name: gluster-heketi-pod
  6 spec:
  7   containers:
  8   - name: gluster-heketi-container
  9     image: busybox
 10     command:
 11     - sleep
 12     - "3600"
 13     volumeMounts:
 14     - name: gluster-heketi-volume			#必須和volumes中name一致
 15       mountPath: "/pv-data"
 16       readOnly: false
 17   volumes:
 18   - name: gluster-heketi-volume
 19     persistentVolumeClaim:
 20       claimName: gluster-heketi-pvc	  	 	#必須和5.3建立的PVC中的name一致
 21 [root@k8smaster01 heketi]# kubectl create -f gluster-heketi-pod.yaml -n heketi	#建立Pod

6.6 確認驗證

  1 [root@k8smaster01 ~]# kubectl get pod -n heketi | grep gluster-heketi
  2 gluster-heketi-pod        1/1     Running   0          4m58s
  3 [root@k8smaster01 ~]# kubectl exec -it gluster-heketi-pod /bin/sh -n heketi 	#進入Pod寫入測試檔案
  4 / # cd /pv-data/
  5 /pv-data # echo "This is a file!" >> a.txt
  6 /pv-data # echo "This is b file!" >> b.txt
  7 /pv-data # ls
  8 a.txt  b.txt
  9 [root@k8smaster01 ~]# kubectl exec -it gluster-heketi-pod -n heketi -- df -h	#檢視所掛載的glusterfs
  1 [root@k8smaster01 ~]# kubectl get pods -n heketi -o wide		#檢視對應的glusterfs node
  1 [root@k8smaster01 ~]# kubectl exec -ti glusterfs-b854k -n heketi -- cat /var/lib/heketi/mounts/vg_2c7a02d1b1b7c1f165283b6691062102/brick_16e37a18a5e5fd40e14338ba78d99565/brick/a.txt
  2 This is a file!
提示:通過Pod寫入相應的測試檔案,然後通過glusterfs node節點檢視是否存在。

6.7 刪除資源

  1 [root@k8smaster01 ~]# cd heketi/
  2 [root@k8smaster01 heketi]# kubectl delete -f gluster-heketi-pod.yaml -n heketi
  3 [root@k8smaster01 heketi]# kubectl delete -f gluster-heketi-pvc.yaml
  4 [root@k8smaster01 heketi]# kubectl get pvc -n heketi
  5 [root@k8smaster01 heketi]# kubectl get pv -n heketi
  6 [root@k8smaster01 heketi]# kubectl exec -ti glusterfs-b854k -n heketi gluster volume list | grep gluster
參考:https://www.linuxba.com/archives/8152 https://www.cnblogs.com/blackmood/p/11389811.ht