k8s 持久化存儲卷

在?k8s?中為什么要做持久化存儲?

在 k8s?中部署的應(yīng)用都是以?pod?容器的形式運行的嫁乘,假如我們部署?MySQL、Redis?等數(shù)據(jù)庫球碉,需

要對這些數(shù)據(jù)庫產(chǎn)生的數(shù)據(jù)做備份蜓斧。因為?Pod?是有生命周期的,如果?pod?不掛載數(shù)據(jù)卷睁冬,那?pod?被刪 除或重啟后這些數(shù)據(jù)會隨之消失挎春,如果想要長久的保留這些數(shù)據(jù)就要用到?pod?數(shù)據(jù)持久化存儲。


k8s?持久化存儲方案:emptyDir


kubectl explain pods.spec.volumes

常用如下

emptyDir

hostPath

nfs persistentVolumeClaim glusterfs

cephfs configMap secret

我們想要使用存儲卷豆拨,需要經(jīng)歷如下步驟

1直奋、定義?pod?的?volume,這個?volume?指明它要關(guān)聯(lián)到哪個存儲上的?

2施禾、在容器中要使用?volume mounts?掛載對應(yīng)的存儲

? 經(jīng)過以上兩步才能正確的使用存儲卷

emptyDir?類型的?Volume?是在?Pod?分配到?Node?上時被創(chuàng)建脚线,Kubernetes?會在?Node?上自動 分配一個目錄,因此無需指定宿主機?Node?上對應(yīng)的目錄文件弥搞。 這個目錄的初始內(nèi)容為空邮绿,當(dāng)?Pod?從?Node?上移除時渠旁,emptyDir?中的數(shù)據(jù)會被永久刪除。emptyDir Volume?主要用于某些應(yīng)用程序無需永 久保存的臨時目錄船逮,多個容器的共享目錄等顾腊。


#創(chuàng)建一個?pod,掛載臨時目錄?emptyDir

cat emptydir.yaml

apiVersion: v1

kind: Pod

metadata:

? name: pod-empty

spec:

? containers:

? - name: container-empty

? ? image: nginx

? ? volumeMounts:

? ? - mountPath: /cache

? ? ? name: cache-volume

? volumes:

? - emptyDir:

? ? ? {}

? ? name: cache-volume

kubectl apply -f emptydir.yaml

kubectl get pods -o wide | grep empty


#查看?pod?的?uid

kubectl get pods pod-empty -o yaml | grep uid

uid: ff865494-205a-4318-b8bc-072de1d8ea6f

工作節(jié)點看掛載目錄


由上可知挖胃,臨時目錄在本地的/var/lib/kubelet/pods/ff865494-205a-4318-b8bc-072de1d8ea6f/volumes/kubernetes.io~empty-dir/cache-volume/下


k8s?持久化存儲方案:hostPath

hostPath Volume?是指?Pod?掛載宿主機上的目錄或文件杂靶。?hostPath Volume?使得容器可以使用 宿主機的文件系統(tǒng)進行存儲,hostpath(宿主機路徑):節(jié)點級別的存儲卷酱鸭,在?pod?被刪除吗垮,這個存儲 卷還是存在的,不會被刪除凹髓,所以只要同一個?pod?被調(diào)度到同一個節(jié)點上來抱既,在?pod?被刪除重新被調(diào)度 到這個節(jié)點之后,對應(yīng)的數(shù)據(jù)依然是存在的扁誓。

kubectl explain pods.spec.volumes.hostPath

FIELDS:

path -required-

type


tomcat.tar.gz ?上傳到工作節(jié)點

#創(chuàng)建一個?pod,掛載?hostPath?存儲卷

如果文檔里有#號注釋復(fù)制的時候會亂. ?vim打開的時候加:set paste就不會亂了


,

cat hostpath.yaml

?apiVersion: v1

kind: Pod

metadata:

? name: test-hostpath

spec:

? containers:

? - image: nginx

? ? name: test-nginx

? ? volumeMounts:

? ? - mountPath: /test-nginx

? ? ? name: test-volume

? - image: tomcat

? ? name: test-tomcat

? ? volumeMounts:

? ? - mountPath: /test-tomcat ? ? ? ?#掛載到容器內(nèi)目錄

? ? ? name: test-volume

? volumes:

? - name: test-volume

? ? hostPath:

