簡介
此文講解如何使用PersistentVolumeClaim
配置Pod存儲,步驟如下:
- 作為群集管理員,創建一個由物理存儲支持的PersistentVolume。沒有將卷與任何Pod相關聯。
- 以開發人員/集群用戶的身份創建一個PersistentVolumeClaim,它自動綁定到合適的PersistentVolume
- 創建一個使用上述PersistentVolumeClaim進行存儲的Pod。
備注:此文檔參考官方文檔,並加以自己的理解。如有誤導性的內容,請批評指正。
開始前的准備工作
選擇集群中的一個node節點,進入shell,創建/mnt/data
目錄
# mkdir /mnt/data
進入/mnt/data
目錄,創建一個index.html
的文件
# sudo sh -c "echo 'Hello from Kubernetes storage' > /mnt/data/index.html"
查看文件是否是否創建成功
cat /mnt/data/index.html
輸出內容如下
Hello from Kubernetes storage
創建PersistentVolume
創建一個hostPath
類型的創建PersistentVolume
。Kubernetes支持在集群一個node節點上使用hostPath
開發和測試。hostPath
類型的PersistentVolume
使用node節點上的文件或目錄來模擬網絡附加存儲。
在生產環境中,不要使用hostPath
。集群管理員可以用Google Compute Engine persistent disk
、NFS
、Amazon Elastic Block Store volume
提供的網絡存儲來代替。集群管理員可以可使用StorageClasses
設置dynamic provisioning
。
創建hostPath
類型的PersistentVolume
對象,文件問:pv-volume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
配置文件定義的volumes
是集群node節點上的/mnt/data
。配置中指定了存儲大小為10 gibibytes
、ReadWriteOnce
模式,也就意味着在被掛載的單一節點上可讀可寫。配置中定義的StorageClass name
為manual
,綁定PersistentVolumeClaim
請求到PersistentVolume
。
# kubectl apply -f /root/k8s-example/volume/pv-volume.yaml
查看PersistentVolume
資源詳情
# kubectl get pv task-pv-volume -o wide
結果顯示PersistentVolume
的STATUS
為Available
。說明該PersistentVolume
還沒有綁定PersistentVolumeClaim
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
task-pv-volume 10Gi RWO Retain Available manual 9s Filesystem
創建PersistentVolumeClaim
接下來創建PersistentVolumeClaim
。Pod使用PersistentVolumeClaim
請求物理存儲。
創建一個PersistentVolumeClaim
,該請求的卷至少為3 gibibytes
,可以為至少一個節點提供讀寫訪問權限。文件名:pv-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: task-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
# kubectl apply -f /root/k8s-example/volume/pv-claim.yaml
查看PersistentVolume
的資源詳情,
# kubectl get pv task-pv-volume
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
task-pv-volume 10Gi RWO Retain Bound default/task-pv-claim manual 28m
查看PersistentVolumeClaim
資源狀態
# kubectl get pvc task-pv-claim
輸出結果顯示PersistentVolumeClaim
已綁定PersistentVolume
即task-pv-volume
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
task-pv-claim Bound task-pv-volume 10Gi RWO manual
創建Pod
創建Pod,使用PersistentVolumeClaim
作為volume
。文件名:pv-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: task-pv-pod
spec:
volumes:
- name: task-pv-storage
persistentVolumeClaim:
claimName: task-pv-claim
containers:
- name: task-pv-container
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: task-pv-storage
# kubectl apply -f /root/k8s-example/volume/pv-pod.yaml
# kubectl get pod task-pv-pod
NAME READY STATUS RESTARTS AGE
task-pv-pod 1/1 Running 0 14s
進入task-pv-pod
的shell中
kubectl exec -it task-pv-pod -- /bin/bash
在shell中,驗證nginx是否正在從hostPath
卷提供index.html
文件
apt update
apt install curl
curl http://localhost/
輸出結果如下:
Hello from Kubernetes storage
如果看到該消息,則說明您已成功將Pod配置為使用來自PersistentVolumeClaim的存儲。
清理資源
kubectl delete pod task-pv-pod
kubectl delete pvc task-pv-claim
kubectl delete pv task-pv-volume
在創建/mnt/data
目錄的node節點上,刪除目錄
sudo rm /mnt/data/index.html
sudo rmdir /mnt/data