Aceda a instâncias do Lustre geridas no GKE com o controlador CSI do Lustre gerido

Este guia descreve como pode criar um novo volume do Kubernetes com base no controlador CSI do Lustre gerido no GKE com aprovisionamento dinâmico. O controlador CSI Lustre gerido permite-lhe criar armazenamento com base em instâncias do Lustre gerido a pedido e aceder a este como volumes para as suas cargas de trabalho com estado.

Antes de começar

Antes de começar, certifique-se de que realizou as seguintes tarefas:

  • Ative a API Google Cloud Managed Lustre e a API Google Kubernetes Engine.
  • Ativar APIs
  • Se quiser usar a CLI gcloud para esta tarefa, instale-a e, em seguida, inicialize-a. Se instalou anteriormente a CLI gcloud, execute gcloud components update para obter a versão mais recente.

Configure variáveis de ambiente

Configure as seguintes variáveis de ambiente:

export CLUSTER_NAME=CLUSTER_NAME
export PROJECT_ID=PROJECT_ID
export NETWORK_NAME=LUSTRE_NETWORK
export IP_RANGE_NAME=LUSTRE_IP_RANGE
export FIREWALL_RULE_NAME=LUSTRE_FIREWALL_RULE
export LOCATION=ZONE
export CLUSTER_VERSION=CLUSTER_VERSION

Substitua o seguinte:

  • CLUSTER_NAME: o nome do cluster.
  • PROJECT_ID: o seu Google Cloud ID do projeto.
  • LUSTRE_NETWORK: a rede da nuvem virtual privada (VPC) partilhada onde residem o cluster do GKE e a instância do Lustre gerida.
  • LUSTRE_IP_RANGE: o nome do intervalo de endereços IP criado para a interligação de redes VPC com o Managed Lustre.
  • LUSTRE_FIREWALL_RULE: o nome da regra de firewall para permitir o tráfego TCP do intervalo de endereços IP.
  • ZONE: a zona geográfica do seu cluster do GKE; por exemplo, us-central1-a.
  • CLUSTER_VERSION: a versão do cluster do GKE.

Configure uma rede de VPC

Tem de especificar a mesma rede VPC quando criar a instância do Lustre gerido e os clusters do GKE, ou ligar através do Centro de conectividade de rede se usar uma rede VPC com peering.

  1. Para ativar a rede de serviços, execute o seguinte comando:

    gcloud services enable servicenetworking.googleapis.com \
        --project=${PROJECT_ID}
    
  2. Crie uma rede de VPC. Definir a flag --mtu como 8896 resulta num aumento de 10% no desempenho.

    gcloud compute networks create ${NETWORK_NAME} \
        --subnet-mode=auto --project=${PROJECT_ID} \
        --mtu=8896
    
  3. Crie um intervalo de endereços IP.

    gcloud compute addresses create ${IP_RANGE_NAME} \
        --global \
        --purpose=VPC_PEERING \
        --prefix-length=20 \
        --description="Managed Lustre VPC Peering" \
        --network=${NETWORK_NAME} \
        --project=${PROJECT_ID}
    
  4. Obtenha o intervalo CIDR associado ao intervalo que criou no passo anterior.

    CIDR_RANGE=$(
      gcloud compute addresses describe ${IP_RANGE_NAME} \
          --global  \
          --format="value[separator=/](address, prefixLength)" \
          --project=${PROJECT_ID}
    )
    
  5. Crie uma regra de firewall para permitir o tráfego TCP do intervalo de endereços IP que criou.

    gcloud compute firewall-rules create ${FIREWALL_RULE_NAME} \
        --allow=tcp:988,tcp:6988 \
        --network=${NETWORK_NAME} \
        --source-ranges=${CIDR_RANGE} \
        --project=${PROJECT_ID}
    
  6. Para configurar a interligação de redes para o seu projeto, verifique se tem as autorizações de IAM necessárias, especificamente a função compute.networkAdmin ou servicenetworking.networksAdmin.

    1. Aceda a Google Cloud consola > IAM e administração e, de seguida, pesquise o principal proprietário do projeto.
    2. Clique no ícone de lápis e, de seguida, em + ADICIONAR OUTRA FUNÇÃO.
    3. Selecione Administrador de rede de cálculo ou Administrador de rede de serviços.
    4. Clique em Guardar.
  7. Estabeleça a ligação de peering.

    gcloud services vpc-peerings connect \
        --network=${NETWORK_NAME} \
        --project=${PROJECT_ID} \
        --ranges=${IP_RANGE_NAME} \
        --service=servicenetworking.googleapis.com
    

Configure o controlador CSI Lustre gerido

Esta secção aborda como pode ativar e desativar o controlador CSI Lustre gerido, se necessário.

Portas de comunicação do Lustre

