Workload Identity te permite asignar identidades distintas y detalladas, así como autorizaciones, a cada aplicación de tu clúster. Workload Identity es la forma recomendada de que las aplicaciones que se ejecutan en GKE en AWS accedan a los servicios de AWS y Google Cloud . Para obtener más información, consulta Workload Identity.
En este tema se explica cómo crear un proveedor de OIDC, aprovisionar cuentas de servicio y probar una carga de trabajo de ejemplo mediante Workload Identity. Esta página está dirigida a administradores de identidades y cuentas, operadores y desarrolladores que quieran crear y gestionar políticas relacionadas con los permisos de los usuarios. Para obtener más información sobre los roles habituales y las tareas de ejemplo a las que hacemos referencia en el contenido, consulta Roles y tareas habituales de los usuarios de GKE. Google Cloud
Crear un proveedor de OIDC de gestión de identidades y accesos de AWS para tu clúster
Para usar Workload Identity con tu clúster, primero debes crear un proveedor de OIDC de AWS IAM que haga referencia a tu clúster. Si ya tienes un proveedor de OIDC de IAM para tu clúster, puedes saltarte esta sección.
Para crear el proveedor, siga estos pasos:
Determina el URI de la entidad emisora de OIDC de tu clúster:
gcloud container aws clusters describe CLUSTER_NAME \ --location=GOOGLE_CLOUD_LOCATION \ --format='value(workloadIdentityConfig.issuerUri)'
Haz los cambios siguientes:
CLUSTER_NAME
: el nombre de tu clústerGOOGLE_CLOUD_LOCATION
: el nombre de la Google Cloud ubicación desde la que se gestionará este grupo de nodos, tal como se define en las Google Cloud regiones de gestión
El resultado incluye el URI del emisor de OIDC de tu clúster. Guarda este valor para el siguiente paso.
A continuación, crea un proveedor de OIDC de AWS IAM que haga referencia a tu clúster con el siguiente comando:
aws iam create-open-id-connect-provider \ --url ISSUER_URI \ --client-id-list sts.amazonaws.com \ --thumbprint-list 08745487e891c19e3078c1f2a07e452950ef36f6
Sustituye
ISSUER_URI
por el URI de emisor del paso anterior.La huella digital del servicio que proporciona el URI de la entidad emisora es siempre
08745487e891c19e3078c1f2a07e452950ef36f6
. Google Cloud
Configurar un rol de gestión de identidades y accesos de AWS con una política de gestión de identidades y accesos adjunta
Para configurar un rol de gestión de identidades y accesos de AWS y adjuntarle una política, sigue estos pasos:
Determina el host de la entidad emisora quitando el prefijo
https://
del URI de la entidad emisora. Por ejemplo, si tu URI eshttps://oidc-provider.com/v1/projects/pid/locations/us-west1/awsClusters/awscluster
, el host esoidc-provider.com/v1/projects/pid/locations/us-west1/awsClusters/awscluster
. Guarda este valor. Lo necesitarás más tarde.Para determinar el nombre de recurso de Amazon (ARN) del proveedor, ejecuta el siguiente comando:
aws iam list-open-id-connect-providers --output=text \ --query 'OpenIDConnectProviderList[?ends_with(Arn, `ISSUER_HOST`) == `true`].Arn'
Sustituye
ISSUER_HOST
por el nombre de host del URI del emisor del clúster.A continuación, crea una política de confianza para proporcionar credenciales de OIDC a la cuenta de servicio de Kubernetes. Crea un archivo llamado
trust-policy.json
con el siguiente contenido:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "PROVIDER_ARN" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "ISSUER_HOST:sub": "system:serviceaccount:NAMESPACE:KSA_NAME" } } } ] }
Haz los cambios siguientes:
PROVIDER_ARN
: el ARN del proveedor de OIDC de IAM del clústerISSUER_HOST
: el nombre de host del URI del emisor del clúster.NAMESPACE
: el espacio de nombres de Kubernetes donde se ejecuta la aplicaciónKSA_NAME
: la cuenta de servicio de Kubernetes (KSA) que se va a usar en la aplicación
Crea un rol de gestión de identidades y accesos de AWS:
aws iam create-role --role-name=AWS_ROLE_NAME \ --assume-role-policy-document file://trust-policy.json
Sustituye
AWS_ROLE_NAME
por el nombre del rol de gestión de identidades y accesos de AWS de la aplicación.Asigna una política de gestión de identidades y accesos de AWS al rol:
aws iam attach-role-policy --role-name=AWS_ROLE_NAME \ --policy-arn=AWS_POLICY_ARN
Haz los cambios siguientes:
-
AWS_ROLE_NAME
: el nombre del rol de AWS IAM de la aplicación
Por ejemplo, para crear un rol llamado
ec2-readonly
con la políticaarn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
, ejecuta el siguiente comando:aws iam attach-role-policy --role-name=ec2-readonly \ --policy-arn=arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
-
Desplegar una aplicación de ejemplo
Para probar la identidad de carga de trabajo, sigue estos pasos para implementar una aplicación de ejemplo:
Determina el ARN del rol:
aws iam get-role --role-name=AWS_ROLE_NAME --query 'Role.Arn'
Reemplazar
AWS_ROLE_NAME
.Crea un manifiesto para un espacio de nombres, una KSA y un pod de Kubernetes. Copia el siguiente manifiesto en un archivo llamado
workload-identity-test.yaml
:apiVersion: v1 kind: Namespace metadata: name: NAMESPACE --- apiVersion: v1 kind: ServiceAccount metadata: name: KSA_NAME namespace: NAMESPACE automountServiceAccountToken: false --- apiVersion: v1 kind: Pod metadata: name: aws-cli-example namespace: NAMESPACE spec: serviceAccount: KSA_NAME containers: - name: aws-cli image: amazon/aws-cli:latest command: - /bin/bash - -c - "set -eu -o pipefail; while true; do aws ec2 describe-availability-zones; sleep 5; done" env: - name: AWS_ROLE_ARN value: AWS_ROLE_ARN - name: AWS_WEB_IDENTITY_TOKEN_FILE value: /var/run/secrets/aws-iam-token/serviceaccount/token - name: AWS_REGION value: AWS_REGION volumeMounts: - mountPath: /var/run/secrets/aws-iam-token/serviceaccount name: aws-iam-token readOnly: true volumes: - name: aws-iam-token projected: defaultMode: 420 sources: - serviceAccountToken: audience: sts.amazonaws.com expirationSeconds: 86400 path: token
Haz los cambios siguientes:
NAMESPACE
KSA_NAME
AWS_ROLE_ARN
: el ARN del rol de gestión de identidades y accesos de AWS de la aplicaciónAWS_REGION
: la región de AWS del clúster
Aplica el archivo de manifiesto:
kubectl apply -f workload-identity-test.yaml
Espera varios minutos a que se inicie el Pod y ve a la siguiente sección.
Verificar que la aplicación de ejemplo funciona
Para verificar que la aplicación de ejemplo puede acceder a la API de EC2, consulta los registros del pod:
kubectl logs -f aws-cli-example -n NAMESPACE
Si el pod puede acceder a la API de EC2, el resultado incluye información sobre las zonas de disponibilidad de EC2 y tiene un aspecto similar al siguiente:
-------------------------------------------------
| DescribeAvailabilityZones |
+-----------------------------------------------+
|| AvailabilityZones ||
|+---------------------+-----------------------+|
|| GroupName | us-west-2 ||
|| NetworkBorderGroup | us-west-2 ||
|| OptInStatus | opt-in-not-required ||
|| RegionName | us-west-2 ||
|| State | available ||
|| ZoneId | usw2-az1 ||
|| ZoneName | us-west-2a ||
|+---------------------+-----------------------+|
|| AvailabilityZones ||
|+---------------------+-----------------------+|
|| GroupName | us-west-2 ||
|| NetworkBorderGroup | us-west-2 ||
|| OptInStatus | opt-in-not-required ||
|| RegionName | us-west-2 ||
|| State | available ||
|| ZoneId | usw2-az2 ||
|| ZoneName | us-west-2b ||
|+---------------------+-----------------------+|
|| AvailabilityZones ||
|+---------------------+-----------------------+|
|| GroupName | us-west-2 ||
|| NetworkBorderGroup | us-west-2 ||
|| OptInStatus | opt-in-not-required ||
|| RegionName | us-west-2 ||
|| State | available ||
|| ZoneId | usw2-az3 ||
|| ZoneName | us-west-2c ||
|+---------------------+-----------------------+|
|| AvailabilityZones ||
|+---------------------+-----------------------+|
|| GroupName | us-west-2 ||
|| NetworkBorderGroup | us-west-2 ||
|| OptInStatus | opt-in-not-required ||
|| RegionName | us-west-2 ||
|| State | available ||
|| ZoneId | usw2-az4 ||
|| ZoneName | us-west-2d ||
|+---------------------+-----------------------+|
Limpieza
Para eliminar esta aplicación de ejemplo, sigue estos pasos:
Elimina el manifiesto de la aplicación de ejemplo de tu clúster:
kubectl delete -f workload-identity-test.yaml
Desvincula la política de gestión de identidades y accesos de AWS del rol:
aws iam detach-role-policy --role-name AWS_ROLE_NAME \ --policy-arn arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
Sustituye
AWS_ROLE_NAME
por el nombre del rol de gestión de identidades y accesos de AWS de la aplicación.Elimina el rol de gestión de identidades y accesos de AWS:
aws iam delete-role --role-name AWS_ROLE_NAME
Sustituye
AWS_ROLE_NAME
por el nombre del rol de gestión de identidades y accesos de AWS de la aplicación.Elimina el proveedor de OIDC de AWS IAM:
aws iam delete-open-id-connect-provider --open-id-connect-provider-arn PROVIDER_ARN
Sustituye
PROVIDER_ARN
por el ARN del proveedor de OIDC de IAM del clúster.
Siguientes pasos
- Consulta información sobre cómo usar Workload Identity con los servicios de Google Cloud.