A identidade de carga de trabalho permite-lhe atribuir identidades distintas e detalhadas, bem como autorização, a cada aplicação no seu cluster. O Workload Identity é a forma recomendada para as aplicações em execução no GKE no AWS acederem aos serviçosGoogle Cloud . Para mais informações, consulte o artigo Identidade da carga de trabalho.
Este tópico descreve como usar o Workload Identity para se ligar aos serviçosGoogle Cloud a partir das suas cargas de trabalho.
Configure uma Google Cloud conta de serviço
Nesta secção, cria uma Google Cloud conta de serviço (GSA) com autorizações limitadas para aceder aos Google Cloud serviços.
Obtenha o Workload Identity Pool e o fornecedor
Para configurar a identidade da carga de trabalho, tem de ter os valores do URI do fornecedor de identidade do cluster e dos Workload Identity Pools.
Determine o Workload Identity Pool para o seu cluster:
Todos os clusters do GKE têm um fornecedor de identidade criado no Workload Identity Pool
PROJECT_ID.svc.id.goog
. Para obter o nome do conjunto 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 o seguinte:
CLUSTER_NAME
com o nome do seu cluster.GOOGLE_CLOUD_LOCATION
com o nome da Google Cloud localização que gere o seu cluster
O resultado inclui o nome do pool de identidades do cluster. Guarde este valor. Vai precisar dele mais tarde.
Determine o Fornecedor de identidade para o seu cluster.
Para encontrar o nome do fornecedor de identidade do seu cluster, use a CLI Google Cloud:
gcloud container aws clusters describe CLUSTER_NAME \ --location=GOOGLE_CLOUD_LOCATION \ --format='value(workloadIdentityConfig.identityProvider)'
Substitua o seguinte:
CLUSTER_NAME
GOOGLE_CLOUD_LOCATION
O resultado inclui o nome do fornecedor de identidade do seu cluster. Guarde este valor. Vai precisar dele mais tarde.
Crie uma Google Cloud conta de serviço
Para criar uma Google Cloud conta de serviço (GSA), conceder-lhe autorizações e adicionar uma associação de política de IAM à GSA, siga estes passos:
Crie o GSA com a CLI Google Cloud:
gcloud iam service-accounts create GSA_NAME --project=PROJECT_ID
Substitua o seguinte:
GSA_NAME
: o nome do GSA para a sua aplicação.PROJECT_ID
: o projeto da Google Cloud GSA.
Adicione uma associação do IAM para permitir que o GSA aceda aos 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 a sua aplicaçãoPROJECT_ID
: o ID do projeto para o GSAIAM_ROLE
: a função de IAM a conceder à GSA
Neste exemplo, vamos usar a função
roles/compute.viewer
, que permite o acesso só de 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
Conceda autorizações à sua conta de serviço do Kubernetes (KSA) para se fazer passar pela GSA. Para o fazer, adicione uma associação de políticas 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 a aplicaçãoKSA_NAME
: a KSA a usar para a aplicação
Implemente uma aplicação de exemplo
Nesta secção, implementa uma aplicação de exemplo que acede à API Compute Engine. Para usar este exemplo, a sua conta de serviço tem de ter a função de roles/compute.viewer
IAM concedida. Para implementar a aplicação de exemplo, siga estes passos:
Copie o seguinte manifesto para um ficheiro com o nome
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
com o nome do Fornecedor de identidade do seu cluster.
Aplique o manifesto ao cluster
kubectl apply -f workload-identity-sample.yaml
Verifique se a aplicação de exemplo está a funcionar e consulte os registos do pod:
kubectl logs -f cloud-sdk-example -n NAMESPACE
Substitua o seguinte:
NAMESPACE
Se o Pod conseguir aceder à API Google Cloud Compute, verá um resultado semelhante ao seguinte:
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
Elimine a aplicação de exemplo
kubectl delete -f manifest.yaml
Remova a associação da política IAM da conta de serviço da 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
Remova a vinculação da política 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
Elimine 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