O controlador CSI do Lustre gerido do GKE usa portas diferentes para a comunicação com instâncias do Lustre gerido, consoante a versão do cluster do GKE e as configurações do Lustre gerido existentes.

  • Porta predefinida (recomendado): para novos clusters do GKE que executam a versão 1.33.2-gke.4780000 ou posterior, o controlador usa a porta 988 para a comunicação Lustre por predefinição.

  • Porta antiga: use a porta 6988 anexando a flag --enable-legacy-lustre-port aos seus comandos gcloud nos seguintes cenários:

    • Versões anteriores do GKE: se o seu cluster do GKE executar uma versão anterior à 1.33.2-gke.4780000, a flag --enable-legacy-lustre-port contorna um conflito de portas com o gke-metadata-server nos nós do GKE.
    • Instâncias do Lustre existentes: se estiver a estabelecer ligação a uma instância do Lustre gerida existente que foi criada com a flag gke-support-enabled, tem de incluir --enable-legacy-lustre-port nos comandos gcloud, independentemente da versão do cluster. Sem esta flag, o cluster do GKE não consegue montar a instância do Lustre existente. Para informações sobre a flag gke-support-enabled, consulte a descrição das flags opcionais em Crie uma instância.

Pode configurar os clusters novos e existentes para usar a porta predefinida 988 ou a porta antiga 6988.

Ative o controlador CSI Lustre gerido num novo cluster do GKE

As secções seguintes descrevem como ativar o controlador CSI Lustre gerido num novo cluster do GKE.

Usar a porta predefinida 988

Para ativar o controlador CSI Lustre gerido quando cria um novo cluster do GKE que executa a versão 1.33.2-gke.4780000 ou posterior, execute o seguinte comando:

Piloto automático

gcloud container clusters create-auto "${CLUSTER_NAME}" \
    --location=${LOCATION} \
    --network="${NETWORK_NAME}" \
    --cluster-version=${CLUSTER_VERSION} \
    --enable-lustre-csi-driver

Standard

gcloud container clusters create "${CLUSTER_NAME}" \
    --location=${LOCATION} \
    --network="${NETWORK_NAME}" \
    --cluster-version=${CLUSTER_VERSION} \
    --addons=LustreCsiDriver

Use a porta antiga 6988

Para ativar o controlador CSI Lustre gerido quando cria um novo cluster do GKE que executa uma versão anterior à 1.33.2-gke.4780000, execute o seguinte comando:

Piloto automático

gcloud container clusters create-auto "${CLUSTER_NAME}" \
    --location=${LOCATION} \
    --network="${NETWORK_NAME}" \
    --cluster-version=${CLUSTER_VERSION} \
    --enable-lustre-csi-driver \
    --enable-legacy-lustre-port

Standard

gcloud container clusters create "${CLUSTER_NAME}" \
    --location=${LOCATION} \
    --network="${NETWORK_NAME}" \
    --cluster-version=${CLUSTER_VERSION} \
    --addons=LustreCsiDriver \
    --enable-legacy-lustre-port

Ative o controlador CSI Lustre gerido em clusters do GKE existentes

As secções seguintes descrevem como ativar o controlador CSI Lustre gerido em clusters do GKE existentes.

Usar a porta predefinida 988

Para ativar o controlador CSI Lustre gerido num cluster do GKE existente que execute a versão 1.33.2-gke.4780000 ou posterior, execute o seguinte comando:

  gcloud container clusters update ${CLUSTER_NAME} \
      --location=${LOCATION} \
      --update-addons=LustreCsiDriver=ENABLED

Use a porta antiga 6988

Para ativar o controlador CSI Lustre gerido num cluster do GKE existente, pode ter de usar a porta antiga 6988 adicionando a flag --enable-legacy-lustre-port. Esta flag é obrigatória nos seguintes cenários:

  • Se o seu cluster do GKE for executado numa versão anterior a 1.33.2-gke.4780000.
  • Se pretender associar este cluster a uma instância do Lustre gerida existente que foi criada com a flag gke-support-enabled.

    gcloud container clusters update ${CLUSTER_NAME} \
        --location=${LOCATION} \
        --enable-legacy-lustre-port
    

É necessária a atualização de nós em clusters existentes

A ativação do controlador CSI Lustre gerido em clusters existentes pode acionar a recriação de nós para atualizar os módulos do kernel necessários para o cliente Lustre gerido. Para disponibilidade imediata, recomendamos que atualize manualmente os seus conjuntos de nós.

Os clusters do GKE num canal de lançamento são atualizados de acordo com a respetiva implementação agendada, que pode demorar várias semanas, consoante a sua janela de manutenção. Se estiver numa versão estática do GKE, tem de atualizar manualmente os seus conjuntos de nós.

Após a atualização do conjunto de nós, os nós da CPU podem parecer estar a usar uma imagem de GPU na saída da consolaGoogle Cloud ou da CLI. Por exemplo:

config:
  imageType: COS_CONTAINERD
  nodeImageConfig:
    image: gke-1330-gke1552000-cos-121-18867-90-4-c-nvda

Este comportamento é o esperado. A imagem da GPU está a ser reutilizada em nós da CPU para instalar em segurança os módulos do kernel do Lustre gerido. Não lhe será cobrado o uso da GPU.

Desative o controlador CSI Lustre gerido

Pode desativar o controlador CSI Lustre gerido num cluster do GKE existente através da CLI Google Cloud.

