Criar e usar credenciais para importar imagens do Cloud Storage para o ambiente de execução de VMs no GDC

Neste documento, mostramos como criar e usar credenciais para acessar o Cloud Storage usando o ambiente de execução de VMs no GDC. Um plug-in do Cloud Storage permite usar o Importador de dados conteinerizado (CDI, na sigla em inglês) para importar imagens de VM de buckets do Cloud Storage. Em seguida, é possível criar discos virtuais dessas imagens no Cloud Storage e anexá-los a VMs em execução no cluster. O CDI é ativado automaticamente em um cluster que executa o ambiente de execução da VM na GDC.

Antes de começar

Para concluir este documento, você precisa de acesso aos seguintes recursos:

Visão geral das credenciais

Para acessar o Cloud Storage, use uma conta de serviço que fornece credenciais para o bucket de armazenamento. A conta de serviço requer privilégios diferentes para acessar um bucket de armazenamento:

  • Bucket de armazenamento público: você usa uma conta de serviço para autoidentificação, mas não são necessárias permissões específicas.
  • Bucket de armazenamento particular: a conta de armazenamento exige o privilégio Leitor ou Administrador no bucket de armazenamento.

Há duas maneiras de fornecer as credenciais da conta de serviço ao CDI:

  • Configure o Application Default Credentials (ADC) do Google nos nós no cluster. Para mais informações, consulte Autenticação como uma conta de serviço.
  • Informe um secret que contenha a chave da conta de serviço para acessar o Cloud Storage. O restante deste documento mostra como criar uma chave e um secret da conta de serviço.

Criar um secret

Transmita a chave da conta de serviço ao Kubernetes usando um secret criado no namespace do volume de dados. A seção data do secret contém uma entrada para creds-gcp.json. O valor é o dado codificado em base64 do arquivo de chave da conta de serviço. A CLI cria esses dados codificados em base64 para você. Se você usar um manifesto YAML para criar o secret, primeiro crie um hash Base64 do conteúdo do arquivo de chave da sua conta de serviço.

CLI

  • Crie o Secret usando kubectl:

    kubectl create secret generic SECRET_NAME \
      --from-file=creds-gcp.json=SERVICE_ACCOUNT_KEY_PATH \
      --namespace NAMESPACE_NAME
    

    Substitua os seguintes valores:

    • SECRET_NAME: o nome do secret.
    • SERVICE_ACCOUNT_KEY_PATH: o caminho para o arquivo de chave da sua conta de serviço.
    • NAMESPACE_NAME: o namespace do Secret.
      • Crie seu secret no cluster em que o CDI é executado e no mesmo namespace que o volume de dados. O CDI é ativado automaticamente em um cluster que executa o ambiente de execução da VM no GDC.

Manifesto

  1. Crie um manifesto Secret, como my-secret.yaml, no editor de sua escolha:

    nano my-secret.yaml
    
  2. Copie e cole o seguinte manifesto YAML:

    apiVersion: v1
    data:
      creds-gcp.json: BASE64_SERVICE_ACCOUNT_FILE
    kind: Secret
    metadata:
      name: SECRET_NAME
      namespace: NAMESPACE_NAME
    type: Opaque
    

    Substitua os seguintes valores:

    • BASE64_SERVICE_ACCOUNT_FILE: o hash em base64 do conteúdo do arquivo de chave da sua conta de serviço.
    • SECRET_NAME: o nome do secret.
    • NAMESPACE_NAME: o namespace do Secret.
      • Crie seu secret no cluster em que o CDI é executado e no mesmo namespace que o volume de dados. O CDI é ativado automaticamente em um cluster que executa o ambiente de execução da VM no GDC.
  3. Salve e feche o manifesto do secret no editor.

  4. Aplique o manifesto do secret usando kubectl:

    kubectl apply -f my-secret.yaml
    

Encaminhar um secret atual

Em vez de criar um secret, é possível criar um SecretForwarder para encaminhar um secret atual para uso. O SecretForwarder oferece suporte ao encaminhamento de secrets no mesmo cluster ou entre clusters, como do cluster de administrador para um cluster de usuário.

Se quiser usar o secret de destino para acessar o Cloud Storage, ele precisará ter uma chave creds-gcp.json na seção data.

Mesmo cluster

O exemplo de manifesto SecretForwarder a seguir encaminha uma chave secreta no mesmo cluster:

apiVersion: baremetal.cluster.gke.io/v1
kind: SecretForwarder
metadata:
  name: cdi-gcs
  namespace: default
spec:
  inClusterTargetSecrets:
    name: gcs-sa
    namespaces:
    - default
  sourceSecret:
    name: gke-connect
    namespace: anthos-creds

Este exemplo faz o seguinte:

  • Cria um SecretForwarder chamado cdi-gcs no namespace default.
  • Encaminha o secret chamado gke-connect no namespace anthos-creds para um novo secret chamado gcs-sa no namespace default.
  • Cria o novo secret no mesmo cluster.

