Registro de varios usuarios en GKE

En esta página, se explica cómo configurar el registro de varios usuarios para clústeres de Google Kubernetes Engine (GKE).

Descripción general

Es común que varios equipos compartan un solo clúster de GKE. Compartir un clúster ofrece varias ventajas, como el descubrimiento de servicios más sencillo y la seguridad simplificada, y significa que los administradores de clústeres tienen que mantener menos clústeres. Sin embargo, los equipos de aplicaciones individuales a menudo tienen su propio proyecto. Esta estructura, que tiene un clúster de GKE principal, pero espacios de nombres diferentes para cada equipo de aplicaciones, recibe el nombre de “de varios usuarios”. El proyecto del equipo de aplicación se denomina usuario.

Con Google Cloud, los administradores de clústeres de GKE pueden crear un sistema en el que los registros del clúster permanecen en el proyecto principal de GKE y los registros de usuarios se distribuyen en los proyectos de usuarios. Para configurar tus registros de esta manera, usa el enrutador de registros de Cloud Logging. En el enrutador de registros, puedes controlar cómo fluyen los registros dentro de tu proyecto de Google Cloud y a otros proyectos de Google Cloud.

Para crear registros específicos del usuario, el administrador del clúster crea un receptor con el fin de exportar entradas de registro a un depósito de registro (Beta) creado en el proyecto del usuario. De manera opcional, puedes crear una regla de exclusión para evitar que los registros de instancias se almacenen en el proyecto principal de GKE.

En el siguiente diagrama, se proporciona una descripción general de una arquitectura de registro de varios usuarios mediante depósitos de registro:

Arquitectura de varios usuarios de GKE

En esta arquitectura, se incluye lo siguiente:

  1. Un depósito de registro creado en cada proyecto de usuario
  2. Un receptor de registros creado para cada espacio de nombres de usuario
  3. Una cuenta de servicio creada de manera automática para cada receptor de registros
  4. Reglas de exclusión para evitar, de manera opcional, la duplicación de los registros en el proyecto principal de GKE.

En las siguientes secciones, se te indicará cómo crear una arquitectura de este tipo.

Requisitos

Configura el registro de varios usuarios

Puedes configurar el registro de varios usuarios mediante gcloud o Google Cloud Console.

gcloud

A fin de implementar el registro de varios usuarios para clústeres de GKE, completa los siguientes pasos:

  1. De manera opcional, configura las variables y crea un espacio de nombres para el clúster de GKE del usuario:

    export TENANT_NAME="tenant-name"
    export MAIN_PROJECT="main-project-id"
    export TENANT_PROJECT="tenant-project-id"
    kubectl create namespace $TENANT_NAME
    
  2. Crea el depósito de registro (Beta) en el proyecto de usuario:

    gcloud alpha logging buckets create tenant-bucket-name \
        --project=tenant-project-id \
        --location=location \
        --description=description
    

    Reemplaza los siguientes elementos:

    • tenant-bucket-name: Es el nombre de tu depósito de registro del usuario. Asigna un nombre descriptivo al depósito para facilitar la configuración. Por ejemplo, puedes asignarle el nombre gke-$TENANT_NAME-log-bucket.
    • tenant-project-id: Es el ID del proyecto de usuario.
    • location: Es la ubicación en la que se creará el depósito. Una vez que se creó el depósito, la ubicación no se podrá cambiar.
    • description: Es una descripción para aclarar el fin de este depósito (opcional). Por ejemplo, "Log bucket for $TENANT_NAME namespace from $MAIN_PROJECT".

    Para obtener más información sobre estos campos, consulta la documentación de la API de gcloud alpha logging buckets create.

  3. Crea un receptor de registros en el proyecto principal de GKE:

    gcloud alpha logging sinks create main-sink-name sink-destination \
        --project=main-project-id \
        --log-filter=resource.labels.namespace_name="tenant-name" \
        --description=description
    

    Reemplaza los siguientes elementos:

    • main-sink-name: Es el nombre del receptor. Otorga un nombre descriptivo al receptor para que la configuración sea más fácil. Por ejemplo, puedes asignarle el nombre gke-$TENANT_NAME-sink.
    • sink-destination: Es la ubicación del depósito que creaste en el paso anterior. La ubicación del depósito tiene el siguiente formato: logging.googleapis.com/projects/tenant-project-id/locations/global/buckets/bucket-name.
    • main-project-id: Es el ID del proyecto principal.
    • resource.labels.namespace_name=tenant-namespace: Este filtro hace que el receptor exporte todos los registros del usuario.
    • description: Es una descripción para aclarar el fin de este depósito (opcional). Por ejemplo, "Log sink to $TENANT_PROJECT for $TENANT_NAME namespace".

    Para obtener más información sobre estos campos, consulta la documentación de la API de gcloud alpha logging sinks create.

  4. Obtén la cuenta de servicio del receptor en el proyecto principal. Necesitarás esta cuenta de servicio para otorgar permisos en el siguiente paso.

    # Set a variable to use in the next step
    export SERVICE_ACCOUNT=gcloud alpha logging sinks describe main-sink-name \
        --project=main-project-id | \
    grep serviceAccount | \
    sed 's/.*\(serviceAccount:.*\)/\1/'
    
  5. Otorga la función logging.bucketWriter a la cuenta de servicio que usa el receptor. El proyecto principal necesita este permiso para escribir en el depósito del proyecto de usuario.

    gcloud projects add-iam-policy-binding tenant-project-id \
        --member=$SERVICE_ACCOUNT \
        --role='roles/logging.bucketWriter' \
    # Add a condition to limit the access only to writing logs.
        --condition="expression=resource.name.endsWith\
        (\"locations/global/buckets/tenant-bucket-name\"),\
        title=Log bucket writer for tenant"
    

    Para obtener más información sobre estos campos, consulta la documentación de la API de gcloud projects add-iam-policy-binding.

  6. De forma opcional, crea una regla de exclusión en el depósito \_Default. Esto evita que los registros de usuario también se escriban en el depósito principal. Si omites este comando, tendrás registros duplicados en el depósito \_Default del proyecto principal y en el depósito del usuario.

    gcloud alpha logging sinks update _Default \
      --project=main-project-id \
      --add-exclusion="name=gke-tenant-default-exclusion,\
       description=\"Exclusion rule on the _Default bucket for tenant\",\
       filter=resource.labels.namespace_name=\"tenant-namespace\""
    

    Para obtener más información sobre estos campos, consulta la documentación de la API de gcloud alpha logging sinks update.

