Monte contentores do Cloud Storage como volumes efémeros da CSI

Este guia mostra como usar volumes efémeros da CSI suportados pelos seus contentores do Cloud Storage para gerir automaticamente os recursos de armazenamento dos seus pods ou tarefas do Kubernetes no Google Kubernetes Engine (GKE). Os volumes efémeros da CSI estão associados ao ciclo de vida do pod ou da tarefa, e não precisa de processar manualmente objetos PersistentVolume e PersistentVolumeClaim.

Este guia destina-se a administradores e operadores da plataforma que querem simplificar a gestão do armazenamento para as respetivas aplicações do GKE.

Antes de ler esta página, certifique-se de que conhece os volumes efémeros da CSI, os pods e os trabalhos do Kubernetes, e os contentores do Cloud Storage.

Se já conhece os PersistentVolumes e quer consistência com as suas implementações existentes que dependem deste tipo de recurso, consulte o artigo Monte contentores do Cloud Storage como volumes persistentes.

Antes de começar

Certifique-se de que concluiu estes pré-requisitos:

Como funciona o armazenamento efémero da CSI para contentores do Cloud Storage

Os volumes efémeros da CSI simplificam a gestão do armazenamento para as suas aplicações no GKE. Define os volumes efémeros da CSI diretamente na especificação do Pod ou do Job. A utilização de volumes efémeros da CSI elimina a necessidade de objetos PersistentVolume e PersistentVolumeClaim separados.

A utilização de um volume efémero da CSI envolve as seguintes operações:

  1. Definição de armazenamento: especifica o armazenamento no ficheiro YAML do seu Pod ou trabalho, incluindo o controlador CSI a usar e todos os parâmetros necessários. Para o controlador CSI do FUSE do Cloud Storage, especifica o nome do contentor e outros detalhes relevantes.

    Opcionalmente, pode otimizar o desempenho do controlador CSI através da funcionalidade de colocação em cache de ficheiros. A colocação em cache de ficheiros pode melhorar o desempenho da app GKE ao colocar em cache os ficheiros do Cloud Storage acedidos com frequência num disco mais rápido.

    Além disso, pode usar a funcionalidade de transferência paralela para acelerar a leitura de ficheiros grandes do Cloud Storage para transferências com várias linhas de execução. Pode usar esta funcionalidade para melhorar os tempos de carregamento do modelo, especialmente para leituras com mais de 1 GB.

  2. Invocações de controladores: quando cria o pod ou a tarefa, o GKE deteta o pedido de volume efémero e chama o controlador CSI do FUSE do Cloud Storage.

  3. Montagem e anexo de volume: o controlador CSI monta o volume efémero CSI (que aponta para o contentor do Cloud Storage subjacente) e disponibiliza-o ao Pod ou ao trabalho, tornando-o acessível à sua aplicação. Para otimizar a forma como os contentores são montados no sistema de ficheiros, pode usar opções de montagem. Também pode usar atributos de volume para configurar o comportamento específico do controlador CSI do FUSE do Cloud Storage.

  4. Gestão do ciclo de vida: o volume efémero existe durante o ciclo de vida do pod ou da tarefa. Quando o pod é eliminado ou a tarefa é concluída, o controlador CSI processa automaticamente a limpeza e a desmontagem do volume.

Anexe o volume efémero da CSI

Siga estas instruções, consoante queira anexar o volume efémero da CSI a um Pod ou a um Job.

Pod

