本页面介绍了如何通过 ReadOnlyMany 访问模式将永久性磁盘添加到集群。此模式允许不同节点上的多个 Pod 装载该磁盘以供读取。
如需详细了解此模式,请参阅永久性卷访问模式。
要求
- 您的集群必须运行 GKE 1.22 版或更高版本。
- 您的集群必须使用 Compute Engine 永久性磁盘 CSI 驱动程序。
格式化和填充来源永久性磁盘
如需在只读模式下使用永久性磁盘,您必须使用数据填充源永久性磁盘,然后克隆卷或使用卷快照将数据移动到新的 ReadOnlyMany PersistentVolume 中。
格式化该磁盘并为其填充数据。如需格式化该磁盘,请在 Pod 中将该磁盘作为 ReadWriteOnce PersistentVolume 引用。GKE 会自动格式化底层磁盘,并让 Pod 向该磁盘写入数据。Pod 启动时,请确保 Pod 将所需的数据写入磁盘。
创建一个 ReadOnlyMany
PersistentVolume
您可以使用以下方法之一创建一个 ReadOnlyMany
PersistentVolume:
- 您填充数据的源 PersistentVolume 的卷快照。
- 填充数据的 PersistentVolume 的卷克隆。
已经填充了数据的预先存在的永久性磁盘。
卷快照
将以下 PersistentVolumeClaim 清单保存为
snapshot-pvc.yaml
:kind: PersistentVolumeClaim apiVersion: v1 metadata: namespace: PVC_NAMESPACE name: PVC_NAME spec: dataSource: apiGroup: snapshot.storage.k8s.io kind: VolumeSnapshot name: SNAPSHOT_NAME accessModes: - ReadOnlyMany storageClassName: premium-rwo resources: requests: storage: STORAGE_SIZE
替换以下内容:
PVC_NAMESPACE
:新 PersistentVolumeClaim 的命名空间。PVC_NAME
:新 PersistentVolumeClaim 的名称。SNAPSHOT_NAME
:您的VolumeSnapshot
对象的名称。STORAGE_SIZE
:要请求的存储空间量。此值必须与来源 PersistentVolumeClaim 中请求的数量相同。
将清单应用到您的集群:
kubectl apply -f snapshot-pvc.yaml
这将在您的集群中创建一个名为 PVC_NAME
的新 PersistentVolumeClaim,GKE 会使用它动态预配包含来源永久性磁盘快照中的数据的新 PersistentVolume。
卷克隆
在使用卷克隆之前,请务必熟悉此方法的限制。
将以下清单保存为
cloning-pvc.yaml
:kind: PersistentVolumeClaim apiVersion: v1 metadata: namespace: PVC_NAMESPACE name: PVC_NAME spec: dataSource: name: SOURCE_PVC kind: PersistentVolumeClaim accessModes: - ReadOnlyMany storageClassName: STORAGE_CLASS_NAME resources: requests: storage: STORAGE_SIZE
替换以下内容:
PVC_NAMESPACE
:新 PersistentVolumeClaim 的命名空间。PVC_NAME
:新 PersistentVolumeClaim 的名称。SOURCE_PVC
:填充了数据的源 PersistentVolumeClaim 的名称。STORAGE_CLASS_NAME
:新 PersistentVolumeClaim 的存储类别。此项必须与来源 PersistentVolumeClaim 的存储类别相同。STORAGE_SIZE
:新的 PersistentVolumeClaim 的存储空间量。此值必须与来源 PersistentVolumeClaim 请求的数量相同。
将清单应用到您的集群:
kubectl apply -f cloning-pvc.yaml
这将创建一个名为 PVC_NAME
的 PersistentVolumeClaim,GKE 使用它以 ReadOnlyMany 模式创建新的 PersistentVolume,其中包含源 PersistentVolume 中的数据。
如需详细了解卷克隆,请参阅创建永久性卷的克隆。
预先存在的永久性磁盘
将以下清单保存为
preexisting-disk-pv-pvc.yaml
:apiVersion: v1 kind: PersistentVolume metadata: name: PV_NAME spec: storageClassName: "STORAGE_CLASS_NAME" capacity: storage: DISK_SIZE accessModes: - ReadOnlyMany claimRef: namespace: PVC_NAMESPACE name: PVC_NAME csi: driver: pd.csi.storage.gke.io volumeHandle: DISK_ID fsType: FS_TYPE readOnly: true --- apiVersion: v1 kind: PersistentVolumeClaim metadata: namespace: PVC_NAMESPACE name: PVC_NAME spec: storageClassName: "STORAGE_CLASS_NAME" volumeName: PV_NAME accessModes: - ReadOnlyMany resources: requests: storage: DISK_SIZE
替换以下内容:
PV_NAME
:新 PersistentVolume 的名称。STORAGE_CLASS_NAME
:新 StorageClass 的名称。DISK_SIZE
:您的原有永久性磁盘的大小。例如500G
。PVC_NAMESPACE
:新 PersistentVolumeClaim 的命名空间。PVC_NAME
:新 PersistentVolumeClaim 的名称。DISK_ID
:现有永久性磁盘的标识符。格式为projects/{project_id}/zones/{zone_name}/disks/{disk_name}
(对于区域永久性磁盘),或projects/{project_id}/regions/{region_name}/disks/{disk_name}
(对于区域永久性磁盘)。FS_TYPE
:文件系统类型。您可以保留默认值 (ext4
),或使用xfs
。如果您的集群使用 Windows Server 节点池,则必须将其更改为NTFS
。
将清单应用到您的集群:
kubectl apply -f preexisting-disk-pv-pvc.yaml
这将创建一个名为 PVC_NAME
的 PersistentVolumeClaim 以及一个处于 ReadOnlyMany 模式、名为 PV_NAME
的 PersistentVolume。
如需详细了解如何使用预先存在的永久性磁盘,请参阅现有永久性磁盘。
在 Pod 中使用 PersistentVolumeClaim
现在,您可以同时在多个节点的多个 Pod 中以只读模式引用新的 PersistentVolumeClaim。您不能将 ReadWriteOnce 模式的永久性磁盘同时附加到多个节点。如需了解详情,请参阅 Deployment 与 StatefulSet。
在 Pod 规范中,您必须在 volumeMounts
部分和 volumes
部分中指定 readOnly: true
,如以下示例所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: multi-read
labels:
app: web-server
spec:
replicas: 3
selector:
matchLabels:
app: web-server
template:
metadata:
labels:
app: web-server
spec:
containers:
- name: web-server
image: nginx
volumeMounts:
- mountPath: /test-mnt
name: my-volume
readOnly: true
volumes:
- name: my-volume
persistentVolumeClaim:
claimName: PVC_NAME
readOnly: true
后续步骤
- 详细了解如何将预先存在的永久性磁盘用作 PersistentVolume。
- 详细了解 Compute Engine 永久性磁盘。