Habilitar Workload Identity con apigeectl

En este tema se explica cómo habilitar Workload Identity para Apigee hybrid mediante apigeectl.

Si usas gráficos de Helm para instalar y gestionar Apigee hybrid, consulta Habilitar Workload Identity con gráficos de Helm.

Información general

Workload Identity es una forma de que las aplicaciones que se ejecutan en GKE (Google Kubernetes Engine) accedan a los servicios de Google Cloud. Para ver información general sobre Workload Identity, consulta los siguientes artículos:

Una cuenta de servicio de gestión de identidades y accesos (IAM) de Google Cloud es una identidad que puede usar una aplicación para enviar solicitudes a las APIs de Google. En el documento, estas cuentas de servicio se denominan "cuentas de servicio de Google" (GSA). Para obtener más información sobre las cuentas de servicio, consulta el artículo Cuentas de servicio.

Por otra parte, Kubernetes también tiene el concepto de cuentas de servicio. Una cuenta de servicio proporciona una identidad a los procesos que se ejecutan en un pod. Las cuentas de servicio de Kubernetes son recursos de Kubernetes, mientras que las cuentas de servicio de Google son específicas de Google Cloud. Para obtener información sobre las cuentas de servicio de Kubernetes, consulta el artículo Configurar cuentas de servicio para pods de la documentación de Kubernetes.

En Apigee hybrid 1.4 y versiones posteriores, Apigee crea y usa una cuenta de servicio de Kubernetes para cada tipo de componente. Habilitar Workload Identity permite que los componentes híbridos interactúen con las cuentas de servicio de Kubernetes.

Cuentas de servicio de Google en Apigee Hybrid sin Workload Identity

Si no usas Workload Identity, debes vincular las cuentas de servicio de Google a cada componente del archivo overrides.yaml con una referencia a un archivo de certificado o a un secreto de Kubernetes. Por ejemplo:

Variables de entorno usadas en estos procedimientos

En estos procedimientos se usan las siguientes variables de entorno. Puedes definir estos valores en tu shell de comandos o sustituirlos por los valores reales en los ejemplos de código:

  • APIGEECTL_HOME: el directorio en el que has instalado apigeectl.
  • CLUSTER_LOCATION: la región o zona de tu clúster. Por ejemplo, us-west1.
  • ENV_NAME: nombre del entorno de Apigee.
  • HYBRID_FILES: tu directorio de archivos híbrido. Por ejemplo, hybrid-base-directory/hybrid-files.
  • ORG_NAME: el nombre de tu organización de Apigee.
  • PROJECT_ID: el ID de tu proyecto de Google Cloud.
  • NAMESPACE: tu espacio de nombres de Apigee (normalmente, "apigee").

Verifica las variables de entorno:

echo $PROJECT_ID
echo $ORG_NAME
echo $ENV_NAME
echo $NAMESPACE
echo $CLUSTER_LOCATION
echo $APIGEECTL_HOME
echo $HYBRID_FILES

Inicializa las variables que necesites:

export PROJECT_ID=my-project-id
export ORG_NAME=$PROJECT_ID
export ENV_NAME=my-environment-name
export NAMESPACE=apigee
export CLUSTER_LOCATION=my-cluster-location
export APIGEECTL_HOME=hybrid-base-directory/apigeectl
export HYBRID_FILES=hybrid-base-directory/hybrid-files

Workload Identity y archivos de claves de cuentas de servicio

Cuando se ejecuta Apigee hybrid en GKE, lo habitual es crear y descargar claves privadas (archivos .json) para cada una de las cuentas de servicio. Cuando se usa Workload Identity, no es necesario descargar claves privadas de cuentas de servicio ni añadirlas a los clústeres de GKE.

Si has descargado archivos de claves de cuentas de servicio como parte de la instalación de Apigee hybrid, puedes eliminarlos después de habilitar Workload Identity. En la mayoría de las instalaciones, se encuentran en el directorio hybrid-base-directory/hybrid-files/service-accounts/.

