Usa Workload Identity

Aprende a autenticar los servicios de entrega de Knative con Workload Identity para acceder a las APIs de Google Cloud, como las APIs de Compute, Storage y Database, o las APIs de aprendizaje automático.

Para autenticar los servicios de entrega de Knative, debes hacer lo siguiente:

  1. Habilita Workload Identity en tu clúster
  2. Configura permisos
  3. Vincula tu cuenta de servicio de Kubernetes (KSA) a una cuenta de servicio de Google (GSA)

Después de seguir estos pasos, puedes implementar un nuevo servicio de entrega de Knative que use la identidad que creaste.

Habilita Workload Identity en tu clúster

Para configurar Workload Identity con la entrega de Knative, puedes configurar la Federación de identidades para cargas de trabajo de flota en lugar de usar un archivo JSON de la cuenta de servicio de Google Cloud.

Configura los permisos para habilitar todas las métricas

Para habilitar métricas, como el recuento de solicitudes de informes o la latencia de las solicitudes a la observabilidad de Google Cloud, debes otorgar permisos de escritura para Cloud Monitoring. Por ejemplo, puedes otorgar la función de escritor de métricas de Monitoring (roles/monitoring.metricWriter) a la cuenta de servicio de Google asociada con la entrega de Knative, ya que incluye los permisos necesarios para escribir datos de supervisión. Consulta Cómo usar cuentas de servicio para obtener más información sobre cómo crear cuentas de servicio de Google.

Vincula cuentas de servicio

Debes configurar una relación para una cuenta de servicio de Kubernetes (KSA) a fin de que actúe como una cuenta de servicio de Google (GSA). Cualquier carga de trabajo que se ejecute como KSA que vincules se autenticará de forma automática como GSA cuando se acceda a las API de Google Cloud. La KSA que vinculas debe existir dentro del clúster y el espacio de nombres del servicio de entrega de Knative para el que deseas usar Workload Identity. Además, puede pertenecer a un proyecto de Google Cloud diferente del proyecto de Google Cloud en el que reside el clúster.

  1. Si no existe una GSA, crea una; de lo contrario, continúa con el siguiente paso. Puedes crear una GSA para usarla con la entrega de Knative dentro de cualquier proyecto de Google Cloud en tu organización y, luego, usarla en el proyecto de Google Cloud en el que se ejecutan los servicios de entrega de Knative.

    Para crear una nueva GSA, ejecuta el siguiente comando:

    gcloud iam service-accounts create GSA_NAME

    Reemplaza GSA_NAME con el nombre de la nueva cuenta de servicio de Google.

    Para obtener más información sobre cómo usar las cuentas de servicio de Google con los servicios de entrega de Knative, consulta Cómo usar cuentas de servicio.

  2. Asegúrate de que tu GSA tenga las funciones de IAM que necesitas. Puedes otorgar funciones adicionales con el siguiente comando:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
        --role "ROLE_NAME"

    Reemplaza lo siguiente:

    • PROJECT_ID por el ID del proyecto de Google Cloud en el que reside la cuenta de servicio de Google.
    • GSA_NAME: es el nombre de tu cuenta de servicio de Google.
    • ROLE_NAME: por la función de IAM para asignar a tu GSA, como roles/monitoring.metricWriter.
  3. Si no existe una cuenta de servicio de Kubernetes, crea una en el mismo espacio de nombres de Kubernetes que el servicio de entrega de Knative; de lo contrario, continúa con el siguiente paso:

    kubectl create serviceaccount --namespace K8S_NAMESPACE KSA_NAME
  4. Vincula las cuentas de servicio de Kubernetes y las cuentas de servicio de Google para crear la identidad y, luego, impleméntala en tu clúster:

    1. Para permitir que la KSA actúe en nombre de GSA, crea una vinculación de política de IAM entre las dos.

      gcloud iam service-accounts add-iam-policy-binding \
      --role roles/iam.workloadIdentityUser \
      --member "serviceAccount:PROJECT_ID.svc.id.goog[K8S_NAMESPACE/KSA_NAME]" \
      GSA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com

      Reemplaza lo siguiente:

      • PROJECT_ID por el ID del proyecto de Google Cloud del clúster en el que residen tu cuenta de servicio de Kubernetes y los servicios de entrega de Knative.
      • K8S_NAMESPACE/KSA_NAME por el espacio de nombres y el nombre de tu cuenta de servicio de Kubernetes
      • GSA_NAME@GSA_PROJECT_ID por el nombre de tu cuenta de servicio de Google y el ID del proyecto de Google Cloud. Puedes usar cualquier cuenta de servicio de Google en la organización. Para ver tus cuentas de servicio de Google, consulta Enumera cuentas de servicio.
    2. Agrega la anotación iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT_ID a la KSA con la dirección de correo electrónico de la GSA.

      kubectl annotate serviceaccount \
      --namespace K8S_NAMESPACE KSA_NAME \
       iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT_ID.iam.gserviceaccount.com

      Reemplaza lo siguiente:

      • K8S_NAMESPACE/KSA_NAME por el espacio de nombres y el nombre de la cuenta de servicio de Kubernetes para la que creaste una vinculación
      • GSA_NAME@GSA_PROJECT_ID por el nombre de tu cuenta de servicio de Google y el ID del proyecto de Google Cloud para el que creaste una vinculación.