? ? ? path: /data1 ? ? ? ? ? ? ? ? ? ? ? ?#掛載到節(jié)點目錄

? ? ? type: DirectoryOrCreate ? ?

# DirectoryOrCreate?表示本地有/data1?目錄蚀之,就用本地的蝗敢,本地沒有就會在?pod?調(diào)度到的節(jié)點 自動創(chuàng)建一個

?kubectl apply -f hostpath.yaml

#查看?pod?調(diào)度到了哪個物理節(jié)點

kubectl get pods -o wide | grep hostpath

在 god62 上的/data1?下創(chuàng)建一個目錄

# mkdir -p /data1/god

#測試存儲卷是否可以正常使用,登錄到?nginx?容器

kubectl exec -it test-hostpath -c test-nginx -- /bin/bash

#測試存儲卷是否可以正常使用,登錄到?tomcat?容器

kubectl exec -it test-hostpath -c test-tomcat -- /bin/bash root@test-hostpath:/usr/local/tomcat# cd /test-tomcat/ #/test-tomcat/目錄存在,說明已經(jīng)把宿主機目錄掛載到了容器里?root@test-hostpath:/test-tomcat# ls

#通過上面測試可以看到足删,同一個?pod?里的?test-nginx?和?test-tomcat?這兩個容器是共享存儲卷 的寿谴。

hostpath?存儲卷缺點:

單節(jié)點

pod?刪除之后重新創(chuàng)建必須調(diào)度到同一個?node?節(jié)點,數(shù)據(jù)才不會丟失

可以用分布式存儲:?nfs失受,cephfs讶泰,glusterfs


k8s?持久化存儲方案:NFS


hostPath?存儲,存在單點故障拂到,pod?掛載?hostPath?時痪署,只有調(diào)度到同一個節(jié)點,數(shù)據(jù) 才不會丟失兄旬。那可以使用?nfs?作為持久化存儲狼犯。



1、搭建?nfs?服務(wù)

#以 k8s?的控制節(jié)點作為?NFS?服務(wù)端

yum install nfs-utils -y?

#在宿主機創(chuàng)建?NFS?需要的共享目錄

?mkdir /data/volumes -pv?

mkdir: created directory?‘/data’

mkdir: created directory?‘/data/volumes’

#配置?nfs?共享服務(wù)器上的/data/volumes?目錄?

# systemctl start nfs?

# vim /etc/exports?

/data/volumes ?192.168.1.0/24(rw,no_root_squash)?

#no_root_squash:?用戶具有根目錄的完全管理訪問權(quán)限?#使?NFS?配置生效

# exportfs -arv

exporting 192.168.172.0/24:/data/volumes

]# service nfs start

Redirecting to /bin/systemctl start nfs.service?

#設(shè)置成開機自啟動

]# systemctl enable nfs

#查看?nfs?是否啟動成功

systemctl status nfs Active:?active

看到?nfs?是?active领铐,說明?nfs?正常啟動了?#god62?和 god64?上也安裝?nfs?驅(qū)動?

yum install nfs-utils -y

service nfs start && systemctl enable nfs

在 god62 上手動掛載試試:

mount -t nfs 192.168.172.63:/data/volumes /data1

df -h 看一哈


#手動卸載:

?umount /data1/


#創(chuàng)建?Pod悯森,掛載?NFS?共享出來的目錄

cat nfs.yaml

apiVersion: v1

kind: Pod

metadata:

? name: test-nfs-volume

spec:

? containers:

? - name: test-nfs

? ? image: nginx

? ? ports:

? ? - containerPort: 80

? ? ? protocol: TCP

? ? volumeMounts:

? ? - mountPath: /usr/share/nginx/html

? ? ? name: nfs-volumes

? volumes:

? - name: nfs-volumes

? ? nfs:

? ? ? server: 192.168.172.163

? ? ? path:? /data/volumes

注:path: /data/volumes #nfs?的共享目錄

server:192.168.172.63?是 god63?機器的?ip,這個是安裝?nfs?服務(wù)的地址

kubectl get pods -o wide | grep nfs

test-nfs-volume? ? ? ? 1/1? ? Running? ? 0? ? ? ? ? 59s? ? 10.244.187.124 ?god62? <none>? ? ? ? ? <no

#登錄到?nfs?服務(wù)器(master)绪撵,在共享目錄創(chuàng)建一個?index.html