Para anexar o volume efémero da CSI num pod, siga estes passos:

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

    apiVersion: v1
    kind: Pod
    metadata:
      name: gcs-fuse-csi-example-ephemeral 
      namespace: NAMESPACE
      annotations:
        gke-gcsfuse/volumes: "true" 
    spec:
      terminationGracePeriodSeconds: 60
      containers:
      - image: busybox
        name: busybox
        command: ["sleep"]
        args: ["infinity"] 
        volumeMounts:
        - name: gcs-fuse-csi-ephemeral
          mountPath: /data
          readOnly: true
      serviceAccountName: KSA_NAME
      volumes:
      - name: gcs-fuse-csi-ephemeral
        csi:
          driver: gcsfuse.csi.storage.gke.io
          readOnly: true
          volumeAttributes:
            bucketName: BUCKET_NAME
            mountOptions: "implicit-dirs" 
    

    Substitua os seguintes valores:

    • NAMESPACE: o namespace do Kubernetes onde quer implementar o seu pod.
    • KSA_NAME: o nome da conta de serviço do Kubernetes que especificou quando configurou o acesso aos contentores do Cloud Storage.
    • BUCKET_NAME: o nome do contentor do Cloud Storage que especificou ao configurar o acesso aos contentores do Cloud Storage. Pode especificar um caráter de sublinhado (_) para montar todos os contentores aos quais a conta de serviço do Kubernetes pode aceder. Para saber mais, consulte o artigo Montagem dinâmica na documentação do Cloud Storage FUSE.

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

    • metadata.annotations: a anotação gke-gcsfuse/volumes: "true" é obrigatória. Consulte o artigo Configure o contentor auxiliar para ver anotações opcionais.
    • spec.volumes[n].csi.driver: use gcsfuse.csi.storage.gke.io como o nome do controlador CSI.

    Opcionalmente, pode ajustar estas variáveis:

    • spec.terminationGracePeriodSeconds: por predefinição, este valor está definido como 30. Se precisar de escrever ficheiros grandes no contentor do Cloud Storage, aumente este valor para se certificar de que o Cloud Storage FUSE tem tempo suficiente para limpar os dados depois de a sua aplicação sair. Para saber mais, consulte o artigo Práticas recomendadas do Kubernetes: terminar com elegância.
    • spec.volumes[n].csi.volumeAttributes.mountOptions: passe opções de montagem para o Cloud Storage FUSE. Especifique as flags numa única string separada por vírgulas, sem espaços.
    • spec.volumes[n].csi.volumeAttributes: transmita atributos de volume adicionais para o Cloud Storage FUSE.
    • spec.volumes[n].csi.readOnly: especifique true se todas as montagens de volume forem só de leitura.
    • spec.containers[n].volumeMounts[m].readOnly: especifique true se apenas uma montagem de volume específica for só de leitura.
  2. Execute o seguinte comando para aplicar o manifesto ao cluster:

    kubectl apply -f FILE_PATH
    

    Substitua FILE_PATH pelo caminho para o seu ficheiro YAML.

Agrupamento (colocação em cache de ficheiros)

