Usar a Identidade da carga de trabalho com o Google Cloud

A Identidade da carga de trabalho permite atribuir identidades e autorizações detalhadas e distintas para cada aplicativo no cluster. A identidade da carga de trabalho é a maneira recomendada para aplicativos em execução no GKE na AWS acessarem os serviços do Google Cloud. Para mais informações, consulte Identidade da carga de trabalho.

Neste tópico, descrevemos como usar a identidade da carga de trabalho para se conectar aos serviços do Google Cloud a partir das suas cargas de trabalho.

Configurar uma conta de serviço do Google Cloud

Nesta seção, você cria uma conta de serviço do Google Cloud (GSA) com permissões limitadas para acessar os serviços do Google Cloud.

Acessar o pool de identidades e o provedor da carga de trabalho

Para configurar a identidade da carga de trabalho, você precisa ter os valores do URI do provedor de identidade e dos pools de identidade da carga de trabalho do cluster.

  1. Determinar o pool de identidade da carga de trabalho para o cluster:

    Todos os clusters do GKE têm um provedor de identidade criado no pool de identidade da carga de trabalho PROJECT_ID.svc.id.goog. Para saber o nome do pool de identidades do cluster, use a Google Cloud CLI:

    gcloud container aws clusters describe CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --format='value(workloadIdentityConfig.workloadPool)'
    

    Substitua:

    • CLUSTER_NAME pelo nome do cluster.
    • GOOGLE_CLOUD_LOCATION pelo nome do local do Google Cloud que gerencia o cluster.

    A saída inclui o nome do pool de identidades do cluster. Salve esse valor. Você precisará dele mais tarde.

  2. Determinar o provedor de identidade do cluster.

    Para encontrar o nome do provedor de identidade do cluster, use a Google Cloud CLI:

    gcloud container aws clusters describe CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --format='value(workloadIdentityConfig.identityProvider)'
    

    Substitua:

    • CLUSTER_NAME
    • GOOGLE_CLOUD_LOCATION

    A saída inclui o nome do pool de identidades do cluster. Salve esse valor. Você precisará dele mais tarde.

Criar uma conta de serviço do Google Cloud.

Para criar uma conta de serviço do Google Cloud (GSA), conceda permissões a ela e adicione uma vinculação de política do IAM ao GSA, siga estas etapas:

  1. Crie a GSA com a Google Cloud CLI:

    gcloud iam service-accounts create GSA_NAME --project=PROJECT_ID
    

    Substitua:

    • GSA_NAME: o nome do GSA para seu aplicativo.
    • PROJECT_ID: o projeto do Google Cloud da GSA.
  2. Adicione uma vinculação do IAM para permitir que a GSA acesse serviços.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role IAM_ROLE
    

    Substitua:

    • GSA_NAME: o nome do GSA para seu aplicativo
    • PROJECT_ID: o ID do projeto do GSA
    • IAM_ROLE: o papel do IAM a ser concedido ao GSA

    Neste exemplo, usaremos a função roles/compute.viewer, que permite acesso somente leitura a serviços de computação:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    
  3. Conceda permissões para que sua conta de serviço do Kubernetes (KSA) possa representar a GSA. Para fazer isso, adicione uma vinculação de política do IAM com o papel roles/iam.workloadIdentityUser:

    gcloud iam service-accounts add-iam-policy-binding GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --member serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE//KSA_NAME] \
        --role roles/iam.workloadIdentityUser
    

    Substitua:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE pelo namespace do Kubernetes do aplicativo
    • KSA_NAME: a KSA que será usada no aplicativo

Implantar um aplicativo de amostra

Nesta seção, você implanta um aplicativo de amostra que acessa a API Compute Engine. Para usar essa amostra, sua conta de serviço precisa ter o papel de IAM roles/compute.viewer. Para implantar o aplicativo de amostra, siga estas etapas:

  1. Copie o seguinte manifesto do YAML para um arquivo chamado workload-identity-sample.yaml:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: KSA_NAME
      namespace: NAMESPACE
    automountServiceAccountToken: false
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cloud-sdk-config
      namespace: NAMESPACE
    data:
      config: |
        {
          "type": "external_account",
          "audience": "identitynamespace:PROJECT_ID.svc.id.goog:IDENTITY_PROVIDER",
          "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/GSA_NAME@PROJECT_ID.iam.gserviceaccount.com:generateAccessToken",
          "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
          "token_url": "https://sts.googleapis.com/v1/token",
          "credential_source": {
            "file": "/var/run/secrets/tokens/gcp-ksa/token"
          }
        }
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: cloud-sdk-example
      namespace: NAMESPACE
    spec:
      serviceAccount: KSA_NAME
      containers:
      - name: cloud-sdk
        image: gcr.io/google.com/cloudsdktool/cloud-sdk:latest
        command:
        - /bin/bash
        - -c
        - 'set -eu -o pipefail; while true; do gcloud compute zones list --filter="name ~ us-central1-*"; sleep 5; done'
        env:
        - name: CLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE
          value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json
        - name: CLOUDSDK_CORE_PROJECT
          value: PROJECT_ID
        volumeMounts:
        - name: gcp-ksa
          mountPath: /var/run/secrets/tokens/gcp-ksa
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              audience: PROJECT_ID.svc.id.goog
              expirationSeconds: 86400
              path: token
          - configMap:
              name: cloud-sdk-config
              optional: false
              items:
              - key: config
                path: google-application-credentials.json
    

    Substitua:

    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
    • GSA_NAME
    • IDENTITY_PROVIDER pelo nome do provedor de identidade do cluster.
  2. Aplique o manifesto ao cluster.

    kubectl apply -f workload-identity-sample.yaml
    
  3. Verifique se o aplicativo de amostra está funcionando e verifique os registros do pod:

    kubectl logs -f cloud-sdk-example -n NAMESPACE
    

    Substitua:

    • NAMESPACE

    Se o pod conseguir acessar a API Google Cloud Compute, você verá uma saída semelhante a esta:

    NAME           REGION       STATUS  NEXT_MAINTENANCE  TURNDOWN_DATE
    us-central1-c  us-central1  UP
    us-central1-a  us-central1  UP
    us-central1-f  us-central1  UP
    us-central1-b  us-central1  UP
    

Limpar

  1. Excluir o aplicativo de amostra

    kubectl delete -f manifest.yaml
    
  2. Remover a vinculação da política do IAM da conta de serviço do Google Cloud

    gcloud iam service-accounts remove-iam-policy-binding \
        GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --member serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE//KSA_NAME] \
        roles/iam.workloadIdentityUser
    

    Substitua:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
  3. Remover a vinculação da política de IAM do projeto

    gcloud projects remove-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    

    Substitua:

    • GSA_NAME
    • PROJECT_ID
  4. Excluir a conta de serviço do Google Cloud

    gcloud iam service-accounts delete \
       GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    Substitua:

    • GSA_NAME
    • PROJECT_ID

A seguir