将 PersistentVolume 的访问模式更改为 ReadWriteOncePod
本页展示如何更改现有 PersistentVolume 的访问模式,以使用 ReadWriteOncePod
。
开始之前
您需要有一个 Kubernetes 集群,并且必须配置 kubectl 命令行工具以与您的集群通信。建议在至少有两个不充当控制平面主机的节点的集群上运行本教程。如果您还没有集群,可以使用 minikube 创建一个,或者您可以使用以下 Kubernetes 游乐场之一
您的 Kubernetes 服务器必须是 v1.22 或更高版本。要检查版本,请输入kubectl version
。注意
ReadWriteOncePod
访问模式在 Kubernetes v1.29 版本中升级为稳定版。如果您运行的 Kubernetes 版本早于 v1.29,则可能需要启用特性门控。请查阅您的 Kubernetes 版本文档。注意
ReadWriteOncePod
访问模式仅支持 CSI 卷。要使用此卷访问模式,您需要将以下 CSI sidecar 更新到以下版本或更高版本
我为什么要使用 ReadWriteOncePod
?
在 Kubernetes v1.22 之前,ReadWriteOnce
访问模式通常用于限制需要对存储进行单写访问的工作负载的 PersistentVolume 访问。然而,这种访问模式有一个限制:它将卷访问限制为单个节点,允许同一节点上的多个 Pod 同时从同一卷读取和写入。这可能会给需要严格单写访问以确保数据安全的应用程序带来风险。
如果确保单写访问对您的工作负载至关重要,请考虑将您的卷迁移到 ReadWriteOncePod
。
迁移现有 PersistentVolume
如果您有现有的 PersistentVolume,可以将它们迁移为使用 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。可以在本地查看清单,或者运行 kubectl get pvc <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
,以确保 PersistentVolumeClaim 可以在重新创建时绑定到它
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 进行存储的更多信息