Configura cuentas de servicio de nodos de GKE

Tus nodos de Google Kubernetes Engine (GKE) usan cuentas de servicio de Identity and Access Management (IAM) para tareas como el registro y la extracción de imágenes de contenedores para cargas de trabajo. En este documento, se muestra a los administradores de plataformas y a los ingenieros de seguridad cómo otorgar roles a las cuentas de servicio para casos de uso 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 Cuentas de servicio de nodos.

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta el comando gcloud components update para obtener la versión más reciente. Es posible que las versiones anteriores de gcloud CLI no admitan la ejecución de los comandos que se describen en este documento.

Roles obligatorios

Para obtener los permisos que necesitas para administrar las cuentas y los roles de servicio de IAM, pídele a tu administrador que te otorgue los siguientes roles de IAM:

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.

Otorga el rol mínimo requerido para GKE

GKE usa cuentas de servicio de IAM adjuntas a tus nodos para ejecutar tareas del sistema, como el registro y la supervisión. Como mínimo, estas cuentas de servicio de nodo deben tener el rol de cuenta de servicio de nodo predeterminado 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 la cuenta de servicio del nodo.

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

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

Configura la cuenta de servicio predeterminada de Compute Engine

Para otorgar el rol roles/container.defaultNodeServiceAccount a la cuenta de servicio predeterminada de Compute Engine, completa los siguientes pasos:

Console

  1. Ve a la página Bienvenida:

    Ir a Bienvenida

  2. En el campo Número del proyecto, haz clic en Copiar en el portapapeles.
  3. Ve a la página IAM:

    Ir a IAM

  4. Haz clic en Otorgar acceso.
  5. En el campo Principales nuevas, especifica el siguiente valor:
    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    Reemplaza PROJECT_NUMBER por el número de proyecto que copiaste.
  6. En el menú Selecciona un rol, selecciona el rol de Cuenta de servicio de nodo predeterminado de Kubernetes Engine.
  7. Haz clic en Guardar.

gcloud

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

    Reemplaza PROJECT_ID con el ID del proyecto.

    El resultado es similar a lo siguiente:

    12345678901
    
  2. Otorga 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"

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

Configura una cuenta de servicio de nodo personalizada

Para crear una cuenta de servicio personalizada y otorgarle el rol requerido para GKE, completa los siguientes pasos:

Console

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

    Ir a Cuentas de servicio

  2. Haz clic en Crear cuenta de servicio.
  3. Ingresa 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 según el nombre.
  4. Haz clic en Crear y continuar.
  5. En el menú Selecciona un rol, selecciona el rol Cuenta de servicio de nodo predeterminado de Kubernetes Engine.
  6. Haz clic en Listo.

gcloud

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

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

  2. Otorga el rol de cuenta de servicio de nodo predeterminado 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

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID de tu proyecto Google Cloud .
    • SA_NAME: Es el nombre de la cuenta de servicio que creaste.

Terraform

Crea una cuenta de servicio de IAM y otórgale el rol de 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: En este paso, se necesita Config Connector. Sigue las instrucciones de instalación para instalar Config Connector en el 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]

    Reemplaza lo siguiente:

    • [SA_NAME]: Es el nombre de la cuenta de servicio nueva.
    • [DISPLAY_NAME]: Es 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 como 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]

      Reemplaza lo siguiente:

      • [SA_NAME]: Es el nombre de la cuenta de servicio.
      • [PROJECT_ID]: El ID de tu 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 como policy-metrics-writer.yaml. Reemplaza [SA_NAME] y [PROJECT_ID] por tu propia 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]

      Reemplaza lo siguiente:

      • [SA_NAME]: Es el nombre de la cuenta de servicio.
      • [PROJECT_ID]: El ID de tu 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 como 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]

      Reemplaza lo siguiente:

      • [SA_NAME]: Es el nombre de la cuenta de servicio.
      • [PROJECT_ID]: El ID de tu 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 como 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]

      Reemplaza lo siguiente:

      • [SA_NAME]: Es el nombre de la cuenta de servicio.
      • [PROJECT_ID]: El ID de tu 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 los recursos de otros proyectos. Para obtener instrucciones, consulta Habilita la suplantación de identidad de cuentas de servicio en todos los proyectos.

Permite que las principales adjunten cuentas de servicio personalizadas

Puedes adjuntar una cuenta de servicio personalizada cuando creas un clúster o un grupo de nodos. Para permitir que una principal (como un administrador de la plataforma) use una cuenta de servicio personalizada para crear recursos de GKE, otorga el rol de usuario de cuenta de servicio (roles/iam.serviceAccountUser) en la cuenta de servicio personalizada a esa principal. Para otorgar este rol, selecciona una de las siguientes opciones:

Console

  1. En la consola de Google Cloud , 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. Selecciona la casilla de verificación de la cuenta de servicio personalizada que creaste para usar con los nodos de GKE.

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

  4. Haz clic en Agregar principal. Se abrirá el panel Otorgar acceso.

  5. En el campo Principales nuevas, especifica la 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. Se cerrará el panel Otorgar acceso.

  8. Cierra el panel Administrar acceso.

gcloud

Otorga la función 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

Reemplaza lo siguiente:

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

Config Connector

Nota: En este paso, se necesita Config Connector. Sigue las instrucciones de instalación para instalar Config Connector en el clúster.

Aplica la función iam.serviceAccountUser a tu cuenta de servicio. Descarga el siguiente recurso como policy-service-account-user.yaml. Reemplaza [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

Después de otorgar el rol en la cuenta de servicio, esas entidades principales pueden usar esa cuenta de servicio para crear clústeres y grupos de nodos. Para obtener más información, consulta los siguientes documentos:

Configura el uso de cuentas de servicio en todos los proyectos

Si la cuenta de servicio del nodo no está en el mismo proyecto que el 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 Cuentas de servicio de nodos y agentes de servicio del proyecto.

Para otorgar los roles requeridos en las cuentas de servicio de nodos que no se encuentran en el proyecto de tu clúster, sigue estos pasos:

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

    Console

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

      Ir a Cuentas de servicio

    2. Selecciona la casilla de verificación de la cuenta de servicio personalizada que creaste para usar con los nodos de GKE.

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

    4. Otorga el rol de creador de tokens de la cuenta de servicio al agente de servicio de Compute Engine en el proyecto de tu clúster:

      1. En el panel Administrar acceso, haz clic en Agregar principal. Se abrirá el panel Otorgar acceso.
      2. En el campo Principales nuevos, especifica la dirección de correo electrónico del agente de servicio de Compute Engine en tu proyecto de clúster:

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

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

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

      4. Haz clic en Guardar. Se cerrará el panel Otorgar acceso.

    5. Otorga la función de usuario de la cuenta de servicio al agente de servicio de GKE en tu proyecto de clúster:

      1. En el panel Administrar acceso, haz clic en Agregar principal. Se abrirá el panel Otorgar acceso.
      2. En el campo Principales nuevos, especifica la dirección de correo electrónico del agente de servicio de GKE en tu proyecto de clúster:

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

      4. Haz clic en Guardar. Se cerrará el panel Otorgar acceso.

    6. Cierra el panel Administrar 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)'
      

      Reemplaza CLUSTER_PROJECT_ID por el ID del proyecto del clúster.

      El resultado es similar a 123456789.

    2. Otorga el rol roles/iam.serviceAccountTokenCreator en la cuenta de servicio personalizada al agente de servicio de Compute Engine en tu proyecto de 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
      

      Reemplaza lo siguiente:

      • SA_NAME: Es el nombre de la cuenta de servicio personalizada.
      • SERVICE_ACCOUNT_PROJECT_ID: Es el ID del proyecto que contiene tu cuenta de servicio personalizada.
      • CLUSTER_PROJECT_NUMBER: Es el número del proyecto del clúster.
    3. Otorga el rol roles/iam.serviceAccountUser en la cuenta de servicio personalizada al agente de servicio de GKE en tu proyecto de 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
      

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

Si tienes imágenes en repositorios privados de Artifact Registry, debes otorgar acceso a esos repositorios a la cuenta de servicio del nodo. Incluso si usas la cuenta de servicio predeterminada de Compute Engine, es posible que debas otorgarle acceso a tu repositorio si este se encuentra en otro proyecto.

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

Console

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

    Ir a Repositorios

  2. Selecciona la casilla de verificación 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 Agregar principal. Se abrirá el panel Otorgar acceso.

  5. En el campo Principales nuevas, especifica la dirección de correo electrónico de la cuenta de servicio de tu nodo.

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

  7. Selecciona el rol Lector de Artifact Registry.

  8. Haz clic en Guardar.

gcloud

Otorga 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

Reemplaza lo siguiente:

Config Connector

Nota: En este paso, se necesita Config Connector. Sigue las instrucciones de instalación para instalar Config Connector en el clúster.

  1. Guarda el siguiente 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"

    Reemplaza lo siguiente:

    • SA_NAME: El nombre de tu cuenta de servicio de IAM.
    • PROJECT_ID: El ID de tu proyecto Google Cloud .
    • REPOSITORY_NAME: Es el nombre de tu repositorio de Artifact Registry.
  2. Otorga el rol de lector de Artifact Registry a la cuenta de servicio:

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

¿Qué sigue?