将 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 进行存储的更多信息