在?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