Para anexar o volume efémero da CSI com o armazenamento em cache de ficheiros num pod, siga estes passos:

  1. Crie um cluster ou um node pool com armazenamento efémero suportado por SSD local seguindo os passos em Crie um cluster ou um node pool com armazenamento efémero suportado por SSD local.

  2. Crie um manifesto YAML de Pod com a seguinte especificação:

    apiVersion: v1
    kind: Pod
    metadata:
      name: gcs-fuse-csi-file-cache-example 
      namespace: NAMESPACE
      annotations:
        gke-gcsfuse/volumes: "true"
        gke-gcsfuse/ephemeral-storage-limit: "50Gi" 
    spec:
      nodeSelector:
        cloud.google.com/gke-ephemeral-storage-local-ssd: "true"
      restartPolicy: Never
      initContainers:
      - name: data-loader
        image: gcr.io/google.com/cloudsdktool/google-cloud-cli:slim
        resources:
          limits:
            cpu: 500m
            memory: 1Gi
          requests:
            cpu: 500m
            memory: 1Gi
        command:
          - "/bin/sh"
          - "-c"
          - |
            mkdir -p /test_files
            for i in $(seq 1 1000); do dd if=/dev/zero of=/test_files/file_$i.txt bs=1024 count=64; done
            gcloud storage cp /test_files gs://BUCKET_NAME --recursive
      containers:
      - name: data-validator
        image: busybox
        resources:
          limits:
            cpu: 500m
            memory: 512Mi
          requests:
            cpu: 500m
            memory: 512Mi
        command:
          - "/bin/sh"
          - "-c"
          - |
            echo "first read with cache miss"
            time cat /data/test_files/file_* > /dev/null
    
            echo "second read from local cache"
            time cat /data/test_files/file_* > /dev/null 
        volumeMounts:
        - name: gcs-fuse-csi-ephemeral
          mountPath: /data
      serviceAccountName: KSA_NAME
      volumes:
      - name: gcs-fuse-csi-ephemeral
        csi:
          driver: gcsfuse.csi.storage.gke.io
          volumeAttributes:
            bucketName: BUCKET_NAME
            mountOptions: "implicit-dirs,file-cache:max-size-mb:-1"
    

    Substitua os seguintes valores:

    • NAMESPACE: o namespace do Kubernetes onde quer implementar o seu pod.
    • KSA_NAME: o nome da conta de serviço do Kubernetes que especificou quando configurou o acesso aos contentores do Cloud Storage.
    • BUCKET_NAME: o nome do contentor do Cloud Storage que especificou ao configurar o acesso aos contentores do Cloud Storage. Pode especificar um caráter de sublinhado (_) para montar todos os contentores aos quais a conta de serviço do Kubernetes pode aceder. Para saber mais, consulte o artigo Montagem dinâmica na documentação do Cloud Storage FUSE.

      No manifesto de exemplo, o contentor de inicialização data-loader gera 1000 ficheiros com um tamanho de 64 KiB e carrega os ficheiros para um segmento do Cloud Storage. O contentor principal data-validator lê todos os ficheiros do contentor duas vezes e regista a duração.

  3. Execute o seguinte comando para aplicar o manifesto ao cluster:

    kubectl apply -f FILE_PATH
    

    Substitua FILE_PATH pelo caminho para o seu ficheiro YAML.

  4. Para ver o resultado do registo, execute o seguinte comando:

    kubectl logs -n NAMESPACE gcs-fuse-csi-file-cache-example -c data-validator
    

    Substitua NAMESPACE pelo espaço de nomes da sua carga de trabalho.

    O resultado deve ser semelhante ao seguinte:

    first read with cache miss
    real    0m 54.68s
    ...
    second read from local cache
    real    0m 0.38s
    ...
    

    O resultado mostra que a segunda leitura com a cache local é muito mais rápida do que a primeira leitura com uma falha de cache.

Agrupamento (transferência paralela)

Para anexar o volume efémero da CSI com a transferência paralela num pod, siga estes passos:

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

    apiVersion: v1
    kind: Pod
    metadata:
      name: gcs-fuse-csi-example-ephemeral 
      namespace: NAMESPACE
      annotations:
        gke-gcsfuse/volumes: "true"
        gke-gcsfuse/ephemeral-storage-limit: "50Gi" 
    spec:
      containers:
      ...
      volumes:
      - name: gcs-fuse-csi-ephemeral 
        csi:
          driver: gcsfuse.csi.storage.gke.io
          volumeAttributes:
            bucketName: BUCKET_NAME
            mountOptions: "implicit-dirs,file-cache:enable-parallel-downloads:true,file-cache:max-size-mb:-1"
            fileCacheCapacity: "-1"
    

    Substitua os seguintes valores:

    • NAMESPACE: o namespace do Kubernetes onde quer implementar o seu pod.
    • BUCKET_NAME: o nome do contentor do Cloud Storage que especificou ao configurar o acesso aos contentores do Cloud Storage. Pode especificar um caráter de sublinhado (_) para montar todos os contentores aos quais a conta de serviço do Kubernetes pode aceder. Para saber mais, consulte o artigo Montagem dinâmica na documentação do Cloud Storage FUSE.
  2. Execute o seguinte comando para aplicar o manifesto ao cluster:

    kubectl apply -f FILE_PATH
    

    Substitua FILE_PATH pelo caminho para o seu ficheiro YAML.

Emprego