Habilitar Workload Identity en Apigee hybrid

Para empezar, sigue las instrucciones de Preparar la habilitación de Workload Identity para actualizar los grupos de nodos e inicializar las variables antes de habilitar Workload Identity.

A continuación, sigue las instrucciones de Configurar workloadIdentityEnabled: true y crear cuentas de servicio para habilitar Workload Identity en tu instalación de Apigee hybrid.

Preparar la habilitación de Workload Identity

Antes de iniciar el proceso de instalación, sigue los pasos que se indican en esta sección.

  1. Selecciona el proyecto que vas a modificar:
    gcloud config set project $PROJECT_ID
  2. Obtén las credenciales gcloud del clúster en el que vas a habilitar Workload Identity con el siguiente comando:
    gcloud container clusters get-credentials ${CLUSTER_NAME} \
      --region ${CLUSTER_LOCATION} \
      --project ${PROJECT_ID}
  3. Verifica que Workload Identity esté habilitado en el clúster de GKE que ejecuta Apigee con el siguiente comando:
    gcloud container clusters describe $CLUSTER_NAME --region $CLUSTER_LOCATION --project $PROJECT_ID

    El resultado debería incluir algo parecido a lo siguiente:

    
      
      status: RUNNING
      subnetwork: default
      workloadIdentityConfig:
        workloadPool: my-project-id.svc.id.goog

    Si es necesario, habilita Workload Identity en el clúster. Esta operación puede tardar hasta 30 minutos:

      gcloud container clusters update $CLUSTER_NAME \
      --workload-pool=$PROJECT_ID.svc.id.goog \
      --project $PROJECT_ID \
      --region $CLUSTER_LOCATION

    Para obtener más información, consulta Habilitar Workload Identity.

  4. Comprueba que Workload Identity esté habilitado en cada grupo de nodos.
    1. Consulta tus grupos de nodos con el siguiente comando:
      gcloud container node-pools list \
        --cluster $CLUSTER_NAME \
        --region $CLUSTER_LOCATION \
        --project $PROJECT_ID

      La salida debería tener un aspecto similar a este:

        NAME            MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
        apigee-runtime  e2-standard-4  100           1.23.12-gke.100
        apigee-data     e2-standard-4  100           1.23.12-gke.100
    2. Asegúrate de que Workload Identity esté habilitado en cada grupo de nodos mediante el siguiente comando:
      gcloud container node-pools update NODE_POOL_NAME \
        --cluster=$CLUSTER_NAME \
        --region $CLUSTER_LOCATION \
        --project $PROJECT_ID \
        --workload-metadata=GKE_METADATA

      Donde NODE_POOL_NAME es el nombre de cada grupo de nodos.

Verificar o crear cuentas de servicio de Google

