將 PersistentVolume 的訪問模式更改為 ReadWriteOncePod
本頁面展示瞭如何將現有 PersistentVolume 的訪問模式更改為使用 ReadWriteOncePod
。
準備工作
你需要有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。建議在至少有兩個不充當控制平面主機的節點的叢集上執行本教程。如果你還沒有叢集,你可以使用 minikube 建立一個,或者你可以使用這些 Kubernetes 操場之一
你的 Kubernetes 伺服器版本必須是 v1.22 或更高。要檢查版本,請輸入 kubectl version
。
注意
ReadWriteOncePod
訪問模式在 Kubernetes v1.29 版本中已提升為穩定版。如果你執行的 Kubernetes 版本低於 v1.29,你可能需要啟用一個特性門控。請查閱你的 Kubernetes 版本的文件。為什麼我應該使用 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-pictures-pv",但其名稱可能有所不同。要獲取你的 PersistentVolume 的名稱,請執行
kubectl get pvc cat-pictures-pvc -o jsonpath='{.spec.volumeName}'
你可以在進行更改之前檢視 PVC。可以本地檢視清單,或者執行 `kubectl get pvc
# 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"}}'
下一步
- 瞭解更多關於 PersistentVolumes 的資訊。
- 瞭解更多關於 PersistentVolumeClaims 的資訊。
- 瞭解更多關於配置 Pod 使用 PersistentVolume 進行儲存的資訊