Implementa un servicio nuevo para usar Workload Identity

Implementa un servicio de entrega de Knative nuevo que usa Workload Identity que creaste.

Console

  1. Ve a la entrega de Knative en la consola de Google Cloud:

    Ir a la entrega de Knative

  2. Haz clic en Crear servicio si quieres configurar un servicio nuevo en el que realizarás la implementación. Si quieres configurar un servicio existente, haz clic en el servicio y, luego, haz clic en IMPLEMENTAR Y EDITAR UNA NUEVA REVISIÓN.

  3. En Configuración avanzada, haz clic en Contenedor.

  4. Haz clic en el menú desplegable Service account (Cuenta de servicio) y selecciona la cuenta de servicio que deseas.

  5. Haz clic en Siguiente para pasar a la siguiente sección.

  6. En la sección Configura la forma en que se activa el servicio, selecciona la conectividad que deseas usar para invocar el servicio.

  7. Haz clic en Crear para implementar la imagen en la entrega de Knative y espera a que finalice la implementación.

Línea de comandos

  • Para servicios existentes, configura la cuenta de servicio de Kubernetes mediante la ejecución del comando gcloud run services update con los siguientes parámetros:

    gcloud run services update SERVICE --service-account KSA_NAME

    Reemplaza lo siguiente:

    • SERVICE por el nombre del servicio de entrega de Knative.
    • KSA_NAME por la cuenta de servicio de Kubernetes que usaste para crear la identidad de la carga de trabajo
  • Para servicios nuevos, configura la cuenta de servicio de Kubernetes mediante la ejecución del comando gcloud run deploy con el parámetro --service-account:

    gcloud run deploy --image IMAGE_URL --service-account KSA_NAME

    Reemplaza lo siguiente:

    • IMAGE_URL por una referencia a la imagen del contenedor, como gcr.io/cloudrun/hello
    • KSA_NAME por la cuenta de servicio de Kubernetes que usaste para crear la identidad de la carga de trabajo

YAML

Puedes descargar la configuración de un servicio existente en un archivo YAML con el comando gcloud run services describe mediante la marca --format=export. Luego, puedes modificar ese archivo YAML e implementar esos cambios con el comando gcloud run services replace. Debes asegurarte de modificar solo los atributos especificados.

  1. Descarga la configuración del servicio en un archivo llamado service.yaml en el lugar de trabajo local:

    gcloud run services describe SERVICE --format export > service.yaml

    Reemplaza SERVICE por el nombre de tu servicio de entrega de Knative.

  2. En tu archivo local, actualiza el atributo serviceAccountName::

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        spec:
          serviceAccountName: KSA_NAME

    Reemplazar

    • SERVICE por el nombre del servicio de entrega de Knative.
    • KSA_NAME por la cuenta de servicio de Kubernetes que usaste para crear la identidad de la carga de trabajo
  3. Implementa la configuración en el servicio de entrega de Knative mediante la ejecución del siguiente comando:

    gcloud run services replace service.yaml

Migra servicios existentes para usar Workload Identity

Si habilitaste Workload Identity en un clúster existente, se debe migrar cada servicio en ese clúster para el que desees usar Workload Identity. Obtén más información para migrar servicios existentes.

Próximos pasos

Obtén más información sobre cómo administrar el acceso a tus servicios.