k8s 持久化存儲卷

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

在 k8s?中部署的應用都是以?pod?容器的形式運行的,假如我們部署?MySQL、Redis?等數據庫,需

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


k8s?持久化存儲方案:emptyDir


kubectl explain pods.spec.volumes

常用如下

emptyDir

hostPath

nfs persistentVolumeClaim glusterfs

cephfs configMap secret

我們想要使用存儲卷,需要經歷如下步驟

1、定義?pod?的?volume,這個?volume?指明它要關聯到哪個存儲上的?

2、在容器中要使用?volume mounts?掛載對應的存儲

? 經過以上兩步才能正確的使用存儲卷

emptyDir?類型的?Volume?是在?Pod?分配到?Node?上時被創建,Kubernetes?會在?Node?上自動 分配一個目錄,因此無需指定宿主機?Node?上對應的目錄文件。 這個目錄的初始內容為空,當?Pod?從?Node?上移除時,emptyDir?中的數據會被永久刪除。emptyDir Volume?主要用于某些應用程序無需永 久保存的臨時目錄,多個容器的共享目錄等。


#創建一個?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

工作節點看掛載目錄


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


k8s?持久化存儲方案:hostPath

hostPath Volume?是指?Pod?掛載宿主機上的目錄或文件。?hostPath Volume?使得容器可以使用 宿主機的文件系統進行存儲,hostpath(宿主機路徑):節點級別的存儲卷,在?pod?被刪除,這個存儲 卷還是存在的,不會被刪除,所以只要同一個?pod?被調度到同一個節點上來,在?pod?被刪除重新被調度 到這個節點之后,對應的數據依然是存在的。

kubectl explain pods.spec.volumes.hostPath

FIELDS:

path -required-

type


tomcat.tar.gz ?上傳到工作節點

#創建一個?pod,掛載?hostPath?存儲卷

如果文檔里有#號注釋復制的時候會亂. ?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 ? ? ? ?#掛載到容器內目錄

? ? ? name: test-volume

? volumes:

? - name: test-volume

? ? hostPath:

? ? ? path: /data1 ? ? ? ? ? ? ? ? ? ? ? ?#掛載到節點目錄

? ? ? type: DirectoryOrCreate ? ?

# DirectoryOrCreate?表示本地有/data1?目錄,就用本地的,本地沒有就會在?pod?調度到的節點 自動創建一個

?kubectl apply -f hostpath.yaml

#查看?pod?調度到了哪個物理節點

kubectl get pods -o wide | grep hostpath

在 god62 上的/data1?下創建一個目錄

# 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/目錄存在,說明已經把宿主機目錄掛載到了容器里?root@test-hostpath:/test-tomcat# ls

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

hostpath?存儲卷缺點:

單節點

pod?刪除之后重新創建必須調度到同一個?node?節點,數據才不會丟失

可以用分布式存儲:?nfs,cephfs,glusterfs


k8s?持久化存儲方案:NFS


hostPath?存儲,存在單點故障,pod?掛載?hostPath?時,只有調度到同一個節點,數據 才不會丟失。那可以使用?nfs?作為持久化存儲。



1、搭建?nfs?服務

#以 k8s?的控制節點作為?NFS?服務端

yum install nfs-utils -y?

#在宿主機創建?NFS?需要的共享目錄

?mkdir /data/volumes -pv?

mkdir: created directory?‘/data’

mkdir: created directory?‘/data/volumes’

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

# systemctl start nfs?

# vim /etc/exports?

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

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

# exportfs -arv

exporting 192.168.172.0/24:/data/volumes

]# service nfs start

Redirecting to /bin/systemctl start nfs.service?

#設置成開機自啟動

]# systemctl enable nfs

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

systemctl status nfs Active:?active

看到?nfs?是?active,說明?nfs?正常啟動了?#god62?和 god64?上也安裝?nfs?驅動?

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/


#創建?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?服務的地址

kubectl get pods -o wide | grep nfs

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

#登錄到?nfs?服務器(master),在共享目錄創建一個?index.html

cd /data/volumes/

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


curl 10.244.187.124

hello,welcome to pod

#通過上面可以看到,在共享目錄創建的?index.html?已經被?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?支持多個客戶端掛載,可以創建多個?pod,掛載同一個?nfs?服務器共享出來的目錄;但是?nfs?如果宕機了,數據也就丟失了,所以需要使用分布式存儲,常見的分布 式存儲有?glusterfs?和?cephfs


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


參考官網:https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes


k8s PV?是什么??

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

k8s PVC?是什么?

PersistentVolumeClaim(PVC)是一個持久化存儲卷,我們在創建?pod?時可以定義這個類型的存儲卷。 它類似于一個?pod。?Pod?消耗節點資源,PVC?消耗?PV?資源。?Pod?可以請求特定級別的資源 (CPU?和內存)。?pvc?在申請?pv?的時候也可以請求特定的大小和訪問模式(例如,可以一次讀寫或多次 只讀)。


k8s PVC?和?PV?工作原理

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

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


(1)pv?的供應方式 可以通過兩種方式配置?PV:靜態或動態。

靜態的:

集群管理員創建了許多 PV。它們包含可供群集用戶使用的實際存儲的詳細信息。它們存在于Kubernetes API?中,可供使用。

動態的:

當管理員創建的靜態 PV?都不匹配用戶的?PersistentVolumeClaim?時,群集可能會嘗試為?PVC?專門動態配置卷。此配置基于?StorageClasses,PVC?必須請求存儲類,管理員必須創建并配置該類,以便 進行動態配置。

2)綁定

用戶創建?

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


3)使用

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

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

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

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