Las cuentas de servicio de Google se crean para muchos componentes de Apigee hybrid durante la instalación. Sigue este procedimiento para verificar las cuentas de servicio de Google y crear las que necesites.

  1. Consulta los nombres de las cuentas de servicio de Google de tu proyecto con el siguiente comando:
    gcloud iam service-accounts list --project $PROJECT_ID

    La salida debería tener un aspecto similar a este:

    Producción

    En entornos que no sean de producción:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-cassandra     apigee-cassandra@my_project_id.iam.gserviceaccount.com     False
    apigee-logger        apigee-logger@my_project_id.iam.gserviceaccount.com        False
    apigee-mart          apigee-mart@my_project_id.iam.gserviceaccount.com          False
    apigee-metrics       apigee-metrics@my_project_id.iam.gserviceaccount.com       False
    apigee-runtime       apigee-runtime@my_project_id.iam.gserviceaccount.com       False
    apigee-synchronizer  apigee-synchronizer@my_project_id.iam.gserviceaccount.com  False
    apigee-udca          apigee-udca@my_project_id.iam.gserviceaccount.com          False
    apigee-watcher       apigee-watcher@my_project_id.iam.gserviceaccount.com       False
    

    No producción

    En entornos que no sean de producción:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-non-prod      apigee-non-prod@my_project_id.iam.gserviceaccount.com      False
    

    Si necesitas crear las cuentas de servicio de Google para tu proyecto, puedes usar dos métodos:

    • Usa la herramienta create-service-account incluida con apigee en el directorio apigeectl/tools/. Esta herramienta puede crear todas las cuentas de servicio con un solo comando o permitirte crearlas individualmente.
    • Usa el comando gcloud iam service-accounts create para crear las cuentas de servicio una a una y el comando gcloud projects add-iam-policy-binding para asignar los roles adecuados a cada cuenta de servicio. Con este método, debe crear cada cuenta de servicio individualmente, pero no tiene que descargar los archivos de claves.

    create-service-account

    Usa el siguiente comando para crear una cuenta de servicio de Google por componente:

    Producción

    En entornos que no sean de producción:

    $APIGEECTL_HOME/tools/create-service-account --env prod --dir $APIGEECTL_HOME/../service-accounts

    Este comando creará las siguientes cuentas de servicio:

    • apigee-cassandra
    • apigee-logger
    • apigee-mart
    • apigee-metrics
    • apigee-runtime
    • apigee-synchronizer
    • apigee-udca
    • apigee-watcher

    No producción

    En entornos que no sean de producción:

    $APIGEECTL_HOME/tools/create-service-account --env non-prod --dir $APIGEECTL_HOME/../service-accounts

    Este comando creará una sola cuenta de servicio, apigee-non-prod, con todos los roles asignados necesarios para gestionar todos los componentes de Apigee.

    gcloud

    Crea las siguientes cuentas de servicio y asígnales roles.

    1. Cuenta de servicio: apigee-cassandra, rol: roles/storage.objectAdmin

      Crea la cuenta:

      gcloud iam service-accounts create apigee-cassandra \
        --display-name="apigee-cassandra" \
        --project $PROJECT_ID
                  

      Asigna el rol:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-cassandra@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/storage.objectAdmin"
                  
    2. Cuenta de servicio: apigee-logger, rol: roles/logging.logWriter

      Crea la cuenta:

      gcloud iam service-accounts create apigee-logger \
        --display-name="apigee-logger" \
        --project $PROJECT_ID
                  

      Asigna el rol:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-logger@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/logging.logWriter"
                  
    3. Cuenta de servicio: apigee-mart, rol: roles/apigeeconnect.Agent

      Crea la cuenta:

      gcloud iam service-accounts create apigee-mart \
        --display-name="apigee-mart" \
        --project $PROJECT_ID
                  

      Asigna el rol:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-mart@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigeeconnect.Agent"
                  
    4. Cuenta de servicio: apigee-metrics, rol: roles/monitoring.metricWriter

      Crea la cuenta:

      gcloud iam service-accounts create apigee-metrics \
        --display-name="apigee-metrics" \
        --project $PROJECT_ID
                  

      Asigna el rol:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-metrics@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/monitoring.metricWriter"
                  
    5. Cuenta de servicio: apigee-runtime, rol: Ningún rol asignado.

      Crea la cuenta:

      gcloud iam service-accounts create apigee-runtime \
        --display-name="apigee-runtime" \
        --project $PROJECT_ID
                  
    6. Cuenta de servicio: apigee-synchronizer, rol: roles/apigee.synchronizerManager

      Crea la cuenta:

      gcloud iam service-accounts create apigee-synchronizer \
        --display-name="apigee-synchronizer" \
        --project $PROJECT_ID
                  

      Asigna el rol:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-synchronizer@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigee.synchronizerManager"
                  
    7. Cuenta de servicio: apigee-udca, rol: roles/apigee.analyticsAgent

      Crea la cuenta:

      gcloud iam service-accounts create apigee-udca \
        --display-name="apigee-udca" \
        --project $PROJECT_ID
                  

      Asigna el rol:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-udca@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigee.analyticsAgent"
                  
    8. Cuenta de servicio: apigee-watcher, rol: roles/apigee.runtimeAgent

      Crea la cuenta:

      gcloud iam service-accounts create apigee-watcher \
        --display-name="apigee-watcher" \
        --project $PROJECT_ID
                  

      Asigna el rol:

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-watcher@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigee.runtimeAgent"
                  

