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.
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_NAMEpelo nome do cluster.GOOGLE_CLOUD_LOCATIONpelo 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.
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_NAMEGOOGLE_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 CloudPROJECT_NUMBER: o número do projeto do Google CloudNAMESPACE: o namespace do Kubernetes para o aplicativo.KUBERNETES_SERVICEACCOUNT: a conta de serviço do Kubernetes a ser usada para o aplicativoIAM_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:
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.jsonSubstitua:
PROJECT_IDNAMESPACEKUBERNETES_SERVICEACCOUNTIDENTITY_PROVIDERpelo nome do provedor de identidade do cluster.
Aplique o manifesto ao cluster.
kubectl apply -f workload-identity-sample.yamlVerifique se o aplicativo de amostra está funcionando e verifique os registros do pod:
kubectl logs -f cloud-sdk-example -n NAMESPACESubstitua:
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
Excluir o aplicativo de amostra
kubectl delete -f manifest.yamlRemover 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=NoneSubstitua:
PROJECT_IDPROJECT_NUMBERNAMESPACEKUBERNETES_SERVICEACCOUNT