Configure o controlador CSI FUSE do Cloud Storage para o GKE

Esta página descreve como pode configurar e preparar-se para usar o controlador CSI FUSE do Cloud Storage para o GKE.

Para usar o controlador CSI FUSE do Cloud Storage, siga estes passos:

Crie o contentor do Cloud Storage

Se ainda não o fez, crie os seus contentores do Cloud Storage. Vai montar estes contentores como volumes no seu cluster do GKE. Para melhorar o desempenho, defina o Tipo de localização como Região e selecione uma região que corresponda ao seu cluster do GKE.

Ative o controlador CSI FUSE do Cloud Storage

Siga estes passos, consoante esteja a usar clusters do GKE Autopilot ou Standard. Recomendamos que use um cluster do Autopilot para uma experiência do Kubernetes totalmente gerida. Para escolher o modo mais adequado às suas cargas de trabalho, consulte Escolha um modo de funcionamento do GKE.

Piloto automático

O controlador CSI FUSE do Cloud Storage está ativado por predefinição para clusters do Autopilot. Pode avançar para a secção Configure o acesso a contentores do Cloud Storage.

Standard

Se o cluster Standard tiver o controlador CSI do FUSE do Cloud Storage ativado, avance para a secção Configure o acesso a contentores do Cloud Storage.

O controlador CSI FUSE do Cloud Storage não está ativado por predefinição nos clusters Standard. Para criar um cluster padrão com o controlador CSI FUSE do Cloud Storage ativado, pode usar o comando gcloud container clusters create:

gcloud container clusters create CLUSTER_NAME \
    --addons GcsFuseCsiDriver \
    --cluster-version=VERSION \
    --location=LOCATION \
    --workload-pool=PROJECT_ID.svc.id.goog

Substitua o seguinte:

  • CLUSTER_NAME: o nome do cluster.
  • VERSION: o número da versão do GKE. Tem de selecionar a versão 1.24 ou posterior.
  • LOCATION: a região ou zona do Compute Engine para o cluster.
  • PROJECT_ID: o ID do seu projeto.

Para ativar o controlador num cluster padrão existente, use o comando gcloud container clusters update:

gcloud container clusters update CLUSTER_NAME \
    --update-addons GcsFuseCsiDriver=ENABLED \
    --location=LOCATION

Para verificar se o controlador CSI FUSE do Cloud Storage está ativado no seu cluster, execute o seguinte comando:

gcloud container clusters describe CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --format="value(addonsConfig.gcsFuseCsiDriverConfig.enabled)"

Configure o acesso a contentores do Cloud Storage

O controlador CSI do FUSE do Cloud Storage usa a Workload Identity Federation para o GKE, para que possa definir autorizações detalhadas sobre a forma como os seus pods do GKE podem aceder aos dados armazenados no Cloud Storage.

