Esta guía describe cómo configurar la identidad de la carga de trabajo en GKE en AWS para controlar el acceso de la carga de trabajo a los recursos de GCP. Incluye un ejemplo de cómo acceder. Google Cloud recursos de su clúster utilizando la identidad.
Para obtener información sobre el uso de identidades de carga de trabajo con cuentas de AWS IAM para controlar el acceso a los recursos de AWS, consulte Uso de identidad de carga de trabajo con AWS .
Descripción general
Usos de la identidad de la carga de trabajo Google Cloud Permisos de IAM para controlar el acceso aGoogle Cloud Recursos. Con la identidad de la carga de trabajo, puede asignar diferentes roles de IAM a cada carga de trabajo. Este control preciso de permisos le permite seguir el principio del mínimo privilegio . Sin la identidad de la carga de trabajo, debe asignar Google Cloud Funciones de IAM para sus nodos de GKE en AWS, lo que otorga a todas las cargas de trabajo en esos nodos los mismos permisos que el nodo mismo.
Prerrequisitos
Cree un clúster de usuarios con Kubernetes versión v1.20 o posterior.
Si su VPC de AWS utiliza un proxy o firewall, incluya en la lista de permitidos las siguientes URL:
-
securetoken.googleapis.com
-
iamcredentials.googleapis.com
-
sts.googleapis.com
-
Desde su directorio
anthos-aws
, useanthos-gke
para cambiar el contexto a su clúster de usuarios. Reemplace CLUSTER_NAME con el nombre de su clúster de usuarios.cd anthos-aws env HTTPS_PROXY=http://localhost:8118 \ anthos-gke aws clusters get-credentials CLUSTER_NAME
Habilite los cuatro nuevos servicios necesarios para esta función con los siguientes comandos:
gcloud services enable securetoken.googleapis.com gcloud services enable iam.googleapis.com gcloud services enable iamcredentials.googleapis.com gcloud services enable sts.googleapis.com
Componer los nombres de los proveedores y del pool de WI
Cada Google Cloud El proyecto crea automáticamente un grupo de identidades de carga de trabajo administrada con un nombre como PROJECT_ID.svc.id.goog
. De forma similar,Google Cloud Crea un proveedor de identidad cuyo nombre sigue el patrón https://gkehub.googleapis.com/projects/PROJECT_ID/locations/global/memberships/MEMBERSHIP_ID
. Para obtener más información sobre los grupos de identidades de carga de trabajo, consulte Componentes habilitados para Fleet . Cree estos nombres a partir del ID de proyecto y el ID de membresía, como se muestra a continuación:
export PROJECT_ID=USER_PROJECT_NAME export CLUSTER_MEMBERSHIP_ID=PROJECT_MEMBERSHIP_NAME export IDP="https://gkehub.googleapis.com/projects/${PROJECT_ID}/locations/global/memberships/${CLUSTER_MEMBERSHIP_ID}" export WI_POOL="${PROJECT_ID}.svc.id.goog"
Reemplace lo siguiente:
- USER_PROJECT_NAME con el nombre del proyecto de usuario elegido por el usuario
- PROJECT_MEMBERSHIP_NAME con el nombre de membresía del clúster
Crear un enlace de política de IAM
Cree un enlace de política para permitir que una cuenta de servicio de Kubernetes (KSA) se haga pasar por una Google Cloud cuenta de servicio (GSA).
export K8S_NAMESPACE=KUBERNETES_NAMESPACE export KSA_NAME=KUBERNETES_SA_NAME export GCP_SA_EMAIL="WORKLOAD_IDENTITY_TEST@${PROJECT_ID}.iam.gserviceaccount.com" gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$WI_POOL[$K8S_NAMESPACE/$KSA_NAME]" $GCP_SA_EMAIL
Reemplace lo siguiente:
- KUBERNETES_NAMESPACE con el espacio de nombres de Kubernetes donde se define la cuenta de servicio de Kubernetes
- WORKLOAD_IDENTITY_TEST con un nombre de carga de trabajo de su elección
- KUBERNETES_SA_NAME con el nombre de la cuenta de servicio de Kubernetes asociada a la aplicación
Crear un mapa de configuración del SDK
Ejecute el siguiente script de shell para almacenar la información de identidad de la carga de trabajo en un ConfigMap. Cuando un pod monta el ConfigMap, la CLI de Google Cloud puede leer la información de identidad de la carga de trabajo.
cat << EOF > cfmap.yaml kind: ConfigMap apiVersion: v1 metadata: namespace: ${K8S_NAMESPACE} name: my-cloudsdk-config data: config: | { "type": "external_account", "audience": "identitynamespace:${WI_POOL}:${IDP}", "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/${GCP_SA_EMAIL}: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" } } EOF env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f cfmap.yaml
Crear una cuenta de servicio de Kubernetes
Cree una KSA en su clúster de usuarios con el mismo nombre y espacio de nombres que se utilizó en el enlace de IAM.
cat << EOF > k8s-service-account.yaml apiVersion: v1 kind: ServiceAccount metadata: name: ${KSA_NAME} namespace: ${K8S_NAMESPACE} EOF env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f k8s-service-account.yaml
Crear un pod
A continuación, cree un Pod con la proyección del token de la cuenta de servicio y el ConfigMap creado anteriormente.
Cree el archivo yaml de muestra de Pod.
cat << EOF > sample-pod.yaml apiVersion: v1 kind: Pod metadata: name: sample-pod namespace: ${K8S_NAMESPACE} spec: serviceAccountName: ${KSA_NAME} containers: - command: - /bin/bash - -c - while :; do echo '.'; sleep 500 ; done image: google/cloud-sdk name: cloud-sdk env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json volumeMounts: - name: gcp-ksa mountPath: /var/run/secrets/tokens/gcp-ksa readOnly: true volumes: - name: gcp-ksa projected: defaultMode: 420 sources: - serviceAccountToken: path: token audience: ${WI_POOL} expirationSeconds: 172800 - configMap: name: my-cloudsdk-config optional: false items: - key: "config" path: "google-application-credentials.json" EOF
Aplique el YAML del Pod a su clúster.
env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f sample-pod.yaml
Usando Google Cloud identidad de la carga de trabajo
Versiones del SDK compatibles
Para utilizar el Google Cloud Función de identidad de carga de trabajo, debe compilar su código con un SDK compatible. Para obtener una lista de las versiones del SDK compatiblesGoogle Cloud Identidad de la carga de trabajo, consulte Identidad de la carga de trabajo de la flota .
Código de ejemplo que utiliza la identidad de la carga de trabajo
Esta sección incluye un ejemplo de código Python que utiliza Google Cloud Identidad de la carga de trabajo. La cuenta de servicio en este ejemplo usa una identidad con privilegios de "Administrador de almacenamiento en la nube" para enumerar todos los... Google Cloud depósitos de almacenamiento en la nube del proyecto.
Ejecutar un shell dentro del Pod.
env HTTPS_PROXY=http://localhost:8118 \ kubectl exec -it sample-pod -- bash
Ejecute un script para enumerar los depósitos de almacenamiento del proyecto.
# execute these commands inside the Pod pip install --upgrade google-cloud-storage cat << EOF > sample-list-bucket.py from google.cloud import storage storage_client = storage.Client() buckets = storage_client.list_buckets() for bucket in buckets: print(bucket.name) EOF env GOOGLE_CLOUD_PROJECT=USER_PROJECT_NAME \ python3 sample-list-bucket.py
Reemplace USER_PROJECT_NAME con su Google Cloud proyecto.
Para más información
- Identidad de la carga de trabajo de la flota
- Federación de identidades de carga de trabajo
- Acceder a recursos desde un proveedor de identidad OIDC (los clústeres de Kubernetes son proveedores de identidad OIDC)
- Uso de la identidad de la carga de trabajo con AWS