Configurar cuentas de servicio de nodos de GKE

Los nodos de Google Kubernetes Engine (GKE) usan cuentas de servicio de Identity and Access Management (IAM) para tareas como el registro y la obtención de imágenes de contenedor para cargas de trabajo. En este documento se explica a los administradores de plataformas y a los ingenieros de seguridad cómo asignar roles a cuentas de servicio para casos prácticos específicos y cómo crear cuentas de servicio personalizadas en lugar de usar una cuenta de servicio predeterminada. Para obtener más información, consulta el artículo Cuentas de servicio de nodos.

Antes de empezar

Antes de empezar, asegúrate de que has realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la CLI de gcloud, obtén la versión más reciente ejecutando el comando gcloud components update. Es posible que las versiones anteriores de la interfaz de línea de comandos de gcloud no admitan la ejecución de los comandos de este documento.

Roles obligatorios

Para obtener los permisos que necesitas para gestionar cuentas de servicio y roles de gestión de identidades y accesos, pide a tu administrador que te asigne los siguientes roles de gestión de identidades y accesos:

Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar acceso a proyectos, carpetas y organizaciones.

También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.

Concede el rol mínimo necesario para GKE

GKE usa cuentas de servicio de gestión de identidades y accesos que están asociadas a tus nodos para ejecutar tareas del sistema, como el registro y la monitorización. Como mínimo, estas cuentas de servicio de nodo deben tener el rol Cuenta de servicio de nodo predeterminada de Kubernetes Engine (roles/container.defaultNodeServiceAccount) en tu proyecto. De forma predeterminada, GKE usa la cuenta de servicio predeterminada de Compute Engine, que se crea automáticamente en tu proyecto, como cuenta de servicio del nodo.

Si tu organización aplica la restricción de política de organización iam.automaticIamGrantsForDefaultServiceAccounts, es posible que la cuenta de servicio predeterminada de Compute Engine de tu proyecto no obtenga automáticamente los permisos necesarios para GKE.

En las siguientes secciones se explica cómo asignar el rol roles/container.defaultNodeServiceAccount a la cuenta de servicio predeterminada de Compute Engine o a una cuenta de servicio personalizada que crees.

Configurar la cuenta de servicio predeterminada de Compute Engine

Para asignar el rol roles/container.defaultNodeServiceAccount a la cuenta de servicio predeterminada de Compute Engine, sigue estos pasos:

Consola

  1. Ve a la página Bienvenida:

    Ir a Bienvenida

  2. En el campo Número de proyecto, haga clic en Copiar en el portapapeles.
  3. Ve a la página Gestión de identidades y accesos:

    Ir a IAM

  4. Haz clic en Conceder acceso.
  5. En el campo Nuevos principales, especifique el siguiente valor:
    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    Sustituye PROJECT_NUMBER por el número de proyecto que has copiado.
  6. En el menú Seleccionar un rol, elige el rol Cuenta de servicio de nodo predeterminada de Kubernetes Engine.
  7. Haz clic en Guardar.

gcloud

  1. Busca el Google Cloud número de proyecto:
    gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)"

    Sustituye PROJECT_ID por el ID del proyecto.

    El resultado debería ser similar al siguiente:

    12345678901
    
  2. Asigna el rol roles/container.defaultNodeServiceAccount a la cuenta de servicio predeterminada de Compute Engine:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --role="roles/container.defaultNodeServiceAccount"

    Sustituye PROJECT_NUMBER por el número de proyecto del paso anterior.

Configurar una cuenta de servicio de nodo personalizada

Para crear una cuenta de servicio personalizada y asignarle el rol necesario para GKE, sigue estos pasos:

Consola

  1. Ve a la página Cuentas de servicio:

    Ir a Cuentas de servicio

  2. Haz clic en Crear cuenta de servicio.
  3. Escribe un nombre para la cuenta de servicio. El campo ID de cuenta de servicio genera automáticamente un ID único para la cuenta de servicio en función del nombre.
  4. Haz clic en Crear y continuar.
  5. En el menú Seleccionar un rol, elige el rol Cuenta de servicio de nodo predeterminada de Kubernetes Engine.
  6. Haz clic en Listo.

gcloud

  1. Crea la cuenta de servicio:
    gcloud iam service-accounts create SA_NAME

    Sustituye SA_NAME por un nombre único que identifique la cuenta de servicio.

  2. Asigna el rol Cuenta de servicio de nodo predeterminada de Kubernetes Engine (roles/container.defaultNodeServiceAccount) a la cuenta de servicio:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
        --role=roles/container.defaultNodeServiceAccount

    Haz los cambios siguientes:

    • PROJECT_ID: tu ID de proyecto Google Cloud .
    • SA_NAME: el nombre de la cuenta de servicio que has creado.

