将持久卷的访问模式更改为 ReadWriteOncePod
此页面展示了如何更改现有持久卷的访问模式以使用 ReadWriteOncePod
。
在您开始之前
您需要有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在至少有两个节点(不充当控制平面主机)的集群上运行本教程。如果您还没有集群,可以使用 minikube 创建一个,或者可以使用以下 Kubernetes 游乐场之一
您的 Kubernetes 服务器版本必须为 v1.22 或更高版本。要检查版本,请输入kubectl version
。注意
ReadWriteOncePod
访问模式在 Kubernetes v1.29 版本中晋升为稳定版本。如果您运行的 Kubernetes 版本早于 v1.29,则可能需要启用功能网关。查看 Kubernetes 版本的文档。为什么我应该使用 ReadWriteOncePod
?
在 Kubernetes v1.22 之前,ReadWriteOnce
访问模式通常用于限制需要对存储进行单一写入访问的工作负载的持久卷访问。但是,此访问模式有一个限制:它将卷访问限制为单个节点,允许同一节点上的多个 Pod 同时从同一卷读取和写入。对于需要严格的单一写入访问以确保数据安全性的应用程序,这可能会构成风险。
如果确保单一写入访问对您的工作负载至关重要,请考虑将您的卷迁移到 ReadWriteOncePod
。
迁移现有持久卷
如果您有现有的持久卷,则可以将它们迁移以使用 ReadWriteOncePod
。仅支持从 ReadWriteOnce
到 ReadWriteOncePod
的迁移。
在此示例中,已经存在一个 ReadWriteOnce
"cat-pictures-pvc" 持久卷声明,它绑定到 "cat-pictures-pv" 持久卷,以及一个使用此持久卷声明的 "cat-pictures-writer" 部署。
注意
如果您的存储插件支持 动态配置,则将为您创建 "cat-picutres-pv",但其名称可能有所不同。要获取您的持久卷的名称,请运行
kubectl get pvc cat-pictures-pvc -o jsonpath='{.spec.volumeName}'
您可以在进行更改之前查看 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
以下是一个依赖于该持久卷声明的部署示例
# 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
访问模式不能与其他访问模式结合使用。在更新时确保 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"}}'
下一步
- 详细了解 持久卷。
- 详细了解 持久卷声明。
- 详细了解 配置 Pod 以使用持久卷进行存储