Usar discos permanentes com vários leitores


Nesta página, explicamos como adicionar um disco permanente ao cluster usando o modo de acesso ReadOnlyMany. Este modo permite que vários pods em diferentes nós montem o disco para leitura.

Para mais informações sobre esse modo, consulte modos de acesso de volume permanente.

Requisitos

Formatar e preencher um disco permanente de origem

Para usar um disco permanente no modo somente leitura, preencha um disco permanente de origem com dados e clone o volume ou use um snapshot dele para movê-los para um novo PersistentVolume ReadOnlyMany.

  1. Crie um PersistentVolume usando um disco permanente atual ou o provisionamento dinâmico.

  2. Formate o disco e preencha-o com dados. Para formatar o disco, referencie-o como um PersistentVolume ReadWriteOnce em um pod. O GKE formata automaticamente o disco subjacente e permite que o pod grave dados no disco. Quando o pod for iniciado, verifique se ele grava os dados que você quer no disco.

Criar um PersistentVolume ReadOnlyMany

É possível criar um PersistentVolume ReadOnlyMany usando um dos métodos a seguir:

  • Um snapshot de volume de um PersistentVolume de origem que você preenche com dados.
  • Um clona de volume de um PersistentVolume de origem que você preenche com dados.
  • Um disco permanente preexistente que já foi preenchido com dados.

Volume do Snapshot

  1. Crie um snapshot de volume da origem do PersistentVolume.

  2. Salve o seguinte manifesto 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
    

    Substitua:

    • PVC_NAMESPACE: o namespace do novo PersistentVolumeClaim.
    • PVC_NAME: o nome do novo PersistentVolumeClaim.
    • SNAPSHOT_NAME:o nome do objeto VolumeSnapshot.
    • STORAGE_SIZE: a quantidade de armazenamento a ser solicitada. Precisa ser igual ao valor solicitado no PersistentVolumeClaim da origem.
  3. Aplique o manifesto ao cluster:

    kubectl apply -f snapshot-pvc.yaml
    

Isso cria um novo PersistentVolumeClaim chamado PVC_NAME no cluster, que o GKE usa para provisionar dinamicamente um novo PersistentVolume que contém os dados do snapshot do disco permanente de origem.

Clonagem de volume

Antes de usar a clonagem de volume, familiarize-se com as limitações dessa abordagem.

  1. Salve o seguinte manifesto como 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
    

    Substitua:

    • PVC_NAMESPACE: o namespace do novo PersistentVolumeClaim.
    • PVC_NAME: o nome do novo PersistentVolumeClaim.
    • SOURCE_PVC: o nome do PersistentVolumeClaim de origem preenchido com dados.
    • STORAGE_CLASS_NAME: a classe de armazenamento do novo PersistentVolumeClaim. Precisa ser o mesmo da classe de armazenamento PersistentVolumeClaim.
    • STORAGE_SIZE: a quantidade de armazenamento do novo PersistentVolumeClaim. Precisa ser o mesmo valor solicitado pela PersistentVolumeClaim de origem.
  2. Aplique o manifesto ao cluster:

    kubectl apply -f cloning-pvc.yaml
    

Isso cria um PersistentVolumeClaim chamado PVC_NAME que o GKE usa para criar um novo PersistentVolume no modo ReadOnlyMany com os dados no PersistentVolume de origem.

Para informações mais detalhadas sobre a clonagem de volume, consulte Criar clones de volumes permanentes.

Disco permanente preexistentes

  1. Salve o seguinte manifesto como 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
    

    Substitua:

    • PV_NAME: o nome do novo PersistentVolume.
    • STORAGE_CLASS_NAME: o nome do novo StorageClass.
    • DISK_SIZE: o tamanho do disco permanente preexistente. Por exemplo, 500G.
    • PVC_NAMESPACE: o namespace do novo PersistentVolumeClaim.
    • PVC_NAME: o nome do novo PersistentVolumeClaim.
    • DISK_ID: o identificador do disco permanente preexistente. O formato é projects/{project_id}/zones/{zone_name}/disks/{disk_name} para discos permanentes zonais ou projects/{project_id}/regions/{region_name}/disks/{disk_name} para discos permanentes regionais.
    • FS_TYPE: o tipo de sistema de arquivos. Você pode deixar como padrão (ext4) ou usar xfs. Se os clusters usarem um pool de nós do Windows Server, altere esse valor para NTFS.
  2. Aplique o manifesto ao cluster:

    kubectl apply -f preexisting-disk-pv-pvc.yaml
    

Isso cria um PersistentVolumeClaim chamado PVC_NAME e um PersistentVolume chamado PV_NAME no modo ReadOnlyMany.

Para ver informações mais detalhadas sobre como usar um disco permanente atual, consulte Disco permanente atual.

Usar o PersistentVolumeClaim em um pod

Agora é possível fazer referência ao novo PersistentVolumeClaim no modo somente leitura em vários pods em vários nós ao mesmo tempo. Não é possível anexar discos permanentes no modo ReadWriteOnce em vários nós ao mesmo tempo. Para mais informações, consulte Implantações vs. StatefulSets.

Na especificação do pod, especifique readOnly: true nas seções volumeMounts e volumes, como no exemplo a seguir:

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

A seguir