Terraform

Crea una cuenta de servicio de IAM y concédele el rol roles/container.defaultNodeServiceAccount en el proyecto:

resource "google_service_account" "default" {
  account_id   = "gke-node-service-account"
  display_name = "GKE node service account"
}

data "google_project" "project" {
}

resource "google_project_iam_member" "default" {
  project = data.google_project.project.project_id
  role    = "roles/container.defaultNodeServiceAccount"
  member  = "serviceAccount:${google_service_account.default.email}"
}

Config Connector

Nota: Este paso requiere Config Connector. Sigue las instrucciones de instalación para instalar Config Connector en tu clúster.

  1. Para crear la cuenta de servicio, descarga el siguiente recurso como service-account.yaml:
    apiVersion: iam.cnrm.cloud.google.com/v1beta1
    kind: IAMServiceAccount
    metadata:
      name: [SA_NAME]
    spec:
      displayName: [DISPLAY_NAME]

    Haz los cambios siguientes:

    • [SA_NAME]: el nombre de la nueva cuenta de servicio.
    • [DISPLAY_NAME]: un nombre visible para la cuenta de servicio.
  2. Crea la cuenta de servicio:
    kubectl apply -f service-account.yaml
  3. Aplica el rol roles/logging.logWriter a la cuenta de servicio:
    1. Descarga el siguiente recurso en formato policy-logging.yaml.
      apiVersion: iam.cnrm.cloud.google.com/v1beta1
      kind: IAMPolicyMember
      metadata:
        name: policy-logging
      spec:
        member: serviceAccount:[SA_NAME]@[PROJECT_ID].iam.gserviceaccount.com
        role: roles/logging.logWriter
        resourceRef:
          kind: Project
          name: [PROJECT_ID]

      Haz los cambios siguientes:

      • [SA_NAME]: el nombre de la cuenta de servicio.
      • [PROJECT_ID]: tu ID de proyecto Google Cloud .
    2. Aplica el rol a la cuenta de servicio:
      kubectl apply -f policy-logging.yaml
  4. Aplica el rol roles/monitoring.metricWriter a la cuenta de servicio:
    1. Descarga el siguiente recurso en formato policy-metrics-writer.yaml. Sustituye [SA_NAME] y [PROJECT_ID] por tu información.
      apiVersion: iam.cnrm.cloud.google.com/v1beta1
      kind: IAMPolicyMember
      metadata:
        name: policy-metrics-writer
      spec:
        member: serviceAccount:[SA_NAME]@[PROJECT_ID].iam.gserviceaccount.com
        role: roles/monitoring.metricWriter
        resourceRef:
          kind: Project
          name: [PROJECT_ID]

      Haz los cambios siguientes:

      • [SA_NAME]: el nombre de la cuenta de servicio.
      • [PROJECT_ID]: tu ID de proyecto Google Cloud .
    2. Aplica el rol a la cuenta de servicio:
      kubectl apply -f policy-metrics-writer.yaml
  5. Aplica el rol roles/monitoring.viewer a la cuenta de servicio:
    1. Descarga el siguiente recurso en formato policy-monitoring.yaml.
      apiVersion: iam.cnrm.cloud.google.com/v1beta1
      kind: IAMPolicyMember
      metadata:
        name: policy-monitoring
      spec:
        member: serviceAccount:[SA_NAME]@[PROJECT_ID].iam.gserviceaccount.com
        role: roles/monitoring.viewer
        resourceRef:
          kind: Project
          name: [PROJECT_ID]

      Haz los cambios siguientes:

      • [SA_NAME]: el nombre de la cuenta de servicio.
      • [PROJECT_ID]: tu ID de proyecto Google Cloud .
    2. Aplica el rol a la cuenta de servicio:
      kubectl apply -f policy-monitoring.yaml
  6. Aplica el rol roles/autoscaling.metricsWriter a la cuenta de servicio:
    1. Descarga el siguiente recurso en formato policy-autoscaling-metrics-writer.yaml.
      apiVersion: iam.cnrm.cloud.google.com/v1beta1
      kind: IAMPolicyMember
      metadata:
        name: policy-autoscaling-metrics-writer
      spec:
        member: serviceAccount:[SA_NAME]@[PROJECT_ID].iam.gserviceaccount.com
        role: roles/autoscaling.metricsWriter
        resourceRef:
          kind: Project
          name: [PROJECT_ID]

      Haz los cambios siguientes:

      • [SA_NAME]: el nombre de la cuenta de servicio.
      • [PROJECT_ID]: tu ID de proyecto Google Cloud .
    2. Aplica el rol a la cuenta de servicio:
      kubectl apply -f policy-autoscaling-metrics-writer.yaml

