volume支援多種不同的内置驅動,使用volumes需要知道後端驅動的細節,使用起來不友善,是以社群提出了PV概念,即通過管理者定義好PV,通過PVC使用PV;随着PV數量的不斷增加,管理者需要頻繁定義PV,是以提出了動态存儲StorageClass,通過PVC中調用StorageClass動态建立PV,接下來介紹進階進階PV/PVC。
1. PV與PVC存儲
1.1 PV概念介紹
- PV即PersistentVolume持久化存儲,是管理者定義的一塊存儲空間,能抽象化底層存儲細節,和node類似,PV是叢集級别的資源,生命周期獨立于Pod,支援靜态建立和動态建立,動态建立需通過StorageClass。
- PVC即PersistentVolumeClaim持久化存儲申明,作為PV資源的使用方,可以指定請求存儲容量大小和通路模式
- StorageClass,存儲類型支援建立PV,通過在PVC中指定StorageClass可動态建立PV,且支援指定不同的存儲
PV支援設定字段介紹:
- Capacity 存儲的特性,目前隻支援通過capacity指定存儲大小,未來會支援IOPS,吞吐量等名額
- VolumeMode 存儲卷的類型,預設為filesystem,如果是塊裝置指定為block
- Class 通過storageClassName指定靜态StorageClass的名稱
- Reclaim Policy 回收政策,支援Retain保留,Recycle回收,DELETE删除
- Volume驅動類型,和上一篇文章介紹的類似,支援不同的plugin驅動如RBD,NFS
- Mount Options 挂載模式,支援管理者定義不同的挂載選項
- AccessMode 通路模式,指定node的挂載方式,支援ReadWriteOnce讀寫挂載一次,ReadOnlyMany多個節點挂載隻讀模式,ReadWriteMany多個節點挂載讀寫模式,不同的volume驅動類型支援的模式有所不同,如下
1.2 定義PV存儲
接下來我們開始學習PV的使用,使用階段分為:1. 預先建立好PV,2. 使用者通過PVC調用PV,3. Pod中應用PVC,建立流程參考下圖:
1. 定義一個PV,指定大小為10G,讀寫模式為單個node讀寫,回收模式為Retain,後端驅動plugin為NFS
[root@node-1 happylau]# cat pv-nfs-storage.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-storage
labels:
storage: nfs
annotations:
kubernetes.io.description: pv-storage
spec:
storageClassName: nfs #靜态指定存儲類StorageClass名稱
capacity: #capacity指定存儲容量大小
storage: 10Gi
accessModes: #通路模式為單個節點讀寫模式
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain #回收模式為保留
nfs: #後端plugin驅動類型為NFS,指定server和path路徑
server: 10.254.100.101
path: /mnt/data
2. 建立PersistentVolumes
[root@node-1 happylau]# kubectl apply -f pv-nfs-storage.yaml
persistentvolume/pv-nfs-storage unchanged
3. 檢視PersistentVolumes清單
[root@node-1 happylau]# kubectl get persistentvolumes
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs-storage 10Gi RWO Retain Available nfs 43m
關于PV輸出解釋說明:
- ACCESS MODES 指定的是讀寫模式,RWO代表ReadWriteOnce,ROM代表ReadOnlyMany,RWX代表ReadWriteMany
- STATUS代表PV狀态,Available剛建立未綁定狀态,Bound為與PVC綁定,Released為PVC删除PV未釋放,Failed狀态異常。
4. 檢視PV詳細資訊,呈現的資訊會更詳細
[root@node-1 ~]# kubectl describe persistentvolumes pv-nfs-storage
Name: pv-nfs-storage
Labels: storage=nfs
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{"kubernetes.io.description":"pv-storage"},"labels":{"storage":"nfs...
kubernetes.io.description: pv-storage
Finalizers: [kubernetes.io/pv-protection]
StorageClass: nfs
Status: Available
Claim:
Reclaim Policy: Retain
Access Modes: RWO
VolumeMode: Filesystem
Capacity: 10Gi
Node Affinity: <none>
Message:
Source:
Type: NFS (an NFS mount that lasts the lifetime of a pod)
Server: 10.254.100.101
Path: /mnt/data
ReadOnly: false
Events: <none>
1.3. PVC引用PV
1. 通過定義PVC,通過selector和PV實作關聯,指定到相同的StorageClass
[root@node-1 happylau]# cat pvc-nfs-storage.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs-storage
labels:
storage: pvc
annotations:
kubernetes.io/description: "PersistentVolumeClaim for PV"
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
storageClassName: nfs
resources:
requests:
storage: 1Gi
limits:
storage: 10Gi
selector:
matchLabels:
storage: nfs
2. 生成PersistentVolumeClaim
[root@node-1 happylau]# kubectl apply -f pvc-nfs-storage.yaml
persistentvolumeclaim/pvc-nfs-storage created
3. 檢視PersistentVolumeClaim清單,通過STATUS可以知道,目前PVC和PV已經Bond關聯
[root@node-1 happylau]# kubectl get persistentvolumeclaims
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-nfs-storage Bound pv-nfs-storage 10Gi RWO nfs
檢視PVC詳情:
[root@node-1 happylau]# kubectl describe persistentvolumeclaims pvc-nfs-storage
Name: pvc-nfs-storage
Namespace: default
StorageClass: nfs
Status: Bound
Volume: pv-nfs-storage
Labels: storage=pvc
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{"kubernetes.io/description":"PersistentVolumeClaim for PV"},"...
kubernetes.io/description: PersistentVolumeClaim for PV
pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 10Gi
Access Modes: RWO
VolumeMode: Filesystem
Mounted By: <none>
Events: <none>
4. 再次檢視PV的狀态,此時狀态為Bond,和default命名空間下的PVC pvc-nfs-storage關聯,此時PVC已經定義好
PV和PVC綁定狀态詳情
[root@node-1 happylau]# cat pvc-nfs-deployments.yaml
apiVersion: apps/v1
kind: Deployment
metadata: #deployment的中繼資料
name: pvc-nfs-deployment
labels:
app: pvc-nfs-deployment
spec: #deployment的屬性資訊
replicas: 1 #副本控制數
selector:
matchLabels:
app: pvc-nfs-deployment
template: #通過定義模闆引用Pod,template中的資訊和Pod定義的資訊一緻,包含metadata,spec資訊
metadata: #定義Pod的labels
labels:
app: pvc-nfs-deployment
spec:
containers:
- name: nginx-web
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- name: nginx-http-80
protocol: TCP
containerPort: 80
volumeMounts: #将PVC存儲挂載到目錄
- name: pvc-nfs-storage
mountPath: /usr/share/nginx/html
volumes: #通過volumes引用persistentVolumeClaim存儲
- name: pvc-nfs-storage
persistentVolumeClaim:
claimName: pvc-nfs-storage
2. 建立Deployments并檢視建立情況和Pod情況
建立Deployments
[root@node-1 happylau]# kubectl apply -f pvc-nfs-deployments.yaml
deployment.apps/pvc-nfs-deployment created
檢視Deployments清單
[root@node-1 happylau]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
pvc-nfs-deployment 1/1 1 1 16s
檢視Deployments中的Pod
[root@node-1 happylau]# kubectl get pods -l app=pvc-nfs-deployment -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pvc-nfs-deployment-7467b9fbfc-xwdpr 1/1 Running 0 106s 10.244.1.29 node-2 <none> <none>
[root@node-1 happylau]# kubectl exec -it pvc-nfs-deployment-7467b9fbfc-xwdpr /bin/bash
root@pvc-nfs-deployment-7467b9fbfc-xwdpr:/# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 50G 4.3G 43G 10% /
tmpfs 64M 0 64M 0% /dev
tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/vda1 50G 4.3G 43G 10% /etc/hosts
shm 64M 0 64M 0% /dev/shm
10.254.100.101:/mnt/data 50G 9.9G 37G 22% /usr/share/nginx/html #挂載成功
tmpfs 920M 12K 920M 1% /run/secrets/kubernetes.io/serviceaccount
tmpfs 920M 0 920M 0% /proc/acpi
tmpfs 920M 0 920M 0% /proc/scsi
tmpfs 920M 0 920M 0% /sys/firmware
寫入站點資料内容
root@pvc-nfs-deployment-7467b9fbfc-xwdpr:~# echo "pvc index by happylau" >/usr/share/nginx/html/index.html
root@pvc-nfs-deployment-7467b9fbfc-xwdpr:~# ls -l /usr/share/nginx/html/
total 4
-rw-r--r-- 1 nobody nogroup 22 Oct 12 02:00 index.html
[root@node-1 ~]# kubectl get pods -l app=pvc-nfs-deployment -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pvc-nfs-deployment-7467b9fbfc-xwdpr 1/1 Running 0 14m 10.244.1.29 node-2 <none> <none>
[root@node-1 ~]# curl http://10.244.1.29
pvc index by happylau