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).

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 bucket de registro creado en el proyecto del usuario. De manera opcional, puedes crear una regla de exclusión para evitar que los registros de usuarios 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 previos

Configura el registro de varios usuarios

Puedes configurar el registro de instancias múltiples con la herramienta de línea de comandos de 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. Configura variables:

    export TENANT_NAMESPACE="TENANT_NAMESPACE"
    export MAIN_PROJECT="MAIN_PROJECT_ID"
    export TENANT_PROJECT="TENANT_PROJECT_ID"
    

    Reemplaza lo siguiente:

    • TENANT_NAMESPACE: es el nombre del espacio de nombres del proyecto de usuario.
    • MAIN_PROJECT_ID: es el ID del proyecto principal.
    • TENANT_PROJECT_ID: es el ID de tu proyecto de usuario.
  2. Crea un espacio de nombres en tu clúster de múltiples instancias:

    kubectl create namespace $TENANT_NAMESPACE
    
  3. Crea el bucket de registro en el proyecto del usuario:

    gcloud logging buckets create gke-$TENANT_NAMESPACE-log-bucket \
        --project=$TENANT_PROJECT \
        --location=global \
        --description="Log bucket for $TENANT_NAMESPACE namespace from $MAIN_PROJECT"
    

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

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

    gcloud logging sinks create gke-$TENANT_NAMESPACE-sink \
    logging.googleapis.com/projects/$TENANT_PROJECT/locations/global/buckets/gke-$TENANT_NAMESPACE-log-bucket \
        --project=$MAIN_PROJECT \
        --log-filter=resource.labels.namespace_name="$TENANT_NAMESPACE" \
        --description="Log sink to $TENANT_PROJECT for $TENANT_NAMESPACE namespace"
    

    Este comando crea un receptor de registros que envía todos los registros relacionados con el espacio de nombres $TENANT_NAMESPACE al bucket de registros que creaste en el paso anterior.

    Es posible que a veces debas usar un --log-filter más restrictivo. Por ejemplo, si tu clúster y tu usuario tienen el mismo espacio de nombres, puedes agregar un filtro de clúster.

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

  5. Obtén la cuenta de servicio del receptor del proyecto principal y asígnala a una variable. Necesitarás esta cuenta de servicio para otorgar permisos en el siguiente paso.

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT \
        --format='value(writerIdentity)')
    
  6. 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 \
         --member=$SERVICE_ACCOUNT --role='roles/logging.bucketWriter' \
         --condition="expression=resource.name.endsWith(\"locations/global/buckets/gke-$TENANT_NAMESPACE-log-bucket\"),title=Log bucket writer for $TENANT_NAMESPACE,description=Grants logging.bucketWriter role to service account $SERVICE_ACCOUNT used by gke-$TENANT_NAMESPACE-sink"
    

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

  7. 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 bucket 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 logging sinks update _Default --project=$MAIN_PROJECT \
        --add-exclusion="name=gke-$TENANT_NAMESPACE-default-exclusion,description=\"Exclusion rule on the _Default bucket for $TENANT_NAMESPACE\",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 logging sinks update.

Console

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

  1. Crea un bucket de registro en el proyecto del usuario:

    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. Selecciona una región del menú desplegable Seleccionar la región del bucket de registros.

    6. Haga clic en Crear bucket. 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 Bucket de Cloud Logging.
    5. Ingresa un Nombre y una Descripción para tu receptor y haz clic en Siguiente.
    6. En el menú desplegable Seleccionar servicio del receptor, selecciona Otro proyecto.
    7. En el campo Destino del receptor, agrega el siguiente destino: logging.googleapis.com/projects/MAIN_PROJECT_ID/locations/LOG_BUCKET_REGION/buckets/BUCKET_NAME

      Reemplaza lo siguiente:

      • MAIN_PROJECT_ID: es el ID del proyecto principal.
      • LOG_BUCKET_REGION: es la región en la que creaste tu bucket de registros.
      • BUCKET_NAME: es el nombre del bucket de registro que creaste en la sección anterior.
    8. Haga clic en Next.

    9. En Crear filtro de inclusión, agrega el siguiente filtro: resource.labels.namespace_name="TENANT_NAMESPACE". Reemplaza TENANT_NAMESPACE por el nombre del espacio de nombres del proyecto de tu usuario.

      Es posible que a veces necesites usar un filtro de inclusión más restrictivo. Por ejemplo, si tu clúster y tu usuario tienen el mismo espacio de nombres, puedes agregar un filtro de clúster.

    10. 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 bucket _Default, haz clic en Más 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

Una vez que comienzas a usar cargas de trabajo que usan TENANT_NAMESPACE, puedes verificar que el proyecto de usuario reciba registros específicos de usuario:

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

    Ir al Visor de registros

  2. Haz clic en Define mejor el permiso.

  3. Selecciona Limitar permisos por almacenamiento y elige el bucket del usuario:

    gke-TENANT_NAMESPACE-log-bucket
    

Realice 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_NAMESPACE="TENANT_NAMESPACE"
    export MAIN_PROJECT="MAIN_PROJECT_ID"
    export TENANT_PROJECT="TENANT_PROJECT_ID"
    

    Reemplaza lo siguiente:

    • TENANT_NAMESPACE: es el nombre del espacio de nombres del proyecto de usuario.
    • MAIN-PROJECT-ID: es el ID del proyecto principal.
    • TENANT-PROJECT-ID: es el ID de tu proyecto de usuario.
  2. Si creaste una regla de exclusión en el proyecto principal, quítala:

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

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT | \
        --format='value(writerIdentity)'
    
    gcloud projects remove-iam-policy-binding $TENANT_PROJECT \
        --member=$SERVICE_ACCOUNT \
        --role='roles/logging.bucketWriter' \
        --all
    
  4. Borra el receptor de registros:

    gcloud logging sinks delete gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT
    
  5. Borra el bucket de registro:

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

    kubectl delete namespace $TENANT_NAMESPACE
    

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 bucket de registro:

    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 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.

¿Qué sigue?