cd /data/volumes/

echo "hello,welcome to pod" > inde.html


curl 10.244.187.124

hello,welcome to pod

#通過上面可以看到瓢姻,在共享目錄創(chuàng)建的?index.html?已經(jīng)被?pod?掛載了

#登錄到?pod?驗證下

# kubectl exec -it test-nfs-volume -- /bin/bash root@test-nfs-volume:/# cat /usr/share/nginx/html/index.html

hello, Welcome to pod

?#上面說明掛載?nfs?存儲卷成功了,nfs?支持多個客戶端掛載音诈,可以創(chuàng)建多個?pod幻碱,掛載同一個?nfs?服務(wù)器共享出來的目錄;但是?nfs?如果宕機了绎狭,數(shù)據(jù)也就丟失了,所以需要使用分布式存儲收班,常見的分布 式存儲有?glusterfs?和?cephfs


k8s?持久化存儲方案:?PVC


參考官網(wǎng):https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes


k8s PV?是什么??

PersistentVolume(PV)是群集中的一塊存儲坟岔,由管理員配置或使用存儲類動態(tài)配置。 它是集群中的資源摔桦,就像?pod?是?k8s?集群資源一樣社付。?PV?是容量插件,如?Volumes邻耕,其生命周期獨立于使用?PV?的任何單個?pod鸥咖。

k8s PVC?是什么?

PersistentVolumeClaim(PVC)是一個持久化存儲卷,我們在創(chuàng)建?pod?時可以定義這個類型的存儲卷兄世。 它類似于一個?pod啼辣。?Pod?消耗節(jié)點資源,PVC?消耗?PV?資源御滩。?Pod?可以請求特定級別的資源 (CPU?和內(nèi)存)鸥拧。?pvc?在申請?pv?的時候也可以請求特定的大小和訪問模式(例如,可以一次讀寫或多次 只讀)削解。


k8s PVC?和?PV?工作原理

PV?是群集中的資源富弦。?PVC?是對這些資源的請求。

?PV?和?PVC?之間的相互作用遵循以下生命周期:


(1)pv?的供應(yīng)方式 可以通過兩種方式配置?PV:靜態(tài)或動態(tài)氛驮。

靜態(tài)的:

集群管理員創(chuàng)建了許多 PV腕柜。它們包含可供群集用戶使用的實際存儲的詳細(xì)信息。它們存在于Kubernetes API?中矫废,可供使用盏缤。

動態(tài)的:

當(dāng)管理員創(chuàng)建的靜態(tài) PV?都不匹配用戶的?PersistentVolumeClaim?時,群集可能會嘗試為?PVC?專門動態(tài)配置卷蓖扑。此配置基于?StorageClasses唉铜,PVC?必須請求存儲類,管理員必須創(chuàng)建并配置該類赵誓,以便 進行動態(tài)配置打毛。

2)綁定

用戶創(chuàng)建?

pvc?并指定需要的資源和訪問模式。在找到可用?pv?之前俩功,pvc?會保持未綁定狀態(tài)


3)使用

a)需要找一個存儲服務(wù)器幻枉,把它劃分成多個存儲空間;

b)k8s?管理員可以把這些存儲空間定義成多個?pv;

c)在?pod?中使用?pvc?類型的存儲卷之前需要先創(chuàng)建?pvc,通過定義需要使用的?pv?的大小和對應(yīng) 的訪問模式诡蜓,找到合適的?pv;

d)pvc?被創(chuàng)建之后熬甫,就可以當(dāng)成存儲卷來使用了,我們在定義?pod?時就可以使用這個?pvc?的存 儲卷

e)pvc?和?pv?它們是一一對應(yīng)的關(guān)系蔓罚,pv?如果被?pvc?綁定了椿肩,就不能被其他?pvc?使用了;?f)我們在創(chuàng)建?pvc?的時候瞻颂,應(yīng)該確保和底下的?pv?能綁定,如果沒有合適的?pv郑象,那么?pvc?就會 處于?pending?狀態(tài)贡这。


4)回收策略

當(dāng)我們創(chuàng)建 pod?時如果使用?pvc?做為存儲卷,那么它會和?pv?綁定厂榛,當(dāng)刪除?pod盖矫,pvc?和?pv?綁定

