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:
- Compreenda os requisitos e as limitações do controlador CSI do FUSE do Cloud Storage.
- Crie o contentor do Cloud Storage
- Ative o controlador CSI FUSE do Cloud Storage
- Configure o acesso a contentores do Cloud Storage
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:
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.
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.
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.
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:
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çãogke-gcsfuse/volumes: "true"
é obrigatória. Consulte o artigo Configure o contentor auxiliar para ver anotações opcionais.spec.volumes[n].csi.driver
: usegcsfuse.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.
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:
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.
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.
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.
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:
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.
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:
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çãogke-gcsfuse/volumes: "true"
é obrigatória. Consulte o artigo Configure o contentor auxiliar para ver anotações opcionais.spec.volumes[n].csi.drive
r: usegcsfuse.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.
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?
- Saiba como otimizar o desempenho do controlador CSI FUSE do Cloud Storage.
- Explore exemplos adicionais para usar o controlador CSI no GitHub.
- Saiba mais sobre o FUSE do Cloud Storage.