También puedes usar esta cuenta de servicio para recursos de otros proyectos. Para ver instrucciones al respecto, consulte el artículo sobre cómo habilitar la suplantación de identidad en cuentas de servicio en varios proyectos.

Permitir que los principales adjunten cuentas de servicio personalizadas

Puedes adjuntar una cuenta de servicio personalizada al crear un clúster o un pool de nodos. Para permitir que un principal (como un administrador de la plataforma) use una cuenta de servicio personalizada para crear recursos de GKE, asigna el rol Usuario de cuenta de servicio (roles/iam.serviceAccountUser) a ese principal en la cuenta de servicio personalizada. Para conceder este rol, selecciona una de las siguientes opciones:

Consola

  1. En la Google Cloud consola, ve a la página Cuentas de servicio:

    Ir a Cuentas de servicio

    En el selector de recursos, elige el proyecto que contiene tu cuenta de servicio personalizada.

  2. Marca la casilla de la cuenta de servicio personalizada que has creado para usarla con los nodos de GKE.

  3. Haz clic en Gestionar acceso. Se abrirá el panel Gestionar acceso.

  4. Haz clic en Añadir principal. Se abrirá el panel Dar acceso.

  5. En el campo Nuevos principales, especifica el principal, como un grupo de administradores.

  6. En el menú desplegable Seleccionar un rol, selecciona el rol Usuario de cuenta de servicio.

  7. Haz clic en Guardar. El panel Dar acceso se cierra.

  8. Cierra el panel Gestionar acceso.

gcloud

Asigna el rol roles/iam.serviceAccountUser:

gcloud iam service-accounts add-iam-policy-binding \
    SA_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
    --member=PRINCIPAL \
    --role=roles/iam.serviceAccountUser

Haz los cambios siguientes:

  • SA_NAME: el nombre de la cuenta de servicio personalizada.
  • SERVICE_ACCOUNT_PROJECT_ID: el ID del proyecto que contiene la cuenta de servicio personalizada.
  • PRINCIPAL: el identificador principal, como user:baklavainthebalkans@example.com.

Config Connector

Nota: Este paso requiere Config Connector. Sigue las instrucciones de instalación para instalar Config Connector en tu clúster.

Aplica el rol iam.serviceAccountUser a tu cuenta de servicio. Descarga el siguiente recurso en formato policy-service-account-user.yaml. Sustituye [SA_NAME] y [PROJECT_ID] por tu propia información.

apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMPolicyMember
metadata:
  name: policy-service-account-user
spec:
  member: serviceAccount:[SA_NAME]@[PROJECT_ID].iam.gserviceaccount.com
  role: roles/iam.serviceAccountUser
  resourceRef:
    kind: Project
    name: [PROJECT_ID]
kubectl apply -f policy-service-account-user.yaml

Una vez que hayas concedido el rol en la cuenta de servicio, esos principales podrán usarla para crear clústeres y grupos de nodos. Para obtener más información, consulta los siguientes documentos:

Configurar el uso de cuentas de servicio en varios proyectos

Si la cuenta de servicio de tu nodo no está en el mismo proyecto que tu clúster, los agentes de servicio del proyecto del clúster necesitan permisos adicionales en la cuenta de servicio. Para obtener más información, consulta el artículo sobre cuentas de servicio de nodos y agentes de servicio de proyectos.