Para tornar os seus contentores do Cloud Storage acessíveis pelo cluster do GKE, autentique-se através da Workload Identity Federation para o GKE com o contentor do Cloud Storage que quer montar na especificação do pod:

  1. Se não tiver a Workload Identity Federation para o GKE ativada, siga estes passos para a ativar. Se quiser usar um conjunto de nós existente, ative manualmente a federação de identidade da força de trabalho para o GKE no conjunto de nós depois de ativar a federação de identidade da força de trabalho para o GKE no cluster.
  2. Obtenha credenciais para o seu cluster:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=LOCATION
    

    Substitua o seguinte:

  3. Crie um espaço de nomes para usar para a conta de serviço do Kubernetes. Também pode usar o espaço de nomes default ou qualquer espaço de nomes existente.

    kubectl create namespace NAMESPACE
    

    Substitua NAMESPACE pelo nome do espaço de nomes do Kubernetes para a conta de serviço do Kubernetes.

  4. Crie uma ServiceAccount do Kubernetes para a sua aplicação usar. Também pode usar qualquer conta de serviço do Kubernetes existente em qualquer espaço de nomes, incluindo a conta de serviço do Kubernetes default.

    kubectl create serviceaccount KSA_NAME \
        --namespace NAMESPACE
    

    Substitua KSA_NAME pelo nome da sua ServiceAccount do Kubernetes.

  5. Conceda uma das funções de IAM para o Cloud Storage à conta de serviço do Kubernetes. Siga estes passos, consoante esteja a conceder acesso à conta de serviço do Kubernetes apenas a um contentor do Cloud Storage específico ou acesso global a todos os contentores no projeto.

    Acesso a contentores específicos

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member "principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role "ROLE_NAME"
    

    Substitua o seguinte:

    • BUCKET_NAME: o nome do seu contentor do Cloud Storage.
    • PROJECT_NUMBER: o número do projeto numérico do seu cluster do GKE. Para encontrar o número do projeto, consulte o artigo Identificar projetos.
    • PROJECT_ID: o ID do projeto do seu cluster do GKE.
    • NAMESPACE: o nome do namespace do Kubernetes para a ServiceAccount do Kubernetes.
    • KSA_NAME: o nome da sua nova conta de serviço do Kubernetes.
    • ROLE_NAME: a função de IAM a atribuir à sua conta de serviço do Kubernetes.
      • Para cargas de trabalho só de leitura, use a função Storage Object Viewer (roles/storage.objectViewer).
      • Para cargas de trabalho de leitura/escrita, use a função de utilizador de objetos de armazenamento (roles/storage.objectUser).

    Acesso global ao contentor

    gcloud projects add-iam-policy-binding GCS_PROJECT \
        --member "principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role "ROLE_NAME"
    

    Substitua o seguinte:

    • GCS_PROJECT: o ID do projeto dos seus contentores do Cloud Storage.
    • PROJECT_NUMBER: o número do projeto numérico do seu cluster do GKE. Para encontrar o número do projeto, consulte o artigo Identificar projetos.
    • PROJECT_ID: o ID do projeto do seu cluster do GKE.
    • NAMESPACE: o nome do namespace do Kubernetes para a ServiceAccount do Kubernetes.
    • KSA_NAME: o nome da sua nova conta de serviço do Kubernetes.
    • ROLE_NAME: a função de IAM a atribuir à sua conta de serviço do Kubernetes.
      • Para cargas de trabalho só de leitura, use a função Storage Object Viewer (roles/storage.objectViewer).
      • Para cargas de trabalho de leitura/escrita, use a função de utilizador de objetos de armazenamento (roles/storage.objectUser).

Configure o acesso para pods com rede de anfitrião

Para versões do cluster do GKE anteriores a 1.33.3-gke.1226000, o controlador CSI do FUSE do Cloud Storage não suporta pods executados na rede do anfitrião (hostNetwork: true) devido a restrições da Workload Identity Federation para o GKE. No entanto, para versões posteriores do GKE, pode configurar a autenticação segura para os pods com hostNetwork quando usa o controlador CSI do FUSE do Cloud Storage para montar contentores do Cloud Storage. O suporte de rede de anfitrião só está disponível em clusters GKE padrão.

Certifique-se de que o cluster do GKE cumpre os seguintes requisitos:

  • Tanto o plano de controlo como os conjuntos de nós no cluster do GKE Standard têm de ter a versão 1.33.3-gke.1226000 ou posterior.
  • Ative o Workload Identity no seu cluster.
  • Conceda as autorizações do IAM necessárias à conta de serviço do Kubernetes que o pod com hostNetwork usa para aceder ao seu contentor do Cloud Storage. Para mais informações, consulte o artigo Autentique-se no Cloud Storage FUSE.

Especifique o atributo de volume hostNetworkPodKSA: "true" na definição de Pod ou PersistentVolume para permitir que os seus Pods HostNetwork acedam a volumes do Cloud Storage. A configuração exata difere consoante a forma como gere o contentor auxiliar do FUSE do Cloud Storage.

Ficheiros sidecar geridos

