變更 PersistentVolume 的存取模式為 ReadWriteOncePod
本頁說明如何變更現有 PersistentVolume 上的存取模式,以使用 ReadWriteOncePod
。
準備開始
您需要有一個 Kubernetes 叢集,且 kubectl 命令列工具必須設定為與您的叢集通訊。建議在至少有兩個節點且未充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用下列 Kubernetes playground 之一
您的 Kubernetes 伺服器必須是 v1.22 或更新版本。若要檢查版本,請輸入kubectl version
。注意
ReadWriteOncePod
存取模式在 Kubernetes v1.29 發行版本中升級為穩定版。如果您執行的 Kubernetes 版本早於 v1.29,您可能需要啟用功能閘道。請查看您的 Kubernetes 版本的說明文件。注意
ReadWriteOncePod
存取模式僅支援 CSI 磁碟區。若要使用此磁碟區存取模式,您需要將下列 CSI sidecars 更新為這些版本或更高版本
為什麼我應該使用 ReadWriteOncePod
?
在 Kubernetes v1.22 之前,ReadWriteOnce
存取模式通常用於限制 PersistentVolume 存取,適用於需要單一寫入器存取儲存的工作負載。然而,此存取模式有一個限制:它將磁碟區存取限制為單一「節點」,允許同一節點上的多個 Pod 同時從同一磁碟區讀取和寫入。這可能會對需要嚴格單一寫入器存取以確保資料安全的應用程式構成風險。
如果確保單一寫入器存取對您的工作負載至關重要,請考慮將您的磁碟區移轉到 ReadWriteOncePod
。
移轉現有的 PersistentVolumes
如果您有現有的 PersistentVolumes,可以將它們移轉為使用 ReadWriteOncePod
。僅支援從 ReadWriteOnce
到 ReadWriteOncePod
的移轉。
在此範例中,已經有一個 ReadWriteOnce
"cat-pictures-pvc" PersistentVolumeClaim,它繫結到 "cat-pictures-pv" PersistentVolume,以及一個使用此 PersistentVolumeClaim 的 "cat-pictures-writer" Deployment。
注意
如果您的儲存外掛程式支援 動態佈建,系統會為您建立 "cat-picutres-pv",但其名稱可能不同。若要取得 PersistentVolume 的名稱,請執行
kubectl get pvc cat-pictures-pvc -o jsonpath='{.spec.volumeName}'
您可以先檢視 PVC,再進行變更。您可以檢視本機的 manifest,或執行 kubectl get pvc <name-of-pvc> -o yaml
。輸出類似於
# cat-pictures-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: cat-pictures-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
以下是一個依賴該 PersistentVolumeClaim 的 Deployment 範例
# cat-pictures-writer-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: cat-pictures-writer
spec:
replicas: 3
selector:
matchLabels:
app: cat-pictures-writer
template:
metadata:
labels:
app: cat-pictures-writer
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
volumeMounts:
- name: cat-pictures
mountPath: /mnt
volumes:
- name: cat-pictures
persistentVolumeClaim:
claimName: cat-pictures-pvc
readOnly: false
第一步,您需要編輯 PersistentVolume 的 spec.persistentVolumeReclaimPolicy
,並將其設定為 Retain
。這可確保當您刪除對應的 PersistentVolumeClaim 時,您的 PersistentVolume 不會被刪除
kubectl patch pv cat-pictures-pv -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
接下來,您需要停止任何正在使用繫結到您要移轉的 PersistentVolume 的 PersistentVolumeClaim 的工作負載,然後刪除 PersistentVolumeClaim。在移轉完成之前,請避免對 PersistentVolumeClaim 進行任何其他變更,例如磁碟區調整大小。
完成後,您需要清除 PersistentVolume 的 spec.claimRef.uid
,以確保 PersistentVolumeClaims 可以在重新建立時繫結到它
kubectl scale --replicas=0 deployment cat-pictures-writer
kubectl delete pvc cat-pictures-pvc
kubectl patch pv cat-pictures-pv -p '{"spec":{"claimRef":{"uid":""}}}'
之後,將 PersistentVolume 的有效存取模式清單取代為 (僅) ReadWriteOncePod
kubectl patch pv cat-pictures-pv -p '{"spec":{"accessModes":["ReadWriteOncePod"]}}'
注意
ReadWriteOncePod
存取模式無法與其他存取模式組合。更新時,請確保 ReadWriteOncePod
是 PersistentVolume 上唯一的存取模式,否則請求將會失敗。接下來,您需要修改 PersistentVolumeClaim,將 ReadWriteOncePod
設定為唯一的存取模式。您也應該將 PersistentVolumeClaim 的 spec.volumeName
設定為您的 PersistentVolume 名稱,以確保它繫結到這個特定的 PersistentVolume。
完成後,您可以重新建立您的 PersistentVolumeClaim 並啟動您的工作負載
# IMPORTANT: Make sure to edit your PVC in cat-pictures-pvc.yaml before applying. You need to:
# - Set ReadWriteOncePod as the only access mode
# - Set spec.volumeName to "cat-pictures-pv"
kubectl apply -f cat-pictures-pvc.yaml
kubectl apply -f cat-pictures-writer-deployment.yaml
最後,您可以編輯 PersistentVolume 的 spec.persistentVolumeReclaimPolicy
,如果先前已變更,則將其設定回 Delete
。
kubectl patch pv cat-pictures-pv -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'