将 PersistentVolume 的访问模式更改为 ReadWriteOncePod
此页面介绍如何更改现有持久卷的访问模式,以使用 ReadWriteOncePod。
开始之前
您需要一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在至少有两个节点(不充当控制平面主机)的集群上运行本教程。如果您还没有集群,可以使用 minikube 创建一个,或者可以使用以下 Kubernetes 游乐场
您的 Kubernetes 服务器必须是 v1.22 版本或更高版本。要检查版本,请输入 kubectl version。
说明
ReadWriteOncePod 访问模式在 Kubernetes v1.29 版本中稳定发布。如果您正在运行 Kubernetes 的旧版本,可能需要启用功能门。请查阅您正在使用的 Kubernetes 版本的文档。说明
ReadWriteOncePod 访问模式仅受 CSI 卷的支持。要使用此卷访问模式,您需要将以下 CSI sidecar 更新到这些版本或更高版本
我应该使用 ReadWriteOncePod 的原因?
在 Kubernetes v1.22 之前,ReadWriteOnce 访问模式通常用于限制持久卷访问,以用于需要对存储进行单写程序访问的工作负载。但是,此访问模式存在一个限制:它将卷访问限制为单个节点,允许同一节点上的多个 Pod 同时从同一卷读取和写入。这对于需要严格的单写程序访问以确保数据安全的应用来说可能存在风险。
如果确保单写程序访问对于您的工作负载至关重要,请考虑将您的卷迁移到 ReadWriteOncePod。
迁移现有的持久卷
如果您有现有的持久卷,可以将其迁移以使用 ReadWriteOncePod。仅支持从 ReadWriteOnce 到 ReadWriteOncePod 的迁移。
在此示例中,已经有一个 ReadWriteOnce "cat-pictures-pvc" 持久卷声明,它绑定到 "cat-pictures-pv" 持久卷,以及一个 "cat-pictures-writer" Deployment,它使用此持久卷声明。
说明
如果您的存储插件支持 动态配置,则 "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
这是一个依赖于该持久卷声明的示例 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 访问模式不能与其他访问模式结合使用。在更新时,请确保 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 以使用持久卷进行存储 的更多信息