Esta secção aplica-se se o GKE injetar e gerir automaticamente o contentor secundário do FUSE do Cloud Storage nos seus pods. Esta opção é a configuração predefinida e recomendada para o controlador CSI do FUSE do Cloud Storage.

Volume temporário

A configuração do manifesto do pod seguinte configura um volume efémero para um pod aceder a um contentor do Cloud Storage.HostNetwork

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: ns1
  annotations:
    gke-gcsfuse/volumes: "true"
spec:
  serviceAccountName: test-ksa-ns1
  hostNetwork: true
  containers:
  - image: busybox
    name: busybox
    command:
      - sleep
      - "3600"
    volumeMounts:
    - name: gcs-fuse-csi-ephemeral
      mountPath: /data
  volumes:
  - name: gcs-fuse-csi-ephemeral
    csi:
      driver: gcsfuse.csi.storage.gke.io
      volumeAttributes:
        bucketName: test-bucket
        hostNetworkPodKSA: "true"

Volume persistente

O seguinte manifesto de PV configura um PV para um HostNetwork Pod aceder a um contentor do Cloud Storage.

apiVersion: v1
kind: PersistentVolume
metadata:
name: gcp-cloud-storage-csi-pv
spec:
accessModes:
- ReadWriteMany
capacity:
  storage: 5Gi
persistentVolumeReclaimPolicy: Retain
# storageClassName does not need to refer to an existing StorageClass object.
storageClassName: test-storage-class
mountOptions:
  - uid=1001
  - gid=3003
csi:
  driver: gcsfuse.csi.storage.gke.io
  volumeHandle: test-wi-host-network-2
  volumeAttributes:
    hostNetworkPodKSA: "true"

Private sidecars

Esta secção aplica-se se gerir manualmente o contentor auxiliar do FUSE do Cloud Storage nos seus pods ou usar uma imagem auxiliar personalizada.

Certifique-se de que a imagem sidecar se baseia na versão v1.17.2 ou posterior do controlador CSI do FUSE do Cloud Storage.

Volume temporário

A configuração do manifesto do pod seguinte configura um volume efémero para um pod aceder a um contentor do Cloud Storage.HostNetwork

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: ns1
  annotations:
    gke-gcsfuse/volumes: "true"
spec:
  serviceAccountName: test-ksa-ns1
  hostNetwork: true
  containers:
  - image: busybox
    name: busybox
    command:
      - sleep
      - "3600"
    volumeMounts:
    - name: gcs-fuse-csi-ephemeral
      mountPath: /data
  volumes:
  - name: gcs-fuse-csi-ephemeral
    csi:
      driver: gcsfuse.csi.storage.gke.io
      volumeAttributes:
        bucketName: test-bucket
        hostNetworkPodKSA: "true"
        identityProvider: "https://container.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME"

No campo identityProvider, substitua o seguinte:

  • PROJECT_ID: o ID do seu Cloud de Confiance by S3NS projeto.
  • LOCATION: a localização do seu cluster.
  • CLUSTER_NAME: o nome do seu cluster do GKE Standard.

Volume persistente

O seguinte manifesto de PV configura um PV para um HostNetwork Pod aceder a um contentor do Cloud Storage.

apiVersion: v1
kind: PersistentVolume
metadata:
name: gcp-cloud-storage-csi-pv
spec:
accessModes:
- ReadWriteMany
capacity:
  storage: 5Gi
persistentVolumeReclaimPolicy: Retain
# storageClassName does not need to refer to an existing StorageClass object.
storageClassName: test-storage-class
mountOptions:
  - uid=1001
  - gid=3003
csi:
  driver: gcsfuse.csi.storage.gke.io
  volumeHandle: test-wi-host-network-2
  volumeAttributes:
    hostNetworkPodKSA: "true"
    identityProvider: "https://container.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME"

No campo identityProvider, substitua o seguinte:

  • PROJECT_ID: o ID do seu Cloud de Confiance by S3NS projeto.
  • LOCATION: a localização do seu cluster.
  • CLUSTER_NAME: o nome do seu cluster do GKE Standard.

O que se segue?