121. kubernetes中使用NFS建立pv_pvc

 kubernetes中使用NFS建立pv_pvchtml

 

 

Persistent Volume(持久化卷)簡稱PV, 是一個K8S資源對象,咱們能夠單首創建一個PV, 它不和Pod直接發生關係, 而是經過Persistent Volume Claim, 簡稱PVC來實現動態綁定, 咱們會在Pod定義裏指定建立好的PVC, 而後PVC會根據Pod的要求去自動綁定合適的PV給Pod使用。node

#就是咱們在pod定義的時候能夠指定一個PVC。而後PVC再去和PV進行綁定(這個過程是自動的,不須要去設置上面)。linux

相似於linux咱們不能直接使用一個磁盤,要格式化成你想要的格式,好比xfs、ext4。只有把磁盤格式化成你係統能識別的文件系統,你才能在裏面寫數據。那pv也是同樣的,pod直接識別不了,須要藉助PVC,才能使用它apache

持久化卷下PV和PVC概念:vim

Persistent Volume(PV)是由管理員設置的存儲,它是羣集的一部分(可理解爲是物理層面的)。就像節點是集羣中的資源同樣,PV 也是集羣中的資源。 PV 是 Volume 之類的卷插件,但具備獨立於使用 PV 的 Pod 的生命週期(pv和pod之間沒有直接的關係)。此 API 對象包含存儲實現的細節,即 NFS、iSCSI 或特定於雲供應商的存儲系統。api

PersistentVolumeClaim(PVC)是用戶存儲的請求。它與 Pod 類似,Pod 消耗節點資源,PVC 消耗 PV 資源。Pod 能夠請求特定級別的資源(CPU 和內存)。PVC聲明能夠請求特定的大小和訪問模式(例如,能夠以讀/寫一次或只讀屢次模式掛載)。 #特定大小是請求磁盤存儲的大小是多大,還有權限是可讀仍是可寫或是隻讀bash

它和普通Volume的區別是什麼呢?curl

普通Volume和使用它的Pod之間是一種靜態綁定關係,在定義Pod的文件裏,同時定義了它使用的Volume。Volume是Pod的附屬品,咱們沒法單首創建一個Volume,由於它不是一個獨立的K8S資源對象。 #咱們在pod裏面去定義一個 Volume,那麼pod沒了,Volnme也就沒有了。而pv是獨立存在的,pod沒有了,跟pv沒有關係ide

1 準備一臺機器,搭建NFS服務測試

yum install nfs-utils

vim /etc/exportfs

/data/k8s/ 172.7.15.0/24(sync,rw,no_root_squash) #這裏的ip要寫node節點網段的ip端,是要分享整個集羣的

mkdir /data/k8s #建立該目錄

chmod 777 !$ #爲方便測試,可加777的權限

systemctl start nfs

systemctl start rpcbind

systemctl enable nfs

systemctl enbale rpcbind

2 在node節點上測試

yum install nfs-utils

showmount -e 172.7.15.113

3 建立pv(master上)

vim mypv.yaml //內容以下

apiVersion: v1

kind: PersistentVolume

metadata:

name: pv001

spec:

capacity:

storage: 10Gi #給他10G的空間

accessModes:

- ReadWriteMany #就是可讀可寫不少次

nfs:

path: /data/k8s/ #掛載的目錄

server: 172.7.15.113 #nfs服務端的ip

·························mypv.yaml文件到此爲止································

kubectl create -f mypv.yaml #建立pv

kubectl get pv #查看pv

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE

pv001 10Gi RWX Retain Available 10m

狀態爲Available,這是由於它尚未綁定到任何的pvc上面,當定義完pvc後,就能夠自動綁定了。

4 建立pvc(master上) #讓pod去引用他

vim mypvc.yaml //內容以下 #這個pvc文件能夠自動的去關聯上面建立的pv

kind: PersistentVolumeClaim #注意大小寫

apiVersion: v1

metadata:

name: myclaim

spec:

accessModes:

- ReadWriteMany

resources:

requests:

storage: 8Gi

·························mypvc.yaml文件到此爲止································

kubectl create -f mypvc.yaml

kubectl get pvc

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE

myclaim Bound pv001 10Gi RWX 2m

能夠看到,pvc狀態爲Bound,它綁定了pv001 #這個pv001就是上面咱們建立的pv

5 定義pod #定義一個pod去使用pvc

vim pvpod.yaml //內容以下

apiVersion: v1

kind: Pod

metadata:

name: httpd-pvpod #注意名字不能和其餘的pod有重複

spec:

containers:

- image: httpd

name: httpd-withpvc-pod

imagePullPolicy: Always

volumeMounts:

- mountPath: "/usr/local/apache2/htdocs/" #指定掛載到哪一個目錄去

name: httpd-volume

volumes:

- name: httpd-volume

persistentVolumeClaim:

claimName: myclaim #指定你pvc的名字

·························pvpod.yaml文件到此爲止································

kubectl create -f pvpod.yaml

kubectl describe pod httpd-pvpod //查看Volumes那部分裏的ClaimName

6 驗證

1)到NFS的共享目錄下建立一個文件

cd /data/k8s/

echo "Test file" > 1.html

2)進入到httpd-pod裏

kubectl exec -it httpd-pvpod bash

cat /usr/local/apache2/htdocs/1.html #查看指定的目錄下有無掛載的這個文件

3)刪除httpd-pvpod

kubectl delete pod httpd-pod #刪除這個pod,在master上查看是否有這個。以此證實pvc不受pod的刪除而受影響

cat /data/k8s/1.html

4)重建httpd-pod

kubectl create -f pvpod.yaml #再次重建這個pod。而後再訪問他,看他是否隨着pod的重建而依然持久化這個文件

5)curl訪問

kubectl get pod httpd-pvpod -o wide //查看其對應的IP #就是查看這個pod在哪一個節點上

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE

httpd-pod 1/1 Running 0 2m 172.20.3.5 172.7.15.114 <none>

curl 172.20.3.5/1.html #訪問的時候要訪問這個pod的惟一ip,而不是訪問節點的ip。經過kubectl get pod httpd-pvpod -o wide這個命令來查看pod的ip

參考 http://www.showerlee.com/archives/2280

 

總結:

首先要搭建一個nfs,共享目錄給這個集羣裏全部的節點,包括master

而後再node節點上測試nfs服務(showmount -e)

再建立pv

再建立pvc,pvc能夠自動的去綁定pv

定義pod,指定pvc的名字。實驗中的名字時myclin, claimName: myclaim

最後測試

相關文章
相關標籤/搜索