就會解除,解除之后和?pvc?綁定的?pv?卷里的數(shù)據(jù)需要怎么處理击奶,目前辈双,卷可以保留,回收或刪除:?Retain

Recycle?(不推薦使用柜砾,1.15?可能被廢棄了)?Delete

1湃望、Retain

當(dāng)刪除?pvc?的時候,pv?仍然存在痰驱,處于?released?狀態(tài)证芭,但是它不能被其他?pvc?綁定使用,里面的 數(shù)據(jù)還是存在的担映,當(dāng)我們下次再使用的時候檩帐,數(shù)據(jù)還是存在的,這個是默認(rèn)的回收策略

Delete

刪除?pvc?時即會從?Kubernetes?中移除?PV另萤,也會從相關(guān)的外部設(shè)施中刪除存儲資產(chǎn)


創(chuàng)建?pod,使用?pvc?作為持久化存儲卷?

1诅挑、創(chuàng)建?nfs?共享目錄

#在宿主機創(chuàng)建?NFS?需要的共享目錄

# mkdir /data/volume_test/v{1,2,3,4,5,6,7,8,9,10} -p

#配置?nfs?共享宿主機上的/data/volume_test/v1..v10?目錄

cat /etc/exports

/data/volumes 192.168.172.0/24(rw,no_root_squash)

/data/volumes 192.168.172.0/24(rw,no_root_squash)

/data/volume_test/v1 192.168.172.0/24(rw,no_root_squash)

/data/volume_test/v2 192.168.172.0/24(rw,no_root_squash)

/data/volume_test/v3 192.168.172.0/24(rw,no_root_squash)

/data/volume_test/v4 192.168.172.0/24(rw,no_root_squash)

/data/volume_test/v5 192.168.172.0/24(rw,no_root_squash)

/data/volume_test/v6 192.168.172.0/24(rw,no_root_squash)

/data/volume_test/v7 192.168.172.0/24(rw,no_root_squash)

/data/volume_test/v8 192.168.172.0/24(rw,no_root_squash)

/data/volume_test/v9 192.168.172.0/24(rw,no_root_squash)

/data/volume_test/v10 192.168.172.0/24(rw,no_root_squash)

# 冒號替換一下保存

:1,$s/192.168.1.0/192.168.172.0/g


#重新加載配置四敞,使配置成效

exportfs -arv

systemctl restart nfs


#查看定義?pv?需要的字段

kubectl explain pv.spec.nfs

path <string> -required-

readOnly <boolean>

server <string> -required-


3、創(chuàng)建?pv

存取模式

PersistentVolume可以通過資源提供者支持的任何方式安裝在主機上拔妥。如下表所示忿危,提供商將具有不同的功能,并且每個PV的訪問模式都將設(shè)置為該特定卷支持的特定模式没龙。例如铺厨,NFS可以支持多個讀/寫客戶端,但是特定的NFS PV可能以只讀方式在服務(wù)器上導(dǎo)出硬纤。每個PV都有自己的一組訪問模式解滓,用于描述該特定PV的功能。

訪問方式為:

ReadWriteOnce-可以通過單個節(jié)點以讀寫方式安裝該卷

ReadOnlyMany-該卷可以被許多節(jié)點只讀掛載

ReadWriteMany-該卷可以被許多節(jié)點讀寫安裝

在CLI中筝家,訪問模式縮寫為:

RWO-ReadWriteOnce

ROX-ReadOnlyMany

RWX-ReadWriteMany

重要的洼裤!即使一次卷支持多個卷,也只能一次使用一種訪問模式掛載該卷溪王。例如腮鞍,GCEPersistentDisk可以由單個節(jié)點安裝為ReadWriteOnce值骇,也可以由多個節(jié)點安裝為ReadOnlyMany,但不能同時安裝移国。

cat pv.yaml

apiVersion: v1

kind: PersistentVolume

metadata:

? name: v1

spec:

? capacity:

? ? storage: 1Gi? ? #pv的存儲空間容量?

? accessModes: ["ReadWriteOnce"]

? nfs:

? ? path: /data/volume_test/v1 #把nfs的存儲空間創(chuàng)建成pv

? ? server: 192.168.172.163? ? #nfs服務(wù)器的地址

---

apiVersion: v1

kind: PersistentVolume

metadata:

? name:? v2

spec:

? capacity:

? ? ? storage: 2Gi

