Como usar discos permanentes com vários leitores

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

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

Como formatar e preencher o disco permanente

Antes de usar um disco permanente no modo somente leitura, é necessário formatá-lo e preenchê-lo com dados.

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

  2. Formate o disco e preencha-o com dados. Para formatar o disco:

    • Faça referência ao disco como um volume ReadWriteOnce em um pod. Isso leva à formatação automática do disco pelo GKE e permite que o pod preencha previamente o disco com dados. Quando o pod for iniciado, verifique se ele grava dados no disco.
    • Ative o disco manualmente em uma VM e formate-o. Grave os dados no disco que quiser. Para detalhes, consulte formatação do disco permanente.
  3. Desative e remova o disco:

    • Se você referenciou o disco em um pod, exclua-o, espere até que ele seja encerrado e aguarde a remoção automática do nó.
    • Se você montou o disco para uma VM, remova o disco usando gcloud compute instances detach-disk.
  4. Crie pods que acessam o volume como ReadOnlyMany, conforme mostrado na seção a seguir.

Como criar um PersistentVolume e PersistentVolumeClaim

Para ativar um disco pré-preenchido como ReadOnlyMany, crie um PersistentVolume e PersistentVolumeClaim para o disco com os campos accessModes definidos como ReadOnlyMany. Veja abaixo mais configurações, incluindo a configuração de readOnly no PersistentVolume.

Driver CSI

Se o cluster usar o Driver CSI de disco permanente do Compute Engine, defina o campo csi readOnly comotrue.

Veja a seguir um exemplo chamado read-only-pd.yaml:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-readonly-pv
spec:
  storageClassName: ""
  capacity:
    storage: 10Gi
  accessModes:
    - ReadOnlyMany
  claimRef:
    namespace: default
    name: my-readonly-pvc
  csi:
    driver: pd.csi.storage.gke.io
    volumeHandle: projects/PROJECT/zones/ZONE/disks/my-test-disk
    fsType: ext4
    readOnly: true
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-readonly-pvc
spec:
  # Specify "" as the storageClassName so it matches the PersistentVolume's StorageClass.
  # A nil storageClassName value uses the default StorageClass. For details, see
  # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#class-1
  storageClassName: ""
  accessModes:
    - ReadOnlyMany
  resources:
    requests:
      storage: 10Gi

Substitua:

  • PROJECT pelo ID do seu projeto do Google Cloud.
  • ZONE pela zona do disco. Por exemplo, us-central1-c.

Drivers na árvore

Se seu cluster usar o driver de armazenamento do disco permanente do Compute Engine na árvore, defina o campo gcePersistentDisk readOnly definido como true.

Veja a seguir um exemplo chamado read-only-pd.yaml:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-readonly-pv
spec:
  storageClassName: ""
  capacity:
    storage: 10Gi
  accessModes:
    - ReadOnlyMany
  claimRef:
    namespace: default
    name: my-readonly-pvc
  gcePersistentDisk:
    pdName: my-test-disk
    fsType: ext4
    readOnly: true
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-readonly-pvc
spec:
  # Specify "" as the storageClassName so it matches the PersistentVolume's StorageClass.
  # A nil storageClassName value uses the default StorageClass. For details, see
  # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#class-1
  storageClassName: ""
  accessModes:
    - ReadOnlyMany
  resources:
    requests:
      storage: 10Gi

Para criar o PersistentVolume e o PersistentVolumeClaim, use kubectl apply -f read-only-pd.yaml.

Como usar o PersistentVolumeClaim em um pod

Ao usar esse PersistentVolumeClaim nas cargas de trabalho, você precisa especificar readOnly: true nas seções volumeMounts e volumes da sua especificação de pod, conforme mostrado no exemplo a seguir:

apiVersion: v1
kind: Pod
metadata:
  name: pod-pvc
spec:
  containers:
  - image: k8s.gcr.io/busybox
    name: busybox
    command:
      - "sleep"
      - "3600"
    volumeMounts:
    - mountPath: /test-mnt
      name: my-volume
      readOnly: true
  volumes:
  - name: my-volume
    persistentVolumeClaim:
      claimName: my-readonly-pvc
      readOnly: true

Agora, você pode ter vários pods em nós diferentes, todos conseguindo ativar esse PersistentVolumeClaim no modo somente leitura. Contudo, não é possível anexar discos permanentes no modo de gravação em vários nós ao mesmo tempo. Para mais informações, consulte Implantações vs. StatefulSets.

A seguir