Ativar buckets do Cloud Storage como volumes persistentes


Este guia mostra como usar volumes persistentes do Kubernetes com suporte dos buckets do Cloud Storage para gerenciar recursos de armazenamento dos pods do Kubernetes no Google Kubernetes Engine (GKE). Use essa opção de armazenamento se você já conhece os PersistentVolumes e quer consistência com as implantações atuais que dependem desse tipo de recurso.

Este guia é destinado a administradores de plataformas e usuários operadores que querem simplificar o gerenciamento de armazenamento dos aplicativos do GKE.

Antes de ler esta página, confira se você conhece os volumes persistentes do Kubernetes, os pods do Kubernetes e os buckets do Cloud Storage.

Se você quiser uma interface simplificada baseada em pods que não exija experiência anterior com volumes persistentes do Kubernetes, consulte Montar buckets do Cloud Storage como volumes temporários do CSI.

Antes de começar

Verifique se você concluiu estes pré-requisitos:

Como os volumes persistentes para buckets do Cloud Storage funcionam

Com o provisionamento estático, você cria um ou mais objetos PersistentVolume contendo os detalhes do sistema de armazenamento subjacente. Os pods nos clusters podem consumir o armazenamento por meio de PersistentVolumeClaims.

O uso de um volume persistente com suporte de um bucket do Cloud Storage envolve estas operações:

  1. Definição de armazenamento: você define um PersistentVolume no cluster do GKE, incluindo o driver CSI a ser usado e todos os parâmetros necessários. Para o driver CSI do FUSE do Cloud Storage, especifique o nome do bucket e outros detalhes relevantes.

    Se quiser, ajuste o desempenho do driver CSI usando o recurso de armazenamento em cache de arquivos. O armazenamento em cache de arquivos pode melhorar o desempenho do app do GKE armazenando em cache os arquivos do Cloud Storage acessados com frequência em um disco local mais rápido.

    Além disso, é possível usar o recurso de download paralelo para acelerar a leitura de arquivos grandes do Cloud Storage para downloads multithread. Esse recurso pode ser usado para melhorar os tempos de carregamento de modelos, principalmente para leituras com mais de 1 GB.

  2. Invocação de driver: quando um PersistentVolumeClaim solicita armazenamento que corresponde à especificação do PersistentVolume, o GKE invoca o driver CSI do Cloud Storage FUSE.

  3. Montagem de bucket: o driver CSI monta o bucket no nó em que o pod solicitante é programado. Isso torna o conteúdo do bucket acessível ao pod como um diretório no sistema de arquivos local do pod. Para ajustar como os buckets são montados no sistema de arquivos, use as opções de montagem. Também é possível usar atributos de volume para configurar o comportamento específico do driver CSI do Cloud Storage FUSE.

  4. Reacoplamento: se o pod for reiniciado ou reprogramado para outro nó, o driver CSI vai remontar o mesmo bucket ao novo nó, garantindo a acessibilidade dos dados.

Criar um PersistentVolume

  1. Crie um manifesto do PersistentVolume com a seguinte especificação:

    Pod

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: gcs-fuse-csi-pv
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 5Gi
      storageClassName: example-storage-class  
      mountOptions:
        - implicit-dirs
      csi:
        driver: gcsfuse.csi.storage.gke.io
        volumeHandle: BUCKET_NAME
      claimRef:
        name: gcs-fuse-csi-static-pvc
        namespace: NAMESPACE  
    

    Substitua os seguintes valores:

    • NAMESPACE: o namespace do Kubernetes em que você quer implantar o pod.
    • BUCKET_NAME: o nome do bucket do Cloud Storage especificado ao configurar o acesso aos buckets do Cloud Storage. É possível especificar um sublinhado (_) para ativar todos os buckets que a conta de serviço do Kubernetes pode acessar. Para saber mais, consulte Ativação dinâmica na documentação do FUSE do Cloud Storage.

    O exemplo de manifesto mostra estas configurações obrigatórias:

    • spec.csi.driver: use gcsfuse.csi.storage.gke.io como o nome do driver CSI.

    Também é possível ajustar estas variáveis:

    • spec.mountOptions: transmita opções de montagem para o Cloud Storage FUSE. Especifique as flags em uma string separada por vírgulas, sem espaços.
    • spec.csi.volumeAttributes: transmita outros atributos de volume para o Cloud Storage FUSE.

    Pod (armazenamento em cache de arquivos)

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: gcs-fuse-csi-pv
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 5Gi
      storageClassName: example-storage-class 
      mountOptions:
        - implicit-dirs
        - file-cache:max-size-mb:-1
      csi:
        driver: gcsfuse.csi.storage.gke.io
        volumeHandle: BUCKET_NAME
      claimRef:
        name: gcs-fuse-csi-static-pvc
        namespace: NAMESPACE 
    

    Substitua os seguintes valores:

    • NAMESPACE: o namespace do Kubernetes em que você quer implantar o pod.
    • BUCKET_NAME: o nome do bucket do Cloud Storage especificado ao configurar o acesso aos buckets do Cloud Storage. É possível especificar um sublinhado (_) para ativar todos os buckets que a conta de serviço do Kubernetes pode acessar. Para saber mais, consulte Ativação dinâmica na documentação do FUSE do Cloud Storage.

    Pod (download paralelo)

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: gcs-fuse-csi-pv
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 5Gi
      storageClassName: example-storage-class 
      mountOptions:
        - implicit-dirs
        - file-cache:enable-parallel-downloads:true
        - file-cache:max-size-mb:-1
      csi:
        driver: gcsfuse.csi.storage.gke.io
        volumeHandle: BUCKET_NAME
      claimRef:
        name: gcs-fuse-csi-static-pvc
        namespace: NAMESPACE 
    

    Substitua os seguintes valores:

    • NAMESPACE: o namespace do Kubernetes em que você quer implantar o pod.
    • BUCKET_NAME: o nome do bucket do Cloud Storage especificado ao configurar o acesso aos buckets do Cloud Storage. É possível especificar um sublinhado (_) para ativar todos os buckets que a conta de serviço do Kubernetes pode acessar. Para saber mais, consulte Ativação dinâmica na documentação do FUSE do Cloud Storage.
  2. Aplique o manifesto ao cluster:

    kubectl apply -f PV_FILE_PATH
    

    Substitua PV_FILE_PATH pelo caminho para o arquivo YAML.