Console

A fin de implementar el registro de varios usuarios en GKE, completa los siguientes pasos:

  1. Crea un depósito de registro (Beta) en el proyecto de instancia:

    1. Ve al menú Almacenamiento de registros:

      Ir a Almacenamiento de registros

    2. Haz clic en el menú desplegable del proyecto en la página superior y selecciona el proyecto de usuario.

    3. Haz clic en Crear depósito de registros.

    4. Ingresa un Nombre y una Descripción para tu depósito.

    5. Haz clic en Crear depósito. Tu depósito nuevo aparece en la lista Logs bucket.

  2. Crea el receptor de registros en el proyecto principal de GKE:

    1. Haz clic en el menú desplegable del proyecto en la página superior y selecciona el proyecto principal de GKE.
    2. En el menú de la izquierda, selecciona Enrutador de registros. Se te redireccionará a la página Enrutador de registros.
    3. Haz clic en Crear receptor. Aparecerá la ventana Select sink.
    4. En la ventana Select sink, selecciona Cloud Logging.
    5. Ingresa un Nombre y una Descripción para tu receptor y haz clic en Siguiente.
    6. En el menú desplegable Selecciona el servicio del receptor, selecciona Cloud Logging.
    7. En el menú desplegable Seleccionar depósitos de registros, selecciona el depósito de registros de usuarios que creaste en el paso anterior y haz clic en Siguiente.
    8. En Crear filtro de inclusión, agrega el siguiente filtro: resource.labels.namespace_name="tenant-namespace". Reemplaza tenant-project-id por el nombre de tu proyecto de usuario.
    9. Haz clic en Crear receptor. Tu receptor nuevo aparece en la lista Logs Routing Sinks.
  3. Obtén la cuenta de servicio del receptor en el proyecto principal. Necesitarás esta cuenta de servicio para otorgar permisos en el siguiente paso.

    1. En la página Enrutador de registros, busca el receptor de registros del proyecto principal.
    2. Junto al receptor, haz clic en Más y selecciona Ver detalles de receptor.
    3. Copia el valor junto a Identidad de escritor: serviceAccount:.
  4. Otorga la función de Escritor de depósitos de registros a la cuenta de servicio que usa el receptor del usuario. El proyecto principal necesita este permiso para escribir en el depósito del proyecto de usuario.

    1. En Cloud Console, ve a la página IAM.

      Ir a IAM

    2. Haz clic en Agregar.

    3. En el campo Nuevos miembros, agrega la cuenta de servicio del receptor.

    4. En el menú desplegable Selecciona una función, selecciona Logging y elige Escritor de depósitos de registros.

    5. Haz clic en Guardar.

  5. De forma opcional, crea una regla de exclusión en el depósito \_Default. Esto evita que los registros de usuario también se escriban en el depósito principal. Si omites este comando, tendrás registros duplicados en el depósito \_Default del proyecto principal y en el depósito del usuario.

    1. En Cloud Console, ve a la página Enrutador de registros.

      Ir a Enrutador de registros

    2. Junto al depósito \_Default, haz clic en y selecciona Editar receptor.

    3. En la sección Elige registros para filtrar fuera del receptor, haz clic en Agregar exclusión.

    4. Agrega un nombre de filtro.

    5. En el cuadro Crear un filtro de exclusión, agrega resource.labels.namespace_name=\"tenant-namespace"\.

    6. Haz clic en Actualizar receptor.

