天天熱頭條丨Kubernetes_k8s持久化存儲(chǔ)(親測(cè)可用)
新建具有兩個(gè)節(jié)點(diǎn)的k8s集群,主節(jié)點(diǎn)(master節(jié)點(diǎn)/m節(jié)點(diǎn))的ip地址是192.168.100.150,從節(jié)點(diǎn)(w1節(jié)點(diǎn))的ip地址是192.168.100.151。
本文操作如何將pod中的container容器中的目錄映射到宿主機(jī)(包括pod所在宿主機(jī)和其他任意宿主機(jī)),分為三個(gè)部分:volumes的使用、pv/pvc的使用、storageClass的使用。三者的關(guān)系是:volumes映射Pod只能映射到自己所在node(實(shí)際機(jī)器)的目錄上;pv/pvc映射通過配置 NFS 服務(wù)器可以保證無論P(yáng)od在哪個(gè)node節(jié)點(diǎn)上都映射到 NFS 服務(wù)器上,下次無論 Pod 被分配到哪個(gè)節(jié)點(diǎn),都從 NFS 服務(wù)器加載;storageClass解決的是 pv/pvc 一對(duì)一的關(guān)系,如果有 N 個(gè)pvc,這運(yùn)維人員需要新建 N 個(gè)pv,但是有了storageClass,運(yùn)維人員只需要建立好一個(gè)storageClass,就算有 N 個(gè)pvc,這個(gè)storageClass 也會(huì)自動(dòng)創(chuàng)建 N個(gè) pv 來給 N個(gè) pvc使用。
(相關(guān)資料圖)
本文資源地址:https://www.syjshare.com/res/JF7S1RQU
二、volumes實(shí)現(xiàn)本地持久化存儲(chǔ)2.1 K8S各個(gè)Pod之間可以存儲(chǔ)和網(wǎng)絡(luò)的共享Pod中的各個(gè)container,可以實(shí)現(xiàn) 共享網(wǎng)絡(luò) 和 共享存儲(chǔ)(即volume)
2.2 volumes實(shí)現(xiàn)本地持久化存儲(chǔ)(1)創(chuàng)建資源
kubectl apply -f volume-pod.yaml
(2)查看pod的運(yùn)行情況
kubectl get pods -o wide
(3) 進(jìn)入pod里面的container
# 根據(jù)pod名稱進(jìn)入kubectl exec -it pod-name -- /bin/bash
注意:使用這種volumes目錄映射,只能映射到pod所在的物理機(jī)器的目錄,這是volumes映射的局限,需要部署一個(gè) NFS 服務(wù)器,然后通過 PV/PVC 來連接這個(gè) NFS 服務(wù)器,解決這個(gè)問題。
三、遠(yuǎn)程服務(wù)器持久化存儲(chǔ)3.1 PersistentVolume官網(wǎng):https://kubernetes.io/docs/concepts/storage/persistent-volumes/
apiVersion: v1kind: PersistentVolume # PV是一個(gè)Kind,volume不是一種kindmetadata: name: my-pvspec: capacity: storage: 5Gi # 需要使用的遠(yuǎn)端服務(wù)器的存儲(chǔ)空間大小(修改) volumeMode: Filesystem accessModes: - ReadWriteOnce # 只允許一個(gè)Pod進(jìn)行獨(dú)占式讀寫操作 persistentVolumeReclaimPolicy: Recycle storageClassName: slow mountOptions: - hard - nfsvers=4.1 nfs: # host是k8s集群內(nèi),nfs是k8s集群外 path: /tmp # 遠(yuǎn)端服務(wù)器的目錄(修改) server: 172.17.0.2 # 遠(yuǎn)端的服務(wù)器(修改)
說白了,PV是K8s中的資源,volume的plugin實(shí)現(xiàn),生命周期獨(dú)立于Pod,封裝了底層存儲(chǔ)卷實(shí)現(xiàn)的細(xì)節(jié)。
pv的生命周期是獨(dú)立于pod的
注意:PV的維護(hù)通常是由運(yùn)維人員、集群管理員進(jìn)行維護(hù)的。
3.2 PersistentVolumeClaim官網(wǎng):https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims
有了PV,那Pod如何使用呢?為了方便使用,我們可以設(shè)計(jì)出一個(gè)PVC來綁定PV,然后把PVC交給Pod來使用即可,且聽下面的分析。pod中想要使用這個(gè)pv,就是通過pvc來和pv綁定的 pod - pvc - pv - 遠(yuǎn)端服務(wù)器
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: myclaimspec: accessModes: # 匹配 - ReadWriteOnce volumeMode: Filesystem resources: requests: storage: 8Gi # 匹配 storageClassName: slow selector: matchLabels: release: "stable" matchExpressions: - {key: environment, operator: In, values: [dev]}
3.3 Pod中如何使用PVC (Pod綁定PVC)說白了,PVC會(huì)匹配滿足要求的PV[是根據(jù)size和訪問模式進(jìn)行匹配的],進(jìn)行一一綁定,然后它們的狀態(tài)都會(huì)變成Bound。
也就是PVC負(fù)責(zé)請(qǐng)求PV的大小和訪問方式,然后Pod中就可以直接使用PVC咯。
注意:PVC通常由開發(fā)小伙伴維護(hù),開發(fā)小伙伴無需關(guān)注與存儲(chǔ)細(xì)節(jié)。
官網(wǎng):https://kubernetes.io/docs/concepts/storage/persistent-volumes/#claims-as-volumes
apiVersion: v1kind: Podmetadata: name: mypodspec: containers: - name: myfrontend image: nginx volumeMounts: - mountPath: "/var/www/html" # ok 不變 name: mypd # ok 不變 volumes: - name: mypd # ok 不變 volumes 和 pod 綁定,通過name persistentVolumeClaim: claimName: myclaim # pod 和 pvc 綁定,通過claimName3.4 遠(yuǎn)程服務(wù)器持久化存儲(chǔ)實(shí)踐與測(cè)試
背景:使用nginx持久化存儲(chǔ)演示
(1)共享存儲(chǔ)使用nfs,比如選擇在m節(jié)點(diǎn)(2)創(chuàng)建pv和pvc(3)nginx pod中使用pvc3.4.1 啟動(dòng)前的配置(配置NFS服務(wù)器)
nfs(network file system)網(wǎng)絡(luò)文件系統(tǒng),是FreeBSD支持的文件系統(tǒng)中的一種,允許網(wǎng)絡(luò)中的計(jì)算機(jī)之間通過TCP/IP網(wǎng)絡(luò)共享資源。
隨便找一個(gè)機(jī)器搭建NFS服務(wù)器(用來作為遠(yuǎn)程服務(wù)器存放),可以是k8s集群內(nèi)的節(jié)點(diǎn),也可以是k8s集群外的節(jié)點(diǎn)。這里在master節(jié)點(diǎn)上搭建一個(gè)NFS服務(wù)器,目錄為/nfs/data,然后
01 選擇master節(jié)點(diǎn)作為nfs的server,所以在master節(jié)點(diǎn)上,執(zhí)行以下命令
# 第一步,啟動(dòng)nfs和rpcbind# 啟動(dòng)nfssystemctl status nfs (如果存在就開啟 systmctl start nfs ,不過不存在就安裝 yum -y install nfs-utils 并 systemctl start nfs)systemctl status nfs (啟動(dòng)后再次查看狀態(tài),狀態(tài)成功就是表示啟動(dòng)成功了)systemctl enable nfs (設(shè)置為為開機(jī)自啟動(dòng))# 啟動(dòng)rpcbindsystemctl restart rpcbind (重啟)systemctl enable rpcbind (設(shè)置為開機(jī)自啟動(dòng))systemctl status rpcbind (查看狀態(tài),驗(yàn)證重啟成功)# 第二步,創(chuàng)建nfs目錄并授予權(quán)限 /nfs/data/ 這個(gè)目錄就是nfs ip那個(gè)目錄# 創(chuàng)建nfs目錄mkdir -p /nfs/data/# 授予權(quán)限chmod -R 777 /nfs/data# 第三步,編輯export文件并保存# 編輯export文件 對(duì)于/nfs/data目錄,授予可讀可寫權(quán)限、根目錄權(quán)限、同步數(shù)據(jù)權(quán)限vi /etc/exports /nfs/data *(rw,no_root_squash,sync) /nfs/data *(rw,no_root_squash,sync,no_subtree_check) # 新版nfs # 使得配置生效exportfs -r# 查看生效exportfs# 第四步,驗(yàn)證rpcbind、nfs# 查看rpc服務(wù)的注冊(cè)情況rpcinfo -p localhost# showmount測(cè)試 # showmount命令用于查詢NFS服務(wù)器的相關(guān)信息 -e或--exports 顯示NFS服務(wù)器的輸出清單。showmount -e master-ip showmount -e 192.168.100.150
02 所有node上安裝客戶端 ps -ef|grep nfs
# 啟動(dòng)nfssystemctl status nfs (如果存在就開啟 systmctl start nfs ,不過不存在就安裝 yum -y install nfs-utils 并 systemctl start nfs)systemctl status nfs (啟動(dòng)后再次查看狀態(tài),狀態(tài)成功就是表示啟動(dòng)成功了)systemctl enable nfs (設(shè)置為為開機(jī)自啟動(dòng))# 啟動(dòng)rpcbindsystemctl restart rpcbind (重啟)systemctl enable rpcbind (設(shè)置為開機(jī)自啟動(dòng))systemctl status rpcbind (查看狀態(tài),驗(yàn)證重啟成功)
注意1:nfs主節(jié)點(diǎn)判斷nfs是否安裝成功了三條exportfs 或者cat /etc/exportsrpcinfo -p localhostshowmount -e 192.168.100.150
注意2:nfs主節(jié)點(diǎn)和從節(jié)點(diǎn)配置的區(qū)別從節(jié)點(diǎn):?jiǎn)?dòng)好nfs和rpcbind主節(jié)點(diǎn):?jiǎn)?dòng)好nfs和rpcbind、新建/nfs/data目錄、vi /etc/exports、showmount -e 192.168.100.150 測(cè)試
3.4.2 啟動(dòng)并測(cè)試注意3:pod - nfs 和 pod - pvc - pv - nfs 兩種方式等效,增加了 pvc - pv 這一層只是為了開發(fā)和運(yùn)維解耦,pod - pvc 由開發(fā)負(fù)責(zé),pv - nfs 由運(yùn)維負(fù)責(zé),如果都是一個(gè)人干,可以直接 pod - nfs,不要中間 pvc-pv 這一層
(1)在nfs服務(wù)器創(chuàng)建所需要的目錄(數(shù)據(jù)存放目錄 因?yàn)閜vc文件需要這個(gè)目錄 在宿主機(jī)上)
mkdir -p /nfs/data/nginx
(2)定義PV,PVC和Nginx的yaml文件 (三個(gè)yaml文件 就是合并為一個(gè)yaml文件 nginx-pv-demo.yaml)
網(wǎng)盤中:課堂源碼/nginx-pv-demo.yaml
(3)根據(jù)yaml文件創(chuàng)建資源并查看資源
# 創(chuàng)建三個(gè)kubectl apply -f nginx-pv-demo.yaml # 查看三個(gè)kubectl get pv,pvc kubectl get pods -o wide
測(cè)試:遠(yuǎn)程服務(wù)器持久化存儲(chǔ)
四、遠(yuǎn)程服務(wù)器持久化存儲(chǔ)的另一種方式(StorageClass自動(dòng)創(chuàng)建PV)4.1 StorageClass上面手動(dòng)管理PV的方式還是有點(diǎn)low,能不能更加靈活一點(diǎn)呢?官網(wǎng):https://kubernetes.io/docs/concepts/storage/storage-classes/
nfs github:github:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs
IntroductionA StorageClass provides a way for administrators to describe the “classes” of storage they offer.Different classes might map to quality-of-service levels, or to backup policies, or to arbitrary policies determined by the cluster administrators. Kubernetes itself is unopinionated about what classes represent. This concept is sometimes called “profiles” in other storage systems.
StorageClass 為管理員提供了描述存儲(chǔ) “類” 的方法。不同的類型可能會(huì)映射到不同的服務(wù)質(zhì)量等級(jí)或備份策略,或是由集群管理員制定的任意策略(即可以自定義)。Kubernetes 本身并不清楚各種類代表的什么(這種類是k8s不識(shí)別的)。這個(gè)類的概念在其他存儲(chǔ)系統(tǒng)中有時(shí)被稱為 “配置文件”。
The StorageClass ResourceEach StorageClass contains the fields provisioner, parameters, and reclaimPolicy, which are used when a PersistentVolume belonging to the class needs to be dynamically provisioned. The name of a StorageClass object is significant, and is how users can request a particular class. Administrators set the name and other parameters of a class when first creating StorageClass objects, and the objects cannot be updated once they are created.
每個(gè) StorageClass 都包含 provisioner、parameters 和 reclaimPolicy 字段,這些字段會(huì)在 StorageClass 需要?jiǎng)討B(tài)分配 PersistentVolume 時(shí)會(huì)使用到(就是說StorageClass的目的是自動(dòng)生成pv)。StorageClass 對(duì)象的命名很重要,用戶使用這個(gè)命名來請(qǐng)求生成一個(gè)特定的類。當(dāng)創(chuàng)建 StorageClass 對(duì)象時(shí),管理員設(shè)置 StorageClass 對(duì)象的命名和其他參數(shù),一旦創(chuàng)建了對(duì)象就不能再對(duì)其更新。
小結(jié):StorageClass聲明存儲(chǔ)插件,用于自動(dòng)創(chuàng)建PV。說白了就是創(chuàng)建PV的模板,其中有兩個(gè)重要部分:PV屬性和創(chuàng)建此PV所需要的插件。這樣PVC就可以按“Class”來匹配PV??梢詾镻V指定storageClassName屬性,標(biāo)識(shí)PV歸屬于哪一個(gè)Class。
apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: standard# 這里加上體現(xiàn)了 "每個(gè) StorageClass 都包含 provisioner、parameters 和 reclaimPolicy 字段" #(provisioner是指定插件)provisioner: kubernetes.io/aws-ebsparameters: type: gp2reclaimPolicy: RetainallowVolumeExpansion: truemountOptions: - debugvolumeBindingMode: Immediate
01 對(duì)于PV或者StorageClass只能對(duì)應(yīng)一種后端存儲(chǔ)02 對(duì)于手動(dòng)的情況,一般我們會(huì)創(chuàng)建很多的PV,等有PVC需要使用的時(shí)候就可以直接使用了03 對(duì)于自動(dòng)的情況,那么就由StorageClass來自動(dòng)管理創(chuàng)建04 如果Pod想要使用共享存儲(chǔ),一般會(huì)在創(chuàng)建PVC,PVC中描述了想要什么類型的后端存儲(chǔ)、空間等,K8s從而會(huì)匹配對(duì)應(yīng)的PV,如果沒有匹配成功,Pod就會(huì)處于Pending狀態(tài)。Pod中使用只需要像使用volumes一樣,指定名字就可以使用了05 一個(gè)Pod可以使用多個(gè)PVC,一個(gè)PVC也可以給多個(gè)Pod使用 (pod和pvc的對(duì)應(yīng)關(guān)系是多對(duì)多,直接 claimName 匹配) 06 一個(gè)PVC只能綁定一個(gè)PV,一個(gè)PV只能對(duì)應(yīng)一種后端存儲(chǔ) (pv和pvc的對(duì)應(yīng)關(guān)系是一對(duì)一,通過 accessModes 和 storage 匹配)07 一個(gè)PV只能綁定一個(gè)NFS,但是一個(gè)NFS可以綁定多個(gè)PV
正是因?yàn)?“一個(gè)PVC只能綁定一個(gè)PV”,所以有了storageClass,storageClass解決的是 pv/pvc 一對(duì)一的關(guān)系,如果有 N 個(gè)pvc,這運(yùn)維人員需要新建 N 個(gè)pv,但是有了storageClass,運(yùn)維人員只需要建立好一個(gè)storageClass,就算有 N 個(gè)pvc,這個(gè)storageClass 也會(huì)自動(dòng)創(chuàng)建 N個(gè) pv 來給 N個(gè) pvc使用。
有了StorageClass之后的PVC可以變成這樣 (新的pvc)
kind: PersistentVolumeClaimapiVersion: v1metadata:name: test-claim1spec:accessModes: - ReadWriteManyresources: requests: storage: 1Mi storageClassName: nfs
StorageClass之所以能夠動(dòng)態(tài)供給PV,是因?yàn)镻rovisioner,也就是Dynamic Provisioning,通過 storageClass 來關(guān)聯(lián) pv ,所以需要一個(gè)provisioner的鏡像,并將其作為deployment運(yùn)行到k8s中。但是NFS這種類型,K8s中默認(rèn)是沒有Provisioner插件的,需要自己創(chuàng)建,在github上現(xiàn)成的。
4.2 StorageClass實(shí)踐這里準(zhǔn)備了五個(gè)文件,如下:一個(gè)圖看懂五個(gè)文件的關(guān)聯(lián)關(guān)系好了,開始實(shí)踐 storageClass 根據(jù)pvc的連接自動(dòng)創(chuàng)建pv(可以承受N個(gè)pvc的連接,因?yàn)榭梢宰詣?dòng)創(chuàng)建N個(gè)pv),開始?。?!
(1)準(zhǔn)備好NFS服務(wù)器[并且確保nfs可以正常工作],創(chuàng)建持久化需要的目錄
mkdir -p /nfs/data/jack (這個(gè)目錄是pv要使用的 )
(2)根據(jù)rbac.yaml文件創(chuàng)建資源 【apply第一個(gè)yaml文件,是一個(gè)身份憑證】
kubectl apply -f rbac.yaml
(3)根據(jù)deployment.yaml文件創(chuàng)建資源 【apply第二個(gè)yaml文件,是一個(gè)來自github的插件 (第一步和第二步就是準(zhǔn)備好這兩個(gè)插件)】
kubectl apply -f deployment.yaml
注意,需要修改deployment.yaml文件中的server,我這里NFS服務(wù)器部署在master節(jié)點(diǎn)上,所以部署
path: /nfs/data/jackserver: 192.168.100.150 (就是master節(jié)點(diǎn) nfs服務(wù)器部署在m節(jié)點(diǎn)上)
(4)根據(jù)class.yaml創(chuàng)建資源 【apply第三個(gè)yaml文件,是storageClass,可以根據(jù)pvc的需要自動(dòng)生成pv】
kubectl apply -f class.yaml
(5)根據(jù)pvc.yaml創(chuàng)建資源 【apply第四個(gè)yaml文件,是具體的pvc,因?yàn)閟torageClass已經(jīng)啟動(dòng)了,所以現(xiàn)在可以啟動(dòng)pvc】
kubectl apply -f my-pvc.yamlkubectl get pvc
(6)根據(jù)nginx-pod創(chuàng)建資源 【apply第五個(gè)yaml文件,是具體的消費(fèi)者pod,使用pv/pvc打通好的連接,直接通過claimName連接到pvc,就可以從 NFS服務(wù)器 取到數(shù)據(jù)】
kubectl apply -f nginx-pod.yaml
遠(yuǎn)程服務(wù)器持久化存儲(chǔ)的另一種方式,通過StorageClass自動(dòng)創(chuàng)建PV,啟動(dòng)(五個(gè)配置文件)
測(cè)試 pod/nginx 取到了 NFS 服務(wù)器的文件
# 進(jìn)行同步數(shù)據(jù)測(cè)試,進(jìn)入容器檢查kubectl exec -it nginx bashcd /usr/jack4.3 PV的狀態(tài)和回收策略
PV的狀態(tài)
Available:表示當(dāng)前的pv沒有被綁定
Bound:表示已經(jīng)被pvc掛載
Released:pvc沒有在使用pv, 需要管理員手工釋放pv
Failed:資源回收失敗
沒有被使用可以被使用 已經(jīng)被使用 沒有被使用不可以被使用 狀態(tài)失敗
PV回收策略
Retain:表示刪除PVC的時(shí)候,PV不會(huì)一起刪除,而是變成Released狀態(tài)等待管理員手動(dòng)清理
Recycle:在Kubernetes新版本就不用了,采用動(dòng)態(tài)PV供給來替代
Delete:表示刪除PVC的時(shí)候,PV也會(huì)一起刪除,同時(shí)也刪除PV所指向的實(shí)際存儲(chǔ)空間NFS
注意:目前只有NFS和HostPath支持Recycle策略。AWS EBS、GCE PD、Azure Disk和Cinder支持Delete策略
五、小結(jié)Kubernetes第六篇:k8s持久化存儲(chǔ)(親測(cè)可用),完成了。
天天打碼,天天進(jìn)步??!
關(guān)鍵詞: 服務(wù)器的 文件創(chuàng)建 啟動(dòng)成功
相關(guān)閱讀
-
世界熱推薦:今晚7:00直播丨下一個(gè)突破...
今晚19:00,Cocos視頻號(hào)直播馬上點(diǎn)擊【預(yù)約】啦↓↓↓在運(yùn)營(yíng)了三年... -
NFT周刊|Magic Eden宣布支持Polygon網(wǎng)...
Block-986在NFT這樣的市場(chǎng),每周都會(huì)有相當(dāng)多項(xiàng)目起起伏伏。在過去... -
環(huán)球今亮點(diǎn)!頭條觀察 | DeFi的興衰與...
在比特幣得到機(jī)構(gòu)關(guān)注之后,許多財(cái)務(wù)專家預(yù)測(cè)世界將因?yàn)榧用茇泿诺?.. -
重新審視合作,體育Crypto的可靠關(guān)系才能雙贏
Block-987即使在體育Crypto領(lǐng)域,人們的目光仍然集中在FTX上。隨著... -
簡(jiǎn)訊:前端單元測(cè)試,更進(jìn)一步
前端測(cè)試@2022如果從2014年Jest的第一個(gè)版本發(fā)布開始計(jì)算,前端開發(fā)... -
焦點(diǎn)熱訊:劉強(qiáng)東這波操作秀
近日,劉強(qiáng)東發(fā)布京東全員信,信中提到:自2023年1月1日起,逐步為...