Para anexar o volume efémero da CSI num trabalho, siga estes passos:

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

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: gcs-fuse-csi-job-example 
      namespace: NAMESPACE 
    spec:
      template:
        metadata: 
          annotations:
            gke-gcsfuse/volumes: "true"
        spec:
          serviceAccountName: KSA_NAME 
          containers:
          - name: writer
            image: busybox
            command:
              - "/bin/sh"
              - "-c"
              - touch /data/test && echo $(date) >> /data/test && sleep 10
            volumeMounts:
            - name: gcs-fuse-csi-ephemeral
              mountPath: /data
          - name: reader
            image: busybox
            command:
              - "/bin/sh"
              - "-c"
              - sleep 10 && cat /data/test 
            volumeMounts:
            - name: gcs-fuse-csi-ephemeral
              mountPath: /data
              readOnly: true
          volumes:
          - name: gcs-fuse-csi-ephemeral
            csi:
              driver: gcsfuse.csi.storage.gke.io
              volumeAttributes:
                bucketName: BUCKET_NAME
          restartPolicy: Never 
      backoffLimit: 1
    

    Substitua os seguintes valores:

    • NAMESPACE: o namespace do Kubernetes onde implementa o seu pod.
    • KSA_NAME: o nome da conta de serviço do Kubernetes que especificou quando configurou o acesso aos contentores do Cloud Storage.
    • BUCKET_NAME: o nome do contentor do Cloud Storage que especificou ao configurar o acesso aos contentores do Cloud Storage. Pode especificar um caráter de sublinhado (_) para montar todos os contentores aos quais a conta de serviço do Kubernetes pode aceder. Para saber mais, consulte o artigo Montagem dinâmica na documentação do Cloud Storage FUSE.

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

    • metadata.annotations: a anotação gke-gcsfuse/volumes: "true" é obrigatória. Consulte o artigo Configure o contentor auxiliar para ver anotações opcionais.
    • spec.volumes[n].csi.driver: use gcsfuse.csi.storage.gke.io como o nome do controlador CSI.

    Opcionalmente, pode ajustar estas variáveis:

    • spec.volumes[n].csi.volumeAttributes.mountOptions: passe opções de montagem para o Cloud Storage FUSE. Especifique as flags numa única string separada por vírgulas, sem espaços.
    • spec.volumes[n].csi.volumeAttributes: transmita atributos de volume adicionais para o Cloud Storage FUSE.
    • spec.volumes[n].csi.readOnly: especifique true se todas as montagens de volume forem só de leitura.
    • spec.containers[n].volumeMounts[m].readOnly: especifique verdadeiro se apenas uma montagem de volume específica for só de leitura.
  2. Execute o seguinte comando para aplicar o manifesto ao cluster:

    kubectl apply -f FILE_PATH
    

    Substitua FILE_PATH pelo caminho para o seu ficheiro YAML.

Monte o mesmo contentor do Cloud Storage com diferentes volumes efémeros da CSI

Opcionalmente, pode usar vários volumes efémeros da CSI suportados pelo mesmo contentor do Cloud Storage. Para tal, anexe dois ou mais volumes que façam referência ao mesmo nome do contentor em diferentes caminhos de montagem. Um exemplo de utilização pode ser a montagem de diferentes volumes efémeros de CSI com diferentes opções de montagem no mesmo pod, em que cada volume efémero se refere ao mesmo contentor do Cloud Storage. Segue-se um exemplo de um manifesto de agrupamento que usa esta funcionalidade:

apiVersion: batch/v1
kind: Job
metadata:
  name: gcs-fuse-csi-job-example
  namespace: NAMESPACE
spec:
  template:
    metadata:
      annotations:
        gke-gcsfuse/volumes: "true"
    spec:
      serviceAccountName: KSA_NAME
      containers:
      - name: writer
        image: busybox
        command:
          - "/bin/sh"
          - "-c"
          - touch /data/test && echo $(date) >> /data/test && sleep 10
        volumeMounts: 
        - name: gcs-fuse-csi-ephemeral
          mountPath: /data
        volumeMounts:
        - name: gcs-fuse-csi-ephemeral-with-mo
          mountPath: /data2
      volumes:
      - name: gcs-fuse-csi-ephemeral
        csi:
          driver: gcsfuse.csi.storage.gke.io
          volumeAttributes:
            bucketName: BUCKET_NAME
      - name: gcs-fuse-csi-ephemeral-with-mo
        csi:
          driver: gcsfuse.csi.storage.gke.io
          volumeAttributes:
            bucketName: BUCKET_NAME
            mountOptions: "implicit-dirs"
      restartPolicy: Never
  backoffLimit: 1

Resolver problemas

Para mais informações sobre a resolução de problemas do controlador CSI do FUSE do Cloud Storage, consulte o guia de resolução de problemas na documentação do projeto do GitHub.

O que se segue?