将 PersistentVolume 的访问模式更改为 ReadWriteOncePod

此页面介绍如何更改现有持久卷的访问模式,以使用 ReadWriteOncePod

开始之前

您需要一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在至少有两个节点(不充当控制平面主机)的集群上运行本教程。如果您还没有集群,可以使用 minikube 创建一个,或者可以使用以下 Kubernetes 游乐场

您的 Kubernetes 服务器必须是 v1.22 版本或更高版本。

要检查版本,请输入 kubectl version

我应该使用 ReadWriteOncePod 的原因?

在 Kubernetes v1.22 之前,ReadWriteOnce 访问模式通常用于限制持久卷访问,以用于需要对存储进行单写程序访问的工作负载。但是,此访问模式存在一个限制:它将卷访问限制为单个节点,允许同一节点上的多个 Pod 同时从同一卷读取和写入。这对于需要严格的单写程序访问以确保数据安全的应用来说可能存在风险。

如果确保单写程序访问对于您的工作负载至关重要,请考虑将您的卷迁移到 ReadWriteOncePod

迁移现有的持久卷

如果您有现有的持久卷,可以将其迁移以使用 ReadWriteOncePod。仅支持从 ReadWriteOnceReadWriteOncePod 的迁移。

在此示例中,已经有一个 ReadWriteOnce "cat-pictures-pvc" 持久卷声明,它绑定到 "cat-pictures-pv" 持久卷,以及一个 "cat-pictures-writer" Deployment,它使用此持久卷声明。

并且您可以在进行更改之前查看 PVC。您可以本地查看清单,或者运行 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

这是一个依赖于该持久卷声明的示例 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

首先,您需要编辑您的持久卷的 spec.persistentVolumeReclaimPolicy 并将其设置为 Retain。这可确保在删除相应的持久卷声明时,您的持久卷不会被删除

kubectl patch pv cat-pictures-pv -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'

接下来,您需要停止任何使用绑定到要迁移的持久卷的持久卷声明的工作负载,然后删除持久卷声明。在迁移完成之前,请避免对持久卷声明进行任何其他更改,例如卷调整大小。

完成此操作后,您需要清除持久卷的 spec.claimRef.uid,以确保持久卷声明可以在重新创建时绑定到它

kubectl scale --replicas=0 deployment cat-pictures-writer
kubectl delete pvc cat-pictures-pvc
kubectl patch pv cat-pictures-pv -p '{"spec":{"claimRef":{"uid":""}}}'

之后,将持久卷的有效访问模式列表替换为 (仅) ReadWriteOncePod

kubectl patch pv cat-pictures-pv -p '{"spec":{"accessModes":["ReadWriteOncePod"]}}'

接下来,您需要修改您的持久卷声明,将 ReadWriteOncePod 设置为唯一的访问模式。您还应将持久卷声明的 spec.volumeName 设置为持久卷的名称,以确保它绑定到此特定的持久卷。

完成此操作后,您可以重新创建持久卷声明并启动您的工作负载

# 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

最后,您可以编辑持久卷的 spec.persistentVolumeReclaimPolicy 并将其设置回 Delete(如果您之前已更改它)。

kubectl patch pv cat-pictures-pv -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'

接下来

上次修改时间:2023 年 10 月 10 日上午 7:55 PST:将 ReadWriteOncePod 提升到 GA (c07ce392e4)