變更 PersistentVolume 的存取模式為 ReadWriteOncePod

本頁說明如何變更現有 PersistentVolume 上的存取模式,以使用 ReadWriteOncePod

準備開始

您需要有一個 Kubernetes 叢集,且 kubectl 命令列工具必須設定為與您的叢集通訊。建議在至少有兩個節點且未充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用下列 Kubernetes playground 之一

您的 Kubernetes 伺服器必須是 v1.22 或更新版本。若要檢查版本,請輸入 kubectl version

為什麼我應該使用 ReadWriteOncePod

在 Kubernetes v1.22 之前,ReadWriteOnce 存取模式通常用於限制 PersistentVolume 存取,適用於需要單一寫入器存取儲存的工作負載。然而,此存取模式有一個限制:它將磁碟區存取限制為單一「節點」,允許同一節點上的多個 Pod 同時從同一磁碟區讀取和寫入。這可能會對需要嚴格單一寫入器存取以確保資料安全的應用程式構成風險。

如果確保單一寫入器存取對您的工作負載至關重要,請考慮將您的磁碟區移轉到 ReadWriteOncePod

移轉現有的 PersistentVolumes

如果您有現有的 PersistentVolumes,可以將它們移轉為使用 ReadWriteOncePod。僅支援從 ReadWriteOnceReadWriteOncePod 的移轉。

在此範例中,已經有一個 ReadWriteOnce "cat-pictures-pvc" PersistentVolumeClaim,它繫結到 "cat-pictures-pv" PersistentVolume,以及一個使用此 PersistentVolumeClaim 的 "cat-pictures-writer" Deployment。

您可以先檢視 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"]}}'

接下來,您需要修改 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"}}'

下一步

上次修改於 2023年10月10日 早上 7:55 PST:將 ReadWriteOncePod 升級至 GA (c07ce392e4)