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 doGoogle 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 doGoogle Cloud nas suas cargas de trabalho.

Configurar as permissões de IAM

Nesta seção, você concede a uma ServiceAccount do Kubernetes permissões para acessar serviços doGoogle Cloud ao atribuir papéis do IAM a ela.

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

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 da 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 seu 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.

Conceder papéis do IAM à sua conta de serviço do Kubernetes

Conceda o papel do IAM no projeto à ServiceAccount do Kubernetes:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \
    --role=IAM_ROLE \
    --condition=None

Substitua:

  • PROJECT_ID: o ID do projeto do Google Cloud
  • PROJECT_NUMBER: o número do projeto do Google Cloud
  • NAMESPACE: o namespace do Kubernetes para o aplicativo.
  • KUBERNETES_SERVICEACCOUNT: a conta de serviço do Kubernetes a ser usada para o aplicativo
  • IAM_ROLE: o papel do IAM a ser concedido à conta de serviço do Kubernetes

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="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \
    --role=roles/compute.viewer \
    --condition=None

Implantar um aplicativo de amostra

Nesta seção, você implanta um aplicativo de amostra que acessa a API Compute Engine. Para usar este exemplo, sua ServiceAccount do Kubernetes precisa ter o papel do IAM roles/compute.viewer concedido a ela. 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: KUBERNETES_SERVICEACCOUNT
      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",
          "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: KUBERNETES_SERVICEACCOUNT
      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
    • KUBERNETES_SERVICEACCOUNT
    • 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 de computação do Google Cloud, você vai 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
    

Como fazer a limpeza

  1. Excluir o aplicativo de amostra

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

    gcloud projects remove-iam-policy-binding PROJECT_ID \
        --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \
        --role=roles/compute.viewer \
        --condition=None
    

    Substitua:

    • PROJECT_ID
    • PROJECT_NUMBER
    • NAMESPACE
    • KUBERNETES_SERVICEACCOUNT

A seguir