Criar um PersistentVolumeClaim

  1. Crie um manifesto PersistentVolumeClaim com a seguinte especificação:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: gcs-fuse-csi-static-pvc
      namespace: NAMESPACE
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
      storageClassName: example-storage-class
    

    Substitua NAMESPACE pelo namespace do Kubernetes em que você quer implantar o pod.

    Para vincular o PersistentVolume a um PersistentVolumeClaim, verifique estas configurações:

    • Os campos spec.storageClassName nos manifestos PersistentVolume e PersistentVolumeClaim precisam ser correspondentes. O storageClassName não precisa se referir a um objeto StorageClass existente. Para vincular a declaração a um volume, use o nome que quiser, mas ele não pode ficar em branco.
    • Os campos spec.accessModes nos manifestos PersistentVolume e PersistentVolumeClaim precisam ser correspondentes.
    • O campo spec.capacity.storage no manifesto do PersistentVolume precisa corresponder ao spec.resources.requests.storage no manifesto do PersistentVolumeClaim. Como os buckets do Cloud Storage não têm limites de tamanho, é possível colocar qualquer número para a capacidade, mas ele não pode ficar vazio.
  2. Aplique o manifesto ao cluster:

    kubectl apply -f PVC_FILE_PATH
    

    Substitua PVC_FILE_PATH pelo caminho para o arquivo YAML.

Consumir o volume em um pod

  1. Crie um manifesto de pod com a seguinte especificação:

    apiVersion: v1
    kind: Pod
    metadata:
      name: gcs-fuse-csi-example-static-pvc  
      namespace: NAMESPACE
      annotations:
        gke-gcsfuse/volumes: "true"
        gke-gcsfuse/ephemeral-storage-limit: "50Gi" 
    spec:
      containers:
      - image: busybox
        name: busybox
        command: ["sleep"]
        args: ["infinity"]  
        volumeMounts:
        - name: gcs-fuse-csi-static
          mountPath: /data
          readOnly: true
      serviceAccountName: KSA_NAME
      volumes:
      - name: gcs-fuse-csi-static
        persistentVolumeClaim:
          claimName: gcs-fuse-csi-static-pvc
          readOnly: true  
    

    Substitua os seguintes valores:

    O exemplo de manifesto mostra estas configurações obrigatórias:

    Também é possível ajustar estas variáveis:

    • spec.containers[n].volumeMonts[n].readOnly: especifique "true" se somente as montagens de volume específicas forem somente leitura.
    • spec.volumes[n].persistentVolumeClaim.readOnly: especifique "true" se todas as montagens de volume forem somente leitura.
  2. Aplique o manifesto ao cluster:

    kubectl apply -f POD_FILE_PATH
    

    Substitua POD_FILE_PATH pelo caminho para o arquivo YAML.

Resolver problemas

Se você precisar resolver problemas do Cloud Storage FUSE, defina a flag log-severity como TRACE. Defina a flag na seção args da especificação do contêiner do driver no YAML de implantação. Isso faz com que o atributo de volume gcsfuseLoggingSeverity seja definido automaticamente como trace.

Para mais dicas de solução de problemas, consulte o Guia de solução de problemas na documentação do projeto do GitHub.

A seguir