Definir workloadIdentityEnabled: true y crear cuentas de servicio

apigeectl crea cuentas de servicio de Kubernetes para cada componente de Apigee hybrid cuando defines workloadIdentityEnabled: true en tu archivo de anulaciones y aplicas los cambios.

  1. Añade la línea en negrita que aparece a continuación al archivo overrides.yaml, en la estrofa gcp. De esta forma, se habilita Workload Identity en tu instalación y se activa apigeectl para crear las cuentas de servicio de Kubernetes cuando apliques la configuración:
    gcp:
      projectID: "my-project-id"
      name: "my-project-id"
      region: "analytics-region"
      workloadIdentityEnabled: true
  2. Añade las líneas en negrita que se muestran a continuación al archivo overrides.yaml, en la estrofa cassandra. De esta forma, se crea la cuenta de servicio de Kubernetes:apigee-cassandra-backup
    cassandra:
      ...
      backup:
        enabled: true
  3. Aplica los cambios con apigeectl con la marca --restore:
    $APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml --restore
  4. Verifica las cuentas de servicio con el siguiente comando:
    kubectl get sa -n $NAMESPACE

    La salida debería tener un aspecto similar al siguiente. Las cuentas de servicio de Kubernetes en negrita son las que tendrás que anotar con tus cuentas de servicio de Google:

    NAME                                                         SECRETS   AGE
    apigee-cassandra-backup                                      1         11m
    apigee-cassandra-restore                                     1         11m
    apigee-cassandra-schema-setup-my-project-id-123abcd-sa       1         11m
    apigee-cassandra-schema-val-my-project-id-123abcd            1         11m
    apigee-cassandra-user-setup-my-project-id-123abcd-sa         1         11m
    apigee-connect-agent-my-project-id-123abcd-sa                1         11m
    apigee-datastore-default-sa                                  1         11m
    apigee-ingressgateway                                        1         11m
    apigee-ingressgateway-my-project-id-123abcd                  1         11m
    apigee-ingressgateway-manager                                1         11m
    apigee-init                                                  1         11m
    apigee-mart-my-project-id-123abcd-sa                         1         11m
    apigee-metrics-sa                                            1         11m
    apigee-mint-task-scheduler-my-project-id-123abcd-sa          1         11m
    apigee-redis-default-sa                                      1         11m
    apigee-redis-envoy-default-sa                                1         11m
    apigee-runtime-my-project-id-env-name-234bcde-sa             1         11m
    apigee-synchronizer-my-project-id-env-name-234bcde-sa        1         11m
    apigee-udca-my-project-id-123abcd-sa                         1         11m
    apigee-udca-my-project-id-env-name-234bcde-sa                1         11m
    apigee-watcher-my-project-id-123abcd-sa                      1         11m
    default                                                      1         11m
        

Anotar las cuentas de servicio de Kubernetes con las cuentas de servicio de Google

En cada componente de Apigee, anota las cuentas de servicio de Kubernetes correspondientes con la cuenta de servicio de Google del componente.

Componentes a nivel de organización

Solo tendrás una instancia de cada cuenta de servicio de Kubernetes para tu organización de Apigee.

Componente Cuenta de servicio de Kubernetes Cuenta de servicio de Google
Cassandra apigee-cassandra-backup apigee-cassandra
apigee-cassandra-restore apigee-cassandra
apigee-cassandra-schema-setup-my-project-id-num-id1-sa apigee-cassandra
apigee-cassandra-schema-val-my-project-id-num-id1 apigee-cassandra
apigee-cassandra-user-setup-my-project-id-num-id1-sa apigee-cassandra
apigee-datastore-default-sa apigee-cassandra
Apigee Connect apigee-connect-agent-my-project-id-num-id1-sa apigee-mart
MART apigee-mart-my-project-id-num-id1-sa apigee-mart
Métricas apigee-metrics-sa apigee-metrics
UDCA (nivel de organización) apigee-udca-my-project-id-num-id1-sa apigee-udca
Watcher apigee-watcher-my-project-id-num-id1-sa apigee-watcher

