将永久性磁盘与多个读取方配合使用


本页面介绍了如何通过 ReadOnlyMany 访问模式将永久性磁盘添加到集群。此模式允许不同节点上的多个 Pod 装载该磁盘以供读取。

如需详细了解此模式,请参阅永久性卷访问模式

要求

格式化和填充来源永久性磁盘

如需在只读模式下使用永久性磁盘,您必须使用数据填充源永久性磁盘,然后克隆卷或使用卷快照将数据移动到新的 ReadOnlyMany PersistentVolume 中。

  1. 使用现有永久性磁盘或使用动态预配创建 PersistentVolume。

  2. 格式化该磁盘并为其填充数据。如需格式化该磁盘,请在 Pod 中将该磁盘作为 ReadWriteOnce PersistentVolume 引用。GKE 会自动格式化底层磁盘,并让 Pod 向该磁盘写入数据。Pod 启动时,请确保 Pod 将所需的数据写入磁盘。

创建一个 ReadOnlyMany PersistentVolume

您可以使用以下方法之一创建一个 ReadOnlyMany PersistentVolume:

  • 您填充数据的源 PersistentVolume 的卷快照。
  • 填充数据的 PersistentVolume 的卷克隆
  • 已经填充了数据的预先存在的永久性磁盘。

卷快照

  1. 创建源 PersistentVolume 的卷快照

  2. 将以下 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 中请求的数量相同。
  3. 将清单应用到您的集群:

    kubectl apply -f snapshot-pvc.yaml
    

这将在您的集群中创建一个名为 PVC_NAME 的新 PersistentVolumeClaim,GKE 会使用它动态预配包含来源永久性磁盘快照中的数据的新 PersistentVolume。

卷克隆

在使用卷克隆之前,请务必熟悉此方法的限制

  1. 将以下清单保存为 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 请求的数量相同。
  2. 将清单应用到您的集群:

    kubectl apply -f cloning-pvc.yaml
    

这将创建一个名为 PVC_NAME 的 PersistentVolumeClaim,GKE 使用它以 ReadOnlyMany 模式创建新的 PersistentVolume,其中包含源 PersistentVolume 中的数据。

如需详细了解卷克隆,请参阅创建永久性卷的克隆

预先存在的永久性磁盘

  1. 将以下清单保存为 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
  2. 将清单应用到您的集群:

    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

后续步骤