Use a identidade da carga de trabalho com Google Cloud

A identidade da carga de trabalho permite que você atribua identidades e autorizações distintas e granulares para cada aplicativo em seu cluster. A identidade da carga de trabalho é a maneira recomendada para aplicativos em execução no GKE na AWS acessaremGoogle Cloud serviços. Para obter mais informações, consulte Identidade da carga de trabalho .

Este tópico descreve como usar a identidade da carga de trabalho para se conectar aGoogle Cloud serviços de suas cargas de trabalho.

Configurar um Google Cloud conta de serviço

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

Obtenha seu pool de identidade de carga de trabalho e provedor

Para configurar a identidade da carga de trabalho, você deve ter os valores para o URI do provedor de identidade e os pools de identidade da carga de trabalho do seu cluster.

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

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

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

    Substitua o seguinte:

    • CLUSTER_NAME pelo nome do seu cluster.
    • GOOGLE_CLOUD_LOCATION com o nome do Google Cloudlocal que gerencia seu cluster

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

  2. Determine o provedor de identidade para seu cluster.

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

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

    Substitua o seguinte:

    • CLUSTER_NAME
    • GOOGLE_CLOUD_LOCATION

    A saída inclui o nome do provedor de identidade do seu cluster. Salve este valor. Você precisará dele mais tarde.

Criar um Google Cloud conta de serviço

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

  1. Crie o GSA com o Google Cloud CLI:

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

    Substitua o seguinte:

    • GSA_NAME : o nome do GSA para sua aplicação.
    • PROJECT_ID : o GSA Google Cloud projeto.
  2. Adicione uma ligação IAM para permitir que o 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 o seguinte:

    • GSA_NAME : o nome do GSA para sua aplicação
    • PROJECT_ID : o ID do projeto para o GSA
    • IAM_ROLE : a função IAM a ser concedida ao GSA

    Neste exemplo, usaremos a função roles/compute.viewer , que permite acesso somente leitura aos 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) represente o GSA. Para isso, adicione uma vinculação de política do IAM com a função 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 o seguinte:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE : o namespace do Kubernetes para o aplicativo
    • KSA_NAME : o KSA a ser usado para o aplicativo

Implantar um aplicativo de amostra

Nesta seção, você implantará um aplicativo de exemplo que acessa a API do Compute Engine. Para usar este exemplo, sua conta de serviço precisa ter a função do IAM roles/compute.viewer concedida. Para implantar o aplicativo de exemplo, siga estas etapas:

  1. Copie o seguinte manifesto em 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 o seguinte:

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

    kubectl apply -f workload-identity-sample.yaml
    
  3. Verifique se o aplicativo de exemplo está funcionando, verifique os logs do Pod:

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

    Substitua o seguinte:

    • NAMESPACE

    Se o Pod conseguir acessar a API de computação do Google Cloud, 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
    

Limpeza

  1. Excluir o aplicativo de exemplo

    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 o seguinte:

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
  3. Remover a vinculação da política do 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 o seguinte:

    • 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 o seguinte:

    • GSA_NAME
    • PROJECT_ID

O que vem a seguir