gcloud container clusters update ${CLUSTER_NAME} \
    --location=${LOCATION} \
    --update-addons=LustreCsiDriver=DISABLED

Depois de o controlador CSI ser desativado, o GKE recria automaticamente os seus nós e desinstala os módulos do kernel Lustre geridos.

Crie um novo volume com o controlador CSI Lustre gerido

As secções seguintes descrevem o processo típico de criação de um volume do Kubernetes com base numa instância do Lustre gerida no GKE:

  1. Crie uma StorageClass.
  2. Use um PersistentVolumeClaim para aceder ao volume.
  3. Crie uma carga de trabalho que consuma o volume.

Crie uma StorageClass

Quando o controlador CSI Lustre gerido está ativado, o GKE cria automaticamente uma StorageClass para o aprovisionamento de instâncias do Lustre gerido. A StorageClass depende do nível de desempenho do Lustre gerido. GKE e é uma das seguintes opções:

  • lustre-rwx-125mbps-per-tib
  • lustre-rwx-250mbps-per-tib
  • lustre-rwx-500mbps-per-tib
  • lustre-rwx-1000mbps-per-tib

O GKE fornece uma StorageClass predefinida para cada nível de desempenho do Lustre gerido suportado. Isto simplifica o aprovisionamento dinâmico de instâncias do Lustre geridas, uma vez que pode usar as StorageClasses incorporadas sem ter de definir as suas próprias.

Para clusters zonais, o controlador CSI aprovisiona instâncias do Lustre gerido na mesma zona que o cluster. Para clusters regionais, aprovisiona a instância numa das zonas da região.

O exemplo seguinte mostra como criar uma StorageClass personalizada com requisitos de topologia específicos:

  1. Guarde o seguinte manifesto num ficheiro com o nome lustre-class.yaml:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: lustre-class
    provisioner: lustre.csi.storage.gke.io
    volumeBindingMode: Immediate
    reclaimPolicy: Delete
    parameters:
      perUnitStorageThroughput: "1000"
      network: LUSTRE_NETWORK
    allowedTopologies:
    - matchLabelExpressions:
      - key: topology.gke.io/zone
        values:
        - us-central1-a
    

    Para ver a lista completa de campos suportados na StorageClass, consulte a documentação de referência do controlador CSI do Lustre gerido.

  2. Execute este comando para criar a StorageClass:

    kubectl apply -f lustre-class.yaml
    

Use uma PersistentVolumeClaim para aceder ao volume

Esta secção mostra como criar um recurso PersistentVolumeClaim que faz referência à StorageClass do controlador CSI Lustre gerido.

  1. Guarde o seguinte manifesto num ficheiro com o nome lustre-pvc.yaml:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: lustre-pvc
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 9000Gi
      storageClassName: lustre-class
    

    Para ver a lista completa de campos suportados no PersistentVolumeClaim, consulte a documentação de referência do controlador CSI do Lustre gerido.

  2. Execute este comando para criar o PersistentVolumeClaim:

    kubectl apply -f lustre-pvc.yaml
    

Crie uma carga de trabalho para consumir o volume

Esta secção mostra um exemplo de como criar um Pod que consuma o recurso PersistentVolumeClaim que criou anteriormente.

Vários pods podem partilhar o mesmo recurso PersistentVolumeClaim.

  1. Guarde o seguinte manifesto num ficheiro com o nome my-pod.yaml.

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
          - name: lustre-volume
            mountPath: /data
      volumes:
      - name: lustre-volume
        persistentVolumeClaim:
          claimName: lustre-pvc
    
  2. Aplique o manifesto ao cluster.

    kubectl apply -f my-pod.yaml
    
  3. Verifique se o Pod está em execução. O pod é executado depois de o PersistentVolumeClaim ser aprovisionado. Esta operação pode demorar alguns minutos a ser concluída.

    kubectl get pods
    

    O resultado é semelhante ao seguinte:

    NAME           READY   STATUS    RESTARTS   AGE
    my-pod         1/1     Running   0          11s
    

Use fsGroup com volumes Lustre geridos

Pode alterar a propriedade do grupo do diretório ao nível da raiz do sistema de ficheiros montado para corresponder a um fsGroup pedido pelo utilizador especificado no SecurityContext do pod. O fsGroup não altera recursivamente a propriedade de todo o sistema de ficheiros Lustre gerido montado. Apenas o diretório raiz do ponto de montagem é afetado.

Resolução de problemas

Para ver orientações de resolução de problemas, consulte a página de resolução de problemas na documentação do Lustre gerido.

Limpar

Para evitar incorrer em cobranças na sua conta do Google Cloud , elimine os recursos de armazenamento que criou neste guia.

  1. Elimine o pod e o PersistentVolumeClaim.

    kubectl delete pod my-pod
    kubectl delete pvc lustre-pvc
    
  2. Verifique o estado do PersistentVolume.

    kubectl get pv
    

    O resultado é semelhante ao seguinte:

    No resources found
    

    A eliminação completa da instância do Lustre subjacente pode demorar alguns minutos.

O que se segue?