Para encaminhar um secret no mesmo cluster, siga estas etapas:

  1. Crie um manifesto SecretForwarder, como my-forwarded-secret.yaml, no editor de sua escolha:

    nano my-forwarded-secret.yaml
    
  2. Copie e cole o seguinte manifesto YAML:

    apiVersion: baremetal.cluster.gke.io/v1
    kind: SecretForwarder
    metadata:
      name: SECRET_FORWARDER_NAME
      namespace: NAMESPACE_NAME
    spec:
      inClusterTargetSecrets:
        name: TARGET_SECRET_NAME
        namespaces:
        - TARGET_NAMESPACE_NAME
      sourceSecret:
        name: SOURCE_SECRET_NAME
        namespace: SOURCE_NAMESPACE_NAME
    

    Substitua os seguintes valores:

    • SECRET_FORWARDER_NAME: o nome do SecretForwarder.
    • NAMESPACE_NAME: o namespace do SecretForwarder.
    • TARGET_SECRET_NAME: o nome do novo Secret.
    • TARGET_NAMESPACE_NAME: os namespaces do novo Secret.
      • Crie seu secret no cluster em que o CDI é executado e no mesmo namespace que o volume de dados. O CDI é ativado automaticamente em um cluster que executa o ambiente de execução da VM no GDC.
    • SOURCE_SECRET_NAME: o nome do secret de origem a ser encaminhado.
    • SOURCE_NAMESPACE_NAME: o namespace do secret de origem a ser encaminhado.
  3. Salve e feche o manifesto SecretForwarder no seu editor.

  4. Aplique o manifesto SecretForwarder usando kubectl:

    kubectl apply -f my-forwarded-secret.yaml
    

Em clusters

O exemplo de manifesto SecretForwarder a seguir encaminha um secret entre os clusters:

apiVersion: baremetal.cluster.gke.io/v1
kind: SecretForwarder
metadata:
  name: cdi-gcs
  namespace: cluster-user1
spec:
  RemoteClusterTargetSecrets:
    name: gcs-sa
    namespaces:
    - default
  sourceSecret:
    name: gke-connect
    namespace: anthos-creds

Este exemplo faz o seguinte:

  • Cria um SecretForwarder chamado cdi-gcs no namespace cluster-user1.
  • Encaminha o secret chamado gke-connect no namespace anthos-creds para um novo secret chamado gcs-sa no namespace default.
  • Cria o novo secret no cluster chamado user1.

Para encaminhar um secret no mesmo cluster, siga estas etapas:

  1. Crie um manifesto SecretForwarder, como my-forwarded-secret.yaml, no editor de sua escolha:

    nano my-forwarded-secret.yaml
    
  2. Copie e cole o seguinte manifesto YAML:

    apiVersion: baremetal.cluster.gke.io/v1
    kind: SecretForwarder
    metadata:
      name: SECRET_FORWARDER_NAME
      namespace: NAMESPACE_NAME
    spec:
      RemoteClusterTargetSecrets:
        name: TARGET_SECRET_NAME
        namespaces:
        - TARGET_NAMESPACE_NAME
      sourceSecret:
        name: SOURCE_SECRET_NAME
        namespace: SOURCE_NAMESPACE_NAME
    

    Substitua os seguintes valores:

    • SECRET_FORWARDER_NAME: o nome do SecretForwarder no cluster remoto.
    • NAMESPACE_NAME: o namespace do SecretForwarder no cluster remoto.
    • TARGET_SECRET_NAME: o nome do novo Secret no cluster remoto.
    • TARGET_NAMESPACE_NAME: os namespaces do novo Secret no cluster remoto.
      • Crie seu secret no cluster em que o CDI é executado e no mesmo namespace que o volume de dados. O CDI é ativado automaticamente em um cluster que executa o ambiente de execução da VM no GDC.
    • SOURCE_SECRET_NAME: o nome do secret de origem a ser encaminhado.
    • SOURCE_NAMESPACE_NAME: o namespace do secret de origem a ser encaminhado.
  3. Salve e feche o manifesto SecretForwarder no seu editor.

  4. Aplique o manifesto SecretForwarder no cluster de administrador usando kubectl com o KUBECONFIG do cluster de administrador:

    kubectl apply -f my-forwarded-secret.yaml
    

Usar um secret para importar uma imagem

Para usar o secret para importar uma imagem do Cloud Storage ao criar um disco virtual e uma VM, siga estas etapas:

  1. Crie um manifesto que defina um VirtualMachineDisk e uma VirtualMachine, como my-vm.yaml, no editor que você escolher:

    nano my-vm.yaml
    
  2. Copie e cole a seguinte definição de YAML:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: VM_NAME-boot-dv
    spec:
      size: 20Gi
      source:
        gcs:
          url: IMAGE_URL
          secretRef: SECRET_NAME
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
    

    Substitua os seguintes valores:

    • VM_NAME: o nome da VM.
    • IMAGE_URL: o URL da imagem do disco do Cloud Storage, como gs://my-images-bucket/disk.qcow2.
    • SECRET_NAME: o nome do secret.
  3. Salve e feche o manifesto no editor.

  4. Crie a VM e o disco usando kubectl:

    kubectl apply -f my-vm.yaml
    

A seguir