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.
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 o cluster.
A saída inclui o nome do pool de identidades do cluster. Salve esse valor. Você precisará dele mais tarde.
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:
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.
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 aplicativoPROJECT_ID
: o ID do projeto do GSAIAM_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
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 aplicativoKSA_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:
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.
Aplique o manifesto ao cluster.
kubectl apply -f workload-identity-sample.yaml
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
Como fazer a limpeza
Excluir o aplicativo de amostra
kubectl delete -f manifest.yaml
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
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
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