e)pvc?和?pv?它們是一一對應的關系,pv?如果被?pvc?綁定了,就不能被其他?pvc?使用了;?f)我們在創建?pvc?的時候,應該確保和底下的?pv?能綁定,如果沒有合適的?pv,那么?pvc?就會 處于?pending?狀態。


4)回收策略

當我們創建 pod?時如果使用?pvc?做為存儲卷,那么它會和?pv?綁定,當刪除?pod,pvc?和?pv?綁定

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

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

1、Retain

當刪除?pvc?的時候,pv?仍然存在,處于?released?狀態,但是它不能被其他?pvc?綁定使用,里面的 數據還是存在的,當我們下次再使用的時候,數據還是存在的,這個是默認的回收策略

Delete

刪除?pvc?時即會從?Kubernetes?中移除?PV,也會從相關的外部設施中刪除存儲資產


創建?pod,使用?pvc?作為持久化存儲卷?

1、創建?nfs?共享目錄

#在宿主機創建?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、創建?pv

存取模式

PersistentVolume可以通過資源提供者支持的任何方式安裝在主機上。如下表所示,提供商將具有不同的功能,并且每個PV的訪問模式都將設置為該特定卷支持的特定模式。例如,NFS可以支持多個讀/寫客戶端,但是特定的NFS PV可能以只讀方式在服務器上導出。每個PV都有自己的一組訪問模式,用于描述該特定PV的功能。

訪問方式為:

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

ReadOnlyMany-該卷可以被許多節點只讀掛載

ReadWriteMany-該卷可以被許多節點讀寫安裝

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

RWO-ReadWriteOnce

ROX-ReadOnlyMany

RWX-ReadWriteMany

重要的!即使一次卷支持多個卷,也只能一次使用一種訪問模式掛載該卷。例如,GCEPersistentDisk可以由單個節點安裝為ReadWriteOnce,也可以由多個節點安裝為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的存儲空間創建成pv

? ? server: 192.168.172.163? ? #nfs服務器的地址

---

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的存儲空間創建成pv

? ? server: 192.168.172.163

---


#更新資源清單文件

]# kubectl apply -f pv.yaml

#查看?pv?資源


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


創建?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已經被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、創建?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?狀態,正常運行

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

1、我們每次創建?pvc?的時候,需要事先有劃分好的?pv,這樣可能不方便,那么可以在創建?pvc?的 時候直接動態創建一個?pv?這個存儲類,pv?事先是不存在的

2、pvc?和?pv?綁定,如果使用默認的回收策略?retain,那么刪除?pvc?之后,pv?會處于?released?狀 態,我們想要繼續使用這個?pv,需要手動刪除?pv,kubectl delete pv pv_name,刪除?pv,不會刪除?pv?里的數據,當我們重新創建?pvc?時還會和這個最匹配的?pv?綁定,數據還是原來數據,不會丟失。


k8s?存儲類:storageclass


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

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

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

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

2、創建這種?PV?需要使用到的存儲插件,比如?Ceph、NFS?等

有了這兩部分信息,Kubernetes?就能夠根據用戶提交的?PVC,找到對應的?StorageClass,然后?Kubernetes?就會調用?StorageClass?聲明的存儲插件,創建出需要的?PV。

kubectl explain storageclass

allowVolumeExpansion <boolean>

allowedTopologies <[]Object>

mountOptions <[]string>

parameters <map[string]string>

provisioner <string> -required-

reclaimPolicy <string>

volumeBindingMode <string>

provisioner:供應商,storageclass?需要有一個供應者,用來確定我們使用什么樣的存儲來創 建?pv,常見的?provisioner?如下

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


provisioner?既可以由內部供應商提供,也可以由外部供應商提供,如果是外部供應商可以參考?https://github.com/kubernetes-incubator/external-storage/下提供的方法創建。

以?NFS?為例,要想使用?NFS,我們需要一個?nfs-client?的自動裝載程序,稱之為?provisioner,這 個程序會使用我們已經配置好的?NFS?服務器自動創建持久卷,也就是自動幫我們創建?PV。

reclaimPolicy:回收策略

allowVolumeExpansion:允許卷擴展,PersistentVolume?可以配置成可擴展。將此功能設置為

true?時,允許用戶通過編輯相應的?PVC?對象來調整卷大小。當基礎存儲類的?allowVolumeExpansion?字段設置為?true?時,以下類型的卷支持卷擴展。


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


安裝?nfs provisioner,用于配合存儲類動態生成?pv

#把?nfs-provisioner-v1.tar.gz 工作節點上上,手動解壓

1、創建運行?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?里面的進程調用?Kubernetes API?或其他外部服務而設計的。指定了?serviceaccount?之后,我們把?pod?創建出來了,我們在使用這個?pod?時,這個?pod?就 有了我們指定的賬戶的權限了。

2、對?sa?授權

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

3、k8s1.20?版本通過?nfs provisioner?動態生成?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


然后應用它,即可:

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/文檔內容/替換內容/g

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

kubectl get pods | grep nfs

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


創建?storageclass,動態供給?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?是否創建成功

kubectl get storageclass

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

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

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

env:

- name: PROVISIONER_NAME?

? ?value:?example.com/nfs


創建?pvc,通過?storageclass?動態生成?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

#查看是否動態生成了?pv,pvc?是否創建成功,并和?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?已經成功創建了,綁定的?pv?是?pvc-b03288b7-13f8-4e6d-aba7-ff6d23a5c500,這個?pv?是由?storageclass?調用?nfs provisioner?自動生成的。

總結:

1、供應商:創建一個?nfs provisioner

2、創建?storageclass,storageclass?指定剛才創建的供應商?

3、創建?pvc,這個?pvc?指定?storageclass

創建?pod,掛載?storageclass?動態生成的?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?是否創建成功

kubectl get pods | grep read

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容