Verifica los registros de usuarios

Para verificar que el proyecto de usuario reciba registros específicos del usuario, sigue estos pasos:

  1. Desde el proyecto de usuario, ve a la página Visor de registros.

    Ir al Visor de registros

  2. Haz clic en Define mejor el permiso.

  3. Selecciona Limitar permisos por almacenamiento y elige el depósito del usuario.

  4. Ejecuta consultas para registros. Por ejemplo, resource.labels.namespace_name="tenant-namespace".

Realiza una limpieza

Puedes quitar los objetos que creaste para el registro de varios usuarios mediante gcloud o Cloud Console.

gcloud

A fin de quitar los objetos que creaste para el registro de varios usuarios, completa los siguientes pasos:

  1. Configura las variables para simplificar los siguientes comandos:

    export TENANT_NAME="tenant-project-id"
    export MAIN_PROJECT="main-project-id"
    export TENANT_PROJECT="tenant-project-id"
    
  2. Si creaste una regla de exclusión en el proyecto principal, quítala:

    gcloud alpha logging sinks update _Default \
    --project=$MAIN_PROJECT \
    --remove-exclusions=gke-$TENANT_NAME-default-exclusion
    
  3. Quita la función bucketWriter de la cuenta de servicio:

    export SERVICE_ACCOUNT=`gcloud alpha logging sinks describe \
    gke-$TENANT_NAME-sink --project=$MAIN_PROJECT | \
    grep serviceAccount | \
    sed 's/.*\(serviceAccount:.*\)/\1/'`
    
    gcloud projects remove-iam-policy-binding $TENANT_PROJECT \
    --member=$SERVICE_ACCOUNT --role='roles/logging.bucketWriter'
    
  4. Borra el receptor de registros:

    gcloud alpha logging sinks delete gke-$TENANT_NAME-sink \
      --project=$MAIN_PROJECT
    
  5. Borra el depósito de registro (Beta):

    gcloud alpha logging buckets delete gke-$TENANT_NAME-log-bucket \
      --project=$TENANT_PROJECT \
      --location=global
    
  6. Borra el espacio de nombres:

    kubectl delete namespace $TENANT_NAME
    

Console

  1. Si creaste una regla de exclusión en el proyecto principal, quítala:

    1. En Cloud Console, ve a la página Enrutador de registros.

      Ir a Enrutador de registros

    2. Junto al depósito \_Default, haz clic en Más .

    3. Selecciona Editar receptor.

    4. Junto a la regla de exclusión que creaste, haz clic en Borrar.

    5. Haz clic en Actualizar receptor.

  2. En el proyecto principal, quita la cuenta de servicio:

    1. En Cloud Console, ve a la página IAM.

      Ir a IAM

    2. Selecciona la cuenta de servicio del receptor.

    3. Haz clic en Quitar.

    4. En la ventana de confirmación, haz clic en Confirmar.

  3. En el proyecto de usuario, borra el receptor de registros:

    1. Haz clic en el menú desplegable del proyecto en la página superior y selecciona el proyecto de usuario de GKE.
    2. En el menú de Logging, selecciona Enrutador de registros.

      Ir a Enrutador de registros

    3. En el receptor que deseas borrar, haz clic en Más .

    4. Selecciona Borrar receptor.

    5. En el panel de confirmación, haz clic en Borrar.

  4. En el proyecto principal, borra el depósito de registro (Beta):

    1. Haz clic en el menú desplegable del proyecto en la página superior y selecciona el proyecto principal de GKE.
    2. En el menú de Logging, selecciona Almacenamiento de registros.

      Ir a Almacenamiento de registros

    3. En el depósito que deseas borrar, haz clic en Más .

    4. Selecciona Borrar depósito.

    5. En el panel de confirmación, haz clic en Borrar.

Limitaciones

El registro de varios usuarios tiene las siguientes limitaciones:

  • La cuota para la cantidad de receptores de registros por proyecto es de 200. Si necesitas más de 200 usuarios, solicita un aumento de cuota mediante la apertura de un caso.
  • Existe un límite estricto de 50 reglas de exclusión por depósito de registros. Si deseas tener más de 50 usuarios, se debe revisar el enfoque de la regla de exclusión del depósito _Default. Como alternativa, podrías hacer lo siguiente:

    • Crea una sola regla de exclusión que filtre todos los espacios de nombres que no sean del sistema ni predeterminados mediante este comando:

      gcloud alpha logging sinks update _Default \
      --project=$MAIN_PROJECT \
      --add-exclusion="name=gke-all-tenant-default-exclusion,description=\"Exclusion rule on the _Default bucket for all tenants\",filter=resource.labels.namespace_name !~ \"kube\" AND resource.labels.namespace_name !~ \"system\ AND resource.labels.namespace_name != \"Default\""
      
    • Crea registros duplicados entre el proyecto de usuario y el proyecto principal mediante la creación de la regla de exclusión.

Próximos pasos