? accessModes: ["ReadWriteMany"]

? nfs:

? ? path: /data/volume_test/v2

? ? server: 192.168.40.130

---

apiVersion: v1

kind: PersistentVolume

metadata:

? name:? v3

spec:

? capacity:

? ? ? storage: 3Gi

? accessModes: ["ReadOnlyMany"]

? nfs:

? ? path: /data/volume_test/v3

? ? server: 192.168.40.130

---

apiVersion: v1

kind: PersistentVolume

metadata:

? name:? v4

spec:

? capacity:

? ? ? storage: 4Gi

? accessModes: ["ReadWriteOnce","ReadWriteMany"]

? nfs:

? ? path: /data/volume_test/v4

? ? server: 192.168.40.130

---

apiVersion: v1

kind: PersistentVolume

metadata:

? name:? v5

spec:

? capacity:

? ? ? storage: 5Gi

? accessModes: ["ReadWriteOnce","ReadWriteMany"]

? nfs:

? ? path: /data/volume_test/v5

? ? server: 192.168.40.130

---

apiVersion: v1

kind: PersistentVolume

metadata:

? name:? v6

spec:

? capacity:

? ? ? storage: 6Gi

? accessModes: ["ReadWriteOnce","ReadWriteMany"]

? nfs:

? ? path: /data/volume_test/v6

? ? server: 192.168.40.130

---

apiVersion: v1

kind: PersistentVolume

metadata:

? name:? v7

spec:

? capacity:

? ? ? storage: 7Gi

? accessModes: ["ReadWriteOnce","ReadWriteMany"]

? nfs:

? ? path: /data/volume_test/v7

? ? server: 192.168.40.130

---

apiVersion: v1

kind: PersistentVolume

metadata:

? name:? v8

spec:

? capacity:

? ? ? storage: 8Gi

? accessModes: ["ReadWriteOnce","ReadWriteMany"]

? nfs:

? ? path: /data/volume_test/v8

? ? server: 192.168.40.130

---

apiVersion: v1

kind: PersistentVolume

metadata:

? name:? v9

spec:

? capacity:

? ? ? storage: 9Gi

? accessModes: ["ReadWriteOnce","ReadWriteMany"]

? nfs:

? ? path: /data/volume_test/v9

? ? server: 192.168.172.163

---

apiVersion: v1

kind: PersistentVolume

metadata:

? name:? v10

spec:

? capacity:? ? #pv的存儲空間容量

? ? ? storage: 10Gi

? accessModes: ["ReadWriteOnce","ReadWriteMany"]

? nfs:

? ? path: /data/volume_test/v10? #把nfs的存儲空間創(chuàng)建成pv

? ? server: 192.168.172.163

---


#更新資源清單文件

]# kubectl apply -f pv.yaml

#查看?pv?資源


#STATUS?是?Available吱瘩,表示?pv?是可用的


創(chuàng)建?pvc,和符合條件的?pv?綁定

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

? name: my-pvc

spec:

? accessModes: ["ReadWriteMany"]

? resources:

? ? requests:

? ? ? storage: 2Gi


kubectl apply -f pvc.yaml

#查看?pv?和?pvc

# kubectl get pv


#STATUS是Bound迹缀,表示這個pv已經(jīng)被my-pvc綁定了

kubectl get pvc

NAME? ? STATUS? VOLUME? CAPACITY? ACCESS MODES? STORAGECLASS? AGE

my-pvc? Bound ? ? ? ? v2? ? ? 2Gi? ? ? ? RWX? ? ? ? ? ? ? ? ? ? ? ? ? 2m25s

#. pvc?的名字-綁定到?pv-綁定的是?v2?這個?pv-pvc?可使用的容量是?2G#


5使碾、創(chuàng)建?pod,掛載?pvc

cat pod_pvc.yaml

apiVersion: v1

kind: Pod

metadata:

? name: pod-pvc

spec:? ?

? containers:

? - name: nginx

? ? image: nginx

? ? volumeMounts:

? ? - name: nginx-html

? ? ? mountPath: /usr/share/nginx/html

? volumes:

? - name: nginx-html

? ? persistentVolumeClaim:

? ? ? claimName: my-pvc


kubectl get pods | grep pod-pvc

pod-pvc? ? ? ? ? ? ? ? 1/1? ? Running? ? 0? ? ? ? ? 71s

