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
最後測試