將 PersistentVolume 的訪問模式更改為 ReadWriteOncePod

本頁面展示瞭如何將現有 PersistentVolume 的訪問模式更改為使用 ReadWriteOncePod

準備工作

你需要有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。建議在至少有兩個不充當控制平面主機的節點的叢集上執行本教程。如果你還沒有叢集,你可以使用 minikube 建立一個,或者你可以使用這些 Kubernetes 操場之一

你的 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。可以本地檢視清單,或者執行 `kubectl get 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:將 ReadWriteOncePod 提升為 GA (c07ce392e4)