#通過上面可以看到?pod?處于?running?狀態(tài)裹芝,正常運行

注:使用?pvc?和?pv?的注意事項

1部逮、我們每次創(chuàng)建?pvc?的時候,需要事先有劃分好的?pv嫂易,這樣可能不方便兄朋,那么可以在創(chuàng)建?pvc?的 時候直接動態(tài)創(chuàng)建一個?pv?這個存儲類,pv?事先是不存在的

2怜械、pvc?和?pv?綁定颅和,如果使用默認(rèn)的回收策略?retain,那么刪除?pvc?之后缕允,pv?會處于?released?狀 態(tài)峡扩,我們想要繼續(xù)使用這個?pv,需要手動刪除?pv障本,kubectl delete pv pv_name教届,刪除?pv,不會刪除?pv?里的數(shù)據(jù)驾霜,當(dāng)我們重新創(chuàng)建?pvc?時還會和這個最匹配的?pv?綁定案训,數(shù)據(jù)還是原來數(shù)據(jù),不會丟失粪糙。


k8s?存儲類:storageclass


上面介紹的?PV?和?PVC?模式都是需要先創(chuàng)建好?PV强霎,然后定義好?PVC?和?pv?進行一對一的?Bond, 但是如果?PVC?請求成千上萬蓉冈,那么就需要創(chuàng)建成千上萬的?PV城舞,對于運維人員來說維護成本很高,?Kubernetes?提供一種自動創(chuàng)建?PV?的機制寞酿,叫?StorageClass家夺,它的作用就是創(chuàng)建?PV?的模板。k8s?集 群管理員通過創(chuàng)建?storageclass?可以動態(tài)生成一個存儲卷?pv?供?k8s pvc?使用伐弹。

每個?StorageClass?都包含字段?provisioner秦踪,parameters?和?reclaimPolicy。

具體來說,StorageClass?會定義以下兩部分:

1椅邓、PV?的屬性 柠逞,比如存儲的大小、類型等;

2景馁、創(chuàng)建這種?PV?需要使用到的存儲插件板壮,比如?Ceph、NFS?等

有了這兩部分信息合住,Kubernetes?就能夠根據(jù)用戶提交的?PVC绰精,找到對應(yīng)的?StorageClass,然后?Kubernetes?就會調(diào)用?StorageClass?聲明的存儲插件透葛,創(chuàng)建出需要的?PV笨使。

kubectl explain storageclass

allowVolumeExpansion <boolean>

allowedTopologies <[]Object>

mountOptions <[]string>

parameters <map[string]string>

provisioner <string> -required-

reclaimPolicy <string>

volumeBindingMode <string>

provisioner:供應(yīng)商,storageclass?需要有一個供應(yīng)者僚害,用來確定我們使用什么樣的存儲來創(chuàng) 建?pv硫椰,常見的?provisioner?如下

(https://kubernetes.io/zh/docs/concepts/storage/storage-classes/):


provisioner?既可以由內(nèi)部供應(yīng)商提供,也可以由外部供應(yīng)商提供萨蚕,如果是外部供應(yīng)商可以參考?https://github.com/kubernetes-incubator/external-storage/下提供的方法創(chuàng)建靶草。

以?NFS?為例,要想使用?NFS岳遥,我們需要一個?nfs-client?的自動裝載程序奕翔,稱之為?provisioner,這 個程序會使用我們已經(jīng)配置好的?NFS?服務(wù)器自動創(chuàng)建持久卷浩蓉,也就是自動幫我們創(chuàng)建?PV派继。

reclaimPolicy:回收策略

allowVolumeExpansion:允許卷擴展,PersistentVolume?可以配置成可擴展捻艳。將此功能設(shè)置為

true?時互艾,允許用戶通過編輯相應(yīng)的?PVC?對象來調(diào)整卷大小。當(dāng)基礎(chǔ)存儲類的?allowVolumeExpansion?字段設(shè)置為?true?時讯泣,以下類型的卷支持卷擴展。


注意:此功能僅用于擴容卷阅悍,不能用于縮小卷好渠。


安裝?nfs provisioner,用于配合存儲類動態(tài)生成?pv

#把?nfs-provisioner-v1.tar.gz 工作節(jié)點上上节视,手動解壓

1拳锚、創(chuàng)建運行?nfs-provisioner?需要的?sa?賬號

cat serviceaccount.yaml

apiVersion: v1

kind: ServiceAccount

metadata:

? name: nfs-provisioner

kubectl apply -f serviceaccount.yaml


what. ? sa?

sa?的全稱是?serviceaccount。

serviceaccount?是為了方便?Pod?里面的進程調(diào)用?Kubernetes API?或其他外部服務(wù)而設(shè)計的寻行。指定了?serviceaccount?之后霍掺,我們把?pod?創(chuàng)建出來了,我們在使用這個?pod?時,這個?pod?就 有了我們指定的賬戶的權(quán)限了杆烁。

2牙丽、對?sa?授權(quán)

#kubectl create clusterrolebinding nfs-provisioner --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner

3、k8s1.20?版本通過?nfs provisioner?動態(tài)生成?pv?會報錯

Unexpected error getting claim reference to claim "default/test-claim1": selfLink was empty, can't make reference兔魂,報錯原因是?1.20?版本僅用了?selfLink烤芦,解決方法如下;

vim /etc/kubernetes/manifests/kube-apiserver.yaml

在這里:

spec:

containers: - command:

- kube-apiserver?添加這一行:

- --feature-gates=RemoveSelfLink=false


然后應(yīng)用它,即可:

kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml

二進制安裝的?k8s析校,按如下修改:

vi /etc/systemd/system/kube-apiserver.service

--feature-gates=RemoveSelfLink=false \

--v=2

systemctl datemon-reload

systemctl restart apiserver

4构罗、安裝?nfs-provisioner?程序

# mkdir /data/nfs_pro -p

#把/data/nfs_pro?變成?nfs?共享的目錄

cat /etc/exports

/data/nfs_pro 192.168.172.0/24(rw,no_root_squash)


#exportfs -arv

systemctl restart nfs

cat nfs-deployment.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

? name: nfs-provisioner

spec:

? selector:

? ? matchLabels:

? ? ? app: nfs-provisioner

? replicas: 1

? strategy:

? ? type: Recreate

? template:

? ? metadata:

? ? ? labels:

? ? ? ? app: nfs-provisioner

? ? spec:

? ? ? serviceAccount: nfs-provisioner

? ? ? containers:

? ? ? ? - name: nfs-provisioner

? ? ? ? ? image: registry.cn-hangzhou.aliyuncs.com/god/nfs-client-provisioner:v1

? ? ? ? ? volumeMounts:

? ? ? ? ? ? - name: nfs-client-root

? ? ? ? ? ? ? mountPath: /persistentvolumes

? ? ? ? ? env:

? ? ? ? ? ? - name: PROVISIONER_NAME

? ? ? ? ? ? ? value: example.com/nfs ? ? ? ? ? #提供人表示提供人的類型。

? ? ? ? ? ? - name: NFS_SERVER

? ? ? ? ? ? ? value: 192.168.172.163

? ? ? ? ? ? - name: NFS_PATH

? ? ? ? ? ? ? value: /data/nfs_pro/

? ? ? volumes:

? ? ? ? - name: nfs-client-root

? ? ? ? ? nfs:

? ? ? ? ? ? server: 192.168.172.163

? ? ? ? ? ? path: /data/nfs_pro/

kubectl apply -f nfs-deployment.yaml

1,$s/文檔內(nèi)容/替換內(nèi)容/g

#查看?nfs-provisioner?是否正常運行

kubectl get pods | grep nfs

nfs-provisioner-6cb84f5d49-nwvtj? 1/1? ? Running? ? 0? ? ? ? ? 22s


創(chuàng)建?storageclass智玻,動態(tài)供給?pv


cat nfs-storageclass.yaml

apiVersion: storage.k8s.io/v1

kind:? StorageClass

metadata:

? name: nfs

provisioner: example.com/nfs

kubectl apply -f nfs-storageclass.yaml

#查看?storageclass?是否創(chuàng)建成功

kubectl get storageclass

NAME? PROVISIONER? ? ? RECLAIMPOLICY? VOLUMEBINDINGMODE? ALLOWVOLUMEEXPANSION? AGE

nfs? ? example.com/nfs? Delete? ? ? ? ? Immediate? ? ? ? ? false? ? ? ? ? ? ? ? ? 2s

注意:provisioner?處寫的?example.com/nfs?應(yīng)該跟安裝?nfs provisioner?時候的?env?下的?PROVISIONER_NAME?的?value?值保持一致遂唧,如下:

env:

- name: PROVISIONER_NAME?

? ?value:?example.com/nfs


創(chuàng)建?pvc,通過?storageclass?動態(tài)生成?pv

cat claim.yaml

kind: PersistentVolumeClaim

apiVersion: v1

metadata:

? name: test-claim1

? annotations:

? ? volume.beta.kubernetes.io/storage-class: "nfs"

spec:

? accessModes:? ["ReadWriteMany"]

? resources:

? ? requests:

? ? ? storage: 1Gi

? storageClassName:? nfs


kubectl apply -f claim.yaml

#查看是否動態(tài)生成了?pv吊奢,pvc?是否創(chuàng)建成功盖彭,并和?pv?綁定

kubectl get pvc

NAME? ? ? ? ? STATUS? VOLUME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CAPACITY? ACCESS MODES? STORAGECLASS? AGE

my-pvc? ? ? ? Bound? ? v2? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2Gi? ? ? ? RWX? ? ? ? ? ? ? ? ? ? ? ? ? 22h

test-claim1? Bound? ? pvc-b03288b7-13f8-4e6d-aba7-ff6d23a5c500? 1Gi? ? ? ? RWX? ? ? ? ? ? nfs? ? ? ? ? ? 7m16s

#通過上面可以看到?test-claim1?的?pvc?已經(jīng)成功創(chuàng)建了,綁定的?pv?是?pvc-b03288b7-13f8-4e6d-aba7-ff6d23a5c500事甜,這個?pv?是由?storageclass?調(diào)用?nfs provisioner?自動生成的谬泌。

總結(jié):

1、供應(yīng)商:創(chuàng)建一個?nfs provisioner

2逻谦、創(chuàng)建?storageclass掌实,storageclass?指定剛才創(chuàng)建的供應(yīng)商?

3、創(chuàng)建?pvc邦马,這個?pvc?指定?storageclass

創(chuàng)建?pod贱鼻,掛載?storageclass?動態(tài)生成的?pvc:test-claim1

cat read-pod.yaml

apiVersion: v1

kind: Pod

metadata:

? name: read-pod

spec:

? containers:

? - name: read-pod

? ? image: nginx

? ? volumeMounts:

? ? ? - name: nfs-pvc

? ? ? ? mountPath: /usr/share/nginx/html

? restartPolicy:

? volumes:

? ? - name: nfs-pvc

? ? ? persistentVolumeClaim:

? ? ? ? claimName: test-claim1


#查看?pod?是否創(chuàng)建成功

kubectl get pods | grep read

read-pod? ? ? ? ? ? ? ? ? ? ? ? ? 1/1? ? Running? ? 0? ? ? ? ? 29s

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市滋将,隨后出現(xiàn)的幾起案子邻悬,更是在濱河造成了極大的恐慌,老刑警劉巖随闽,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件父丰,死亡現(xiàn)場離奇詭異,居然都是意外死亡掘宪,警方通過查閱死者的電腦和手機蛾扇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魏滚,“玉大人镀首,你說我怎么就攤上這事∈蟠危” “怎么了更哄?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵芋齿,是天一觀的道長。 經(jīng)常有香客問我成翩,道長觅捆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任捕传,我火速辦了婚禮惠拭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘庸论。我一直安慰自己职辅,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布聂示。 她就那樣靜靜地躺著域携,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鱼喉。 梳的紋絲不亂的頭發(fā)上秀鞭,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音扛禽,去河邊找鬼锋边。 笑死,一個胖子當(dāng)著我的面吹牛编曼,可吹牛的內(nèi)容都是我干的豆巨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼掐场,長吁一口氣:“原來是場噩夢啊……” “哼往扔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起熊户,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤萍膛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嚷堡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝗罗,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年蝌戒,在試婚紗的時候發(fā)現(xiàn)自己被綠了串塑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓶颠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刺桃,到底是詐尸還是另有隱情粹淋,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站桃移,受9級特大地震影響屋匕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜借杰,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一过吻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔗衡,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至济蝉,卻和暖如春杰刽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背王滤。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工贺嫂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雁乡。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓第喳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蔗怠。 傳聞我的和親對象是個殘疾皇子墩弯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容