在k8s中部署有狀態應用時,通常需要做數據持久化存儲。
后端存儲的方式有以下幾種:
1.基於宿主機本地的存儲方式;
(重啟pod時,若pod被調度到其他節點上,盡管原來節點上的數據不會丟失,但是其他節點上沒有該應用存儲過的數據,所以並不持久化)
2.基於本地過雲存儲服務的方式,如:(NFS、glusterfs、cephfs、awsElasticBlockStore、azureDisk、gcePersistentDisk等)
(在資源清單中指明URL地址和共享掛載卷目錄即可實現數據持久化存儲)
3.基於存儲類,實現PV自動供給;
(創建存儲類,在資源清單中指明地址和共享掛載卷目錄即可實現持久化存儲)
我們這里就介紹一下基於存儲類的PV自動供給實現的數據持久化存儲
官網概念說明:
https://kubernetes.io/docs/concepts/storage/storage-classes/
項目地址:
https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client/deploy
項目架構:
原理:
1.存儲工程師創建存儲類。
2.集群管理員維護集群中的存儲資源。
3.用戶或開發人員提交需求,(如在sts中只要在資源清單中編輯好volumeClaimTemplates中的需求,確保資源清單無誤即可運行)這個過程不需要人工手動創建PVC。
當然圖是這樣畫的,分工明細,但現實中相信一個人把這些活都攬的也不計其數。kube、kube拼音就一苦比,但是多學點沒壞處。
從官網中可以看出目前NFS並不支持做存儲類,但是我們可以使用NFS的插件來支持。
NFS插件在Github中的項目地址:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client/deploy
搭建
1.搭建NFS服務(與k8s集群同一網段下的主機)
1 安裝nfs服務:yum -y install nfs-utils (集群中的每個節點也要安裝否則不支持) 2
3 啟動nfs並設為開機自啟:systemctl start nfs && systemctl enable nfs 4
5 創建共享掛載目錄: mkdir -pv /data/volumes/{v1,v2,v3} 6
7 編輯/etc/exports文件,將目錄共享到192.168.1.0/24這個網段中: 8
9 vi /etc/exports 10
11 /data/volume/v1 192.168.1.0/24(rw,no_root_squash) 12 /data/volume/v2 192.168.1.0/24(rw,no_root_squash) 13 /data/volume/v3 192.168.1.0/24(rw,no_root_squash) 14
15 發布:exportfs -avr 16
17 exporting 192.168.1.0/24:/data/volume/v3 18 exporting 192.168.1.0/24:/data/volume/v2 19 exporting 192.168.1.0/24:/data/volume/v1 20
21 查看:showmount -e 22
23 /data/volume/v3 192.168.1.0/24
24 /data/volume/v2 192.168.1.0/24
25 /data/volume/v1 192.168.1.0/24
2.在kubernetes中部署NFS插件(項目地址在上面)
1 下載項目:for file in class.yaml deployment.yaml rbac.yaml test-claim.yaml ; do wget https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/$file ; done
2
3 修改資源清單(紅色地方需要修改): 4
5 vim deployment.yaml 6
7 apiVersion: v1 8 kind: ServiceAccount 9 metadata: 10 name: nfs-client-provisioner 11 ---
12 kind: Deployment 13 apiVersion: extensions/v1beta1 14 metadata: 15 name: nfs-client-provisioner 16 spec: 17 replicas: 1
18 strategy: 19 type: Recreate 20 template: 21 metadata: 22 labels: 23 app: nfs-client-provisioner 24 spec: 25 serviceAccountName: nfs-client-provisioner 26 containers: 27 - name: nfs-client-provisioner 28 image: quay.io/external_storage/nfs-client-provisioner:v2.0.0 ##默認是latest版本 29 volumeMounts: 30 - name: nfs-client-root 31 mountPath: /persistentvolumes 32 env: 33 - name: PROVISIONER_NAME 34 value: fuseim.pri/ifs ##這里的供應者名稱必須和class.yaml中的provisioner的名稱一致,否則部署不成功 35 - name: NFS_SERVER 36 value: k8s-nfs ##這里寫NFS服務器的IP地址或者能解析到的主機名 37 - name: NFS_PATH 38 value: /data/volume/v1 ##這里寫NFS服務器中的共享掛載目錄(強調:這里的路徑必須是目錄中最后一層的文件夾,否則部署的應用將無權限創建目錄導致Pending) 39 volumes: 40 - name: nfs-client-root 41
42 nfs: 43 server: k8s-nfs ##NFS服務器的IP或可解析到的主機名 44 path: /data/volume/v1 ##NFS服務器中的共享掛載目錄(強調:這里的路徑必須是目錄中最后一層的文件夾,否則部署的應用將無權限創建目錄導致Pending)
3.部署
切換到此項目的目錄中
1 kubectl apply -f ./
4.查看
查看此NFS插件的pod是否部署成功:
1 kubectl get pods 2
3 NAME READY STATUS RESTARTS AGE 4
5 nfs-client-provisioner-8664fb9f68-57wkf 1/1 Running 0 5m43s
5.測試
部署一個pvc或者聲明存儲的應用,測試是否自動創建出PV而且自動綁定PVC,
1 例:PVC 2
3 4
5 vim test.yaml 6
7 kind: PersistentVolumeClaim 8 apiVersion: v1 9 metadata: 10 name: test-claim 11 annotations: 12 volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
13 spec: 14 accessModes: 15 - ReadWriteMany 16 resources: 17 requests: 18 storage: 1Mi 19
20 例:StatefulSet方式部署的nginx應用 21
22 vim nginx-demo.yaml 23
24 apiVersion: v1 25 kind: Service 26 metadata: 27 name: nginx 28 labels: 29 app: nginx 30 spec: 31 ports: 32 - port: 80
33 name: web 34 clusterIP: None 35 selector: 36 app: nginx 37 ---
38
39 apiVersion: apps/v1 40 kind: StatefulSet 41 metadata: 42 name: web 43 spec: 44 selector: 45 matchLabels: 46 app: nginx 47 serviceName: "nginx"
48 replicas: 3
49 template: 50 metadata: 51 labels: 52 app: nginx 53 spec: 54 terminationGracePeriodSeconds: 10
55 containers: 56 - name: nginx 57 image: nginx 58 ports: 59 - containerPort: 80
60 name: web 61 volumeMounts: 62 - name: www 63 mountPath: /usr/share/nginx/html 64 volumeClaimTemplates: 65 - metadata: 66 name: www 67 spec: 68 accessModes: [ "ReadWriteOnce" ] 69 storageClassName: "managed-nfs-storage"
70 resources: 71 requests: 72 storage: 1Gi 73
74 部署: 75 kubectl apply -f test.yaml nginx-demo.yaml
76 77 查看pod、svc、pv、pvc狀態:
78 79 kubectl get pv
80 NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE 81 pvc-5d66051e-9674-11e9-9021-000c29cc70d4 1Mi RWX Delete Bound default/test-claim managed-nfs-storage 7m6s 82 pvc-73235c07-9677-11e9-9021-000c29cc70d4 1Gi RWO Delete Bound default/www-web-1 managed-nfs-storage 6m15s 83 pvc-8a58037f-9677-11e9-9021-000c29cc70d4 1Gi RWO Delete Bound default/www-web-2 managed-nfs-storage 5m36s 84 pvc-ab7fca5a-9676-11e9-9021-000c29cc70d4 1Gi RWO Delete Bound default/www-web-0 managed-nfs-storage 7m6s 85
86 87 kubectl get pvc
88 NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE 89 test-claim Bound pvc-5d66051e-9674-11e9-9021-000c29cc70d4 1Mi RWX managed-nfs-storage 28m 90 www-web-0 Bound pvc-ab7fca5a-9676-11e9-9021-000c29cc70d4 1Gi RWO managed-nfs-storage 12m 91 www-web-1 Bound pvc-73235c07-9677-11e9-9021-000c29cc70d4 1Gi RWO managed-nfs-storage 6m32s 92 www-web-2 Bound pvc-8a58037f-9677-11e9-9021-000c29cc70d4 1Gi RWO managed-nfs-storage 5m53s 93
94 kubectl get pods -owide 95 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nfs-client-provisioner-f9776d996-dpk6z 1/1 Running 0 12m 10.244.1.65 k8s-node1 <none> <none>
web-0 1/1 Running 0 16m 10.244.1.66 k8s-node1 <none> <none>
web-1 1/1 Running 0 10m 10.244.2.181 k8s-node2 <none> <none>
web-2 1/1 Running 0 10m 10.244.2.182 k8s-node2 <none> <none>
kubectl get svc
現在查看nfs服務器中的v1目錄下:
1 default-www-web-0-pvc-c32f532b-968f-11e9-9021-000c29cc70d4 default-www-web-2-pvc-d3944c4a-968f-11e9-9021-000c29cc70d4 2 default-www-web-1-pvc-ccd2a50b-968f-11e9-9021-000c29cc70d4
上面這些是k8s集群映射的目錄,用來和其他存儲掛載使用,從創建pod時的日志可以看出:
1 Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/7d7c45bc-968c-11e9-9021-000c29cc70d4/volumes/kubernetes.io~nfs/default-www-web-0-pvc-e6b67079-968b-11e9-9021-000c29cc70d4 --scope -- mount -t nfs k8s-nfs:/data/volume/v2/default-www-web-0-pvc-e6b67079-968b-11e9-9021-000c29cc70d4 /var/lib/kubelet/pods/7d7c45bc-968c-11e9-9021-000c29cc70d4/volumes/kubernetes.io~nfs/default-www-web-0-pvc-e6b67079-968b-11e9-9021-000c29cc70d4
在這些目錄中創建默認訪問頁:
1 cd default-www-web-0-pvc-c32f532b-968f-11e9-9021-000c29cc70d4 2
3 echo "<h1>NFS Server</h1>" > index.html 4
5 此時使用curl命令訪問此nginx pod 6
7 curl 10.244.1.66
8
9 NFS Server
好了,以上就是全部內容了