Componentes a nivel de entorno

Tendrás una instancia de cada cuenta de servicio de Kubernetes por cada entorno de Apigee.

Componente Cuenta de servicio de Kubernetes Cuenta de servicio de Google
Entorno de ejecución de Apigee apigee-runtime-my-project-id-env-name-num-id2-sa apigee-runtime
Sincronizador apigee-synchronizer-my-project-id-env-name-num-id2-sa apigee-synchronizer
UDCA (a nivel de entorno) apigee-udca-my-project-id-env-name-num-id2-sa apigee-udca

En los siguientes comandos, usa los nombres de las cuentas de servicio de Kubernetes devueltos por el comando kubectl get sa -n $NAMESPACE. Por ejemplo: apigee-cassandra-schema-val-hybrid-example-project-123abcd.

En este procedimiento, para cada cuenta de servicio de Kubernetes, debes hacer lo siguiente:

  • Vincula la cuenta de servicio de Kubernetes y la cuenta de servicio de Google principal al rol de gestión de identidades y accesos roles/iam.workloadIdentityUser.
  • Anota la cuenta de servicio de Kubernetes con la cuenta de servicio de Google.
  1. Vincula los roles y anota las cuentas de servicio.

    Componentes a nivel de organización

    Anota las cuentas de servicio de Kubernetes de los componentes a nivel de organización. Deberás hacerlo una vez por cada componente de tu organización de Apigee.

    • Cassandra

      El componente Cassandra tiene seis cuentas de servicio de Kubernetes asociadas:

      • apigee-cassandra-backup
      • apigee-cassandra-restore
      • apigee-cassandra-schema-setup
      • apigee-cassandra-schema-val (val = validación)
      • apigee-cassandra-user-setup
      • apigee-datastore-default

      Producción

      apigee-cassandra-backup

      1. Define las variables de entorno KSA_NAME y GSA_NAME:
        GSA_NAME="apigee-cassandra"
        KSA_NAME="apigee-cassandra-backup"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-restore

      1. Vuelve a definir la variable de entorno KSA_NAME:

        KSA_NAME="apigee-cassandra-restore"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-setup-service-account-name

      1. Vuelve a definir la variable de entorno KSA_NAME:

        KSA_NAME="apigee-cassandra-schema-setup-service-account-name"

        Asigna el rol de gestión de identidades y accesos:

        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      2. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-val-service-account-name

      1. Vuelve a definir la variable de entorno KSA_NAME:

        KSA_NAME="apigee-cassandra-schema-val-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-user-setup-service-account-name

      1. Vuelve a definir la variable de entorno KSA_NAME:

        KSA_NAME="apigee-cassandra-user-setup-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-datastore-default-sa

      1. Vuelve a definir la variable de entorno KSA_NAME:

        KSA_NAME="apigee-datastore-default-sa"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      No producción

      apigee-cassandra-backup

      1. Define las variables de entorno KSA_NAME y GSA_NAME:
        GSA_NAME="apigee-non-prod"
        KSA_NAME="apigee-connect-agent-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-restore

      1. Vuelve a definir la variable de entorno KSA_NAME:

        KSA_NAME="apigee-cassandra-restore"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-setup-service-account-name

      1. Vuelve a definir la variable de entorno KSA_NAME:

        KSA_NAME="apigee-cassandra-schema-setup-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-val-service-account-name

      1. Vuelve a definir la variable de entorno KSA_NAME:

        KSA_NAME="apigee-cassandra-schema-val-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-user-setup-service-account-name

      1. Vuelve a definir la variable de entorno KSA_NAME:

        KSA_NAME="apigee-cassandra-user-setup-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-datastore-default-sa

      1. Vuelve a definir la variable de entorno KSA_NAME:

        KSA_NAME="apigee-datastore-default-sa"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Apigee Connect

      Producción

      1. Define las variables de entorno KSA_NAME y GSA_NAME:
        GSA_NAME="apigee-mart"
        KSA_NAME="apigee-connect-agent-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      No producción

      1. Define la variable de entorno KSA_NAME:

        KSA_NAME="apigee-connect-agent-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • MART

      Producción

      1. Define las variables de entorno KSA_NAME y GSA_NAME:

        GSA_NAME="apigee-mart"
        KSA_NAME="apigee-mart-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      No producción

      1. Define la variable de entorno KSA_NAME:

        KSA_NAME="apigee-mart-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Métricas de Apigee

      Producción

      1. Define las variables de entorno KSA_NAME y GSA_NAME:

        GSA_NAME="apigee-metrics"
        KSA_NAME="apigee-metrics-sa"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      No producción

      1. Define la variable de entorno KSA_NAME:

        KSA_NAME="apigee-metrics-sa"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • UDCA (nivel de organización)

      Producción

      1. Define las variables de entorno KSA_NAME y GSA_NAME:

        GSA_NAME="apigee-udca"
        KSA_NAME="apigee-udca-org-level-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      No producción

      1. Define las variables de entorno KSA_NAME:

        KSA_NAME="apigee-udca-org-level-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
          gcloud iam service-accounts add-iam-policy-binding \
            --role roles/iam.workloadIdentityUser \
            --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
            $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
          kubectl annotate serviceaccount \
            --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Apigee Watcher

      Producción

      1. Define las variables de entorno KSA_NAME y GSA_NAME:

        GSA_NAME="apigee-watcher"
        KSA_NAME="apigee-watcher-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      No producción

      1. Define la variable de entorno KSA_NAME:

        KSA_NAME="apigee-watcher-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

    En cada entorno:

    • Tiempo de ejecución

      Producción

      1. Define las variables de entorno KSA_NAME y GSA_NAME:

        GSA_NAME="apigee-runtime"
        KSA_NAME="apigee-runtime-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      No producción

      1. Define la variable de entorno KSA_NAME:

        KSA_NAME="apigee-runtime-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Sincronizador

      Producción

      1. Define las variables de entorno KSA_NAME y GSA_NAME:

        GSA_NAME="apigee-synchronizer"
        KSA_NAME="apigee-synchronizer-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      No producción

      1. Define la variable de entorno KSA_NAME:

        KSA_NAME="apigee-synchronizer-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • UDCA (nivel de entorno)

      Producción

      1. Define las variables de entorno KSA_NAME y GSA_NAME:

        GSA_NAME="apigee-udca"
        KSA_NAME="apigee-udca-env-level-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      No producción

      1. Define la variable de entorno KSA_NAME:

        KSA_NAME="apigee-udca-env-level-service-account-name"
      2. Asigna el rol de gestión de identidades y accesos:
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. Anota la cuenta de servicio:
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
  2. Valida si los pasos han funcionado:
    gcloud config set project $PROJECT_ID
    
    kubectl run --rm -it --image google/cloud-sdk:slim \
      --namespace $NAMESPACE workload-identity-test\
      -- gcloud auth list

    Si no ves el símbolo del sistema, prueba a pulsar Intro.

    Si has seguido los pasos correctamente, deberías ver una respuesta como la siguiente:

                       Credentialed Accounts
    ACTIVE  ACCOUNT
    *       GSA@PROJECT_ID.iam.gserviceaccount.com
  3. Si vas a actualizar una instalación anterior, elimina los secretos que contengan claves privadas de cuentas de servicio:
    kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
    
  4. Comprueba los registros:
    kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer
    
  5. (Opcional) Puedes ver el estado de tus cuentas de servicio de Kubernetes en la página Kubernetes: Información general de las cargas de trabajo de la Google Cloud console.

    Ve a Cargas de trabajo.