Para conceder los roles necesarios en las cuentas de servicio de los nodos que no estén en tu proyecto de clúster, sigue estos pasos:

  1. Para habilitar la vinculación de cuentas de servicio entre proyectos, actualiza tus políticas de organización.
  2. Para conceder los roles necesarios en la cuenta de servicio personalizada a los agentes de servicio de tu proyecto de clúster, selecciona una de las siguientes opciones:

    Consola

    1. En la Google Cloud consola, ve a la página Cuentas de servicio.

      Ir a Cuentas de servicio

    2. Marca la casilla de la cuenta de servicio personalizada que has creado para usarla con los nodos de GKE.

    3. Haz clic en Gestionar acceso. Se abrirá el panel Gestionar acceso.

    4. Asigna el rol Creador de tokens de cuenta de servicio al agente de servicio de Compute Engine en el proyecto de tu clúster:

      1. En el panel Gestionar acceso, haz clic en Añadir principal. Se abrirá el panel Dar acceso.
      2. En el campo Nuevos principales, especifica la dirección de correo del agente de servicio de Compute Engine en el proyecto de tu clúster:

        service-CLUSTER_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com
        

        Sustituye CLUSTER_PROJECT_NUMBER por el número de proyecto de tu clúster.

      3. En el menú Seleccionar un rol, elige el rol Creador de tokens de cuenta de servicio.

      4. Haz clic en Guardar. El panel Dar acceso se cierra.

    5. Asigna el rol Usuario de cuenta de servicio al agente de servicio de GKE en el proyecto de tu clúster:

      1. En el panel Gestionar acceso, haz clic en Añadir principal. Se abrirá el panel Dar acceso.
      2. En el campo Principales nuevas, especifica la dirección de correo del agente de servicio de GKE en el proyecto de tu clúster:

        service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
        
      3. En el menú Seleccionar un rol, elige el rol Usuario de cuenta de servicio.

      4. Haz clic en Guardar. El panel Dar acceso se cierra.

    6. Cierra el panel Gestionar acceso.

    gcloud

    1. Obtén el número de proyecto de tu proyecto de clúster:

      gcloud projects describe CLUSTER_PROJECT_ID \
          --format='value(projectNumber)'
      

      Sustituye CLUSTER_PROJECT_ID por el ID del proyecto de tu clúster.

      La salida es similar a 123456789.

    2. Asigna el rol roles/iam.serviceAccountTokenCreator a la cuenta de servicio personalizada del agente de servicio de Compute Engine en el proyecto de tu clúster:

      gcloud iam service-accounts add-iam-policy-binding \
          SA_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
          --member=service-CLUSTER_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \
          --role=roles/iam.serviceAccountTokenCreator
      

      Haz los cambios siguientes:

      • SA_NAME: el nombre de la cuenta de servicio personalizada.
      • SERVICE_ACCOUNT_PROJECT_ID: el ID del proyecto que contiene tu cuenta de servicio personalizada.
      • CLUSTER_PROJECT_NUMBER: el número de proyecto de tu proyecto de clúster.
    3. Asigna el rol roles/iam.serviceAccountUser a la cuenta de servicio personalizada al agente de servicio de GKE en el proyecto de tu clúster:

      gcloud iam service-accounts add-iam-policy-binding \
          SA_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
          --member=service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \
          --role=roles/iam.serviceAccountUser
      

Permitir la extracción de imágenes de repositorios privados

Si tienes imágenes en repositorios privados de Artifact Registry, debes dar acceso a esos repositorios a la cuenta de servicio de tu nodo. Aunque uses la cuenta de servicio predeterminada de Compute Engine, es posible que tengas que darle acceso a tu repositorio si este se encuentra en otro proyecto.

Para extraer imágenes privadas de Artifact Registry, asigna el rol Lector de Artifact Registry (roles/artifactregistry.reader) en el repositorio a la cuenta de servicio de tu nodo.

Consola

  1. En la Google Cloud consola, ve a la página Repositorios.

    Ir a Repositorios

  2. Selecciona la casilla de tu repositorio.

  3. Haz clic en Mostrar panel de información. Se abrirá el panel de información del repositorio.

  4. En la pestaña Permisos, haz clic en Añadir principal. Se abrirá el panel Dar acceso.

  5. En el campo Nuevos principales, especifica la dirección de correo de la cuenta de servicio de tu nodo.

  6. Haz clic en Selecciona un rol para abrir el cuadro de diálogo de selección de rol.

  7. Selecciona el rol Lector de Artifact Registry.

  8. Haz clic en Guardar.

gcloud

Asigna el rol roles/artifactregistry.reader en el repositorio:

gcloud artifacts repositories add-iam-policy-binding REPOSITORY_NAME \
    --member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
    --project=REPOSITORY_PROJECT_ID \
    --role=roles/artifactregistry.reader

Haz los cambios siguientes:

Config Connector

Nota: Este paso requiere Config Connector. Sigue las instrucciones de instalación para instalar Config Connector en tu clúster.

  1. Guarda el siguiente archivo de manifiesto como policy-artifact-registry-reader.yaml:

    apiVersion: iam.cnrm.cloud.google.com/v1beta1
    kind: IAMPolicyMember
    metadata:
      name: policy-artifact-registry-reader
    spec:
      member: serviceAccount:"SA_NAME"@"PROJECT_ID".iam.gserviceaccount.com
      role: roles/artifactregistry.reader
      resourceRef:
        apiVersion: artifactregistry.cnrm.cloud.google.com/v1beta1
        kind: ArtifactRegistryRepository
        name: "REPOSITORY_NAME"

    Haz los cambios siguientes:

    • SA_NAME: el nombre de tu cuenta de servicio de gestión de identidades y accesos.
    • PROJECT_ID: tu ID de proyecto Google Cloud .
    • REPOSITORY_NAME: el nombre de tu repositorio de Artifact Registry.
  2. Asigna el rol Lector de Artifact Registry a la cuenta de servicio:

    kubectl apply -f policy-artifact-registry-reader.yaml
    

Siguientes pasos