Configure contas de serviço de nós do GKE

Os seus nós do Google Kubernetes Engine (GKE) usam contas de serviço da gestão de identidade e de acesso (IAM) para tarefas como registo e obtenção de imagens de contentores para cargas de trabalho. Este documento mostra aos administradores da plataforma e aos engenheiros de segurança como conceder funções às contas de serviço para exemplos de utilização específicos e como criar contas de serviço personalizadas em vez de usar uma conta de serviço predefinida. Para mais informações, consulte o artigo Contas de serviço de nós.

Antes de começar

Antes de começar, certifique-se de que realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ative a API Google Kubernetes Engine
  • Se quiser usar a CLI gcloud para esta tarefa, instale-a e, em seguida, inicialize a CLI gcloud. Se instalou anteriormente a CLI gcloud, execute o comando gcloud components update para obter a versão mais recente. As versões anteriores da CLI gcloud podem não suportar a execução dos comandos neste documento.

Funções necessárias

Para receber as autorizações de que precisa para gerir as funções e as contas de serviço do IAM, peça ao seu administrador que lhe conceda as seguintes funções do IAM:

Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.

Conceda a função mínima necessária para o GKE

O GKE usa contas de serviço da IAM anexadas aos seus nós para executar tarefas do sistema, como registo e monitorização. No mínimo, estas contas de serviço de nós têm de ter a função Conta de serviço de nós predefinida do Kubernetes Engine (roles/container.defaultNodeServiceAccount) no seu projeto. Por predefinição, o GKE usa a conta de serviço predefinida do Compute Engine, que é criada automaticamente no seu projeto, como a conta de serviço do nó.

Se a sua organização aplicar a restrição da política da organização iam.automaticIamGrantsForDefaultServiceAccounts, a conta de serviço do Compute Engine predefinida no seu projeto pode não receber automaticamente as autorizações necessárias para o GKE.

As secções seguintes mostram como conceder a função roles/container.defaultNodeServiceAccount à conta de serviço predefinida do Compute Engine ou a uma nova conta de serviço personalizada que criar.

Configure a conta de serviço predefinida do Compute Engine

Para conceder a função roles/container.defaultNodeServiceAccount à conta de serviço predefinida do Compute Engine, conclua os seguintes passos:

Consola

  1. Aceda à página Boas-vindas:

    Aceder a Boas-vindas

  2. No campo Número do projeto, clique em Copiar para a área de transferência.
  3. Aceda à página IAM:

    Aceda ao IAM

  4. Clique em Conceder acesso.
  5. No campo Novos responsáveis, especifique o seguinte valor:
    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    Substitua PROJECT_NUMBER pelo número do projeto que copiou.
  6. No menu Selecionar uma função, selecione a função Conta de serviço do nó predefinido do Kubernetes Engine.
  7. Clique em Guardar.

gcloud

  1. Encontre o seu Google Cloud número do projeto:
    gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)"

    Substitua PROJECT_ID pelo ID do seu projeto.

    O resultado é semelhante ao seguinte:

    12345678901
    
  2. Conceda a função roles/container.defaultNodeServiceAccount à conta de serviço predefinida do Compute Engine:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --role="roles/container.defaultNodeServiceAccount"

    Substitua PROJECT_NUMBER pelo número do projeto do passo anterior.

Configure uma conta de serviço de nó personalizada

Para criar uma conta de serviço personalizada e conceder-lhe a função necessária para o GKE, conclua os seguintes passos:

Consola

  1. Aceda à página Contas de serviço:

    Aceda a Contas de serviço

  2. Clique em Criar conta de serviço.
  3. Introduza um nome para a conta de serviço. O campo ID da conta de serviço gera automaticamente um ID exclusivo para a conta de serviço com base no nome.
  4. Clique em Criar e continuar.
  5. No menu Selecionar uma função, selecione a função Conta de serviço do nó predefinido do Kubernetes Engine.
  6. Clique em Concluído.

gcloud

  1. Crie a conta de serviço:
    gcloud iam service-accounts create SA_NAME

    Substitua SA_NAME por um nome exclusivo que identifique a conta de serviço.

  2. Conceda a função Conta de serviço do nó predefinido do Kubernetes Engine (roles/container.defaultNodeServiceAccount) à conta de serviço:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
        --role=roles/container.defaultNodeServiceAccount

    Substitua o seguinte:

    • PROJECT_ID: o ID do seu Google Cloud projeto.
    • SA_NAME: o nome da conta de serviço que criou.

Terraform

Crie uma conta de serviço de IAM e conceda-lhe a função roles/container.defaultNodeServiceAccount no projeto:

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 passo requer o Config Connector. Siga as instruções de instalação para instalar o Config Connector no seu cluster.

  1. Para criar a conta de serviço, transfira o seguinte recurso como service-account.yaml:
    apiVersion: iam.cnrm.cloud.google.com/v1beta1
    kind: IAMServiceAccount
    metadata:
      name: [SA_NAME]
    spec:
      displayName: [DISPLAY_NAME]

    Substitua o seguinte:

    • [SA_NAME]: o nome da nova conta de serviço.
    • [DISPLAY_NAME]: um nome a apresentar para a conta de serviço.
  2. Crie a conta de serviço:
    kubectl apply -f service-account.yaml
  3. Aplique a função roles/logging.logWriter à conta de serviço:
    1. Transfira o seguinte 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]

      Substitua o seguinte:

      • [SA_NAME]: o nome da conta de serviço.
      • [PROJECT_ID]: o ID do seu Google Cloud projeto.
    2. Aplique a função à conta de serviço:
      kubectl apply -f policy-logging.yaml
  4. Aplique a função roles/monitoring.metricWriter à conta de serviço:
    1. Transfira o seguinte recurso como policy-metrics-writer.yaml. Substitua [SA_NAME] e [PROJECT_ID] pelas suas próprias informações.
      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]

      Substitua o seguinte:

      • [SA_NAME]: o nome da conta de serviço.
      • [PROJECT_ID]: o ID do seu Google Cloud projeto.
    2. Aplique a função à conta de serviço:
      kubectl apply -f policy-metrics-writer.yaml
  5. Aplique a função roles/monitoring.viewer à conta de serviço:
    1. Transfira o seguinte 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]

      Substitua o seguinte:

      • [SA_NAME]: o nome da conta de serviço.
      • [PROJECT_ID]: o ID do seu Google Cloud projeto.
    2. Aplique a função à conta de serviço:
      kubectl apply -f policy-monitoring.yaml
  6. Aplique a função roles/autoscaling.metricsWriter à conta de serviço:
    1. Transfira o seguinte 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]

      Substitua o seguinte:

      • [SA_NAME]: o nome da conta de serviço.
      • [PROJECT_ID]: o ID do seu Google Cloud projeto.
    2. Aplique a função à conta de serviço:
      kubectl apply -f policy-autoscaling-metrics-writer.yaml

Também pode usar esta conta de serviço para recursos noutros projetos. Para ver instruções, consulte o artigo Ativar a representação de contas de serviço em vários projetos.

Permitir que os principais anexem contas de serviço personalizadas

Pode anexar uma conta de serviço personalizada quando cria um cluster ou um conjunto de nós. Para permitir que um principal (como um administrador da plataforma) use uma conta de serviço personalizada para criar recursos do GKE, conceda a função Utilizador da conta de serviço (roles/iam.serviceAccountUser) na conta de serviço personalizada a esse principal. Para conceder esta função, selecione uma das seguintes opções:

Consola

  1. Na Google Cloud consola, aceda à página Contas de serviço:

    Aceda a Contas de serviço

    No seletor de recursos, escolha o projeto que contém a sua conta de serviço personalizada.

  2. Selecione a caixa de verificação da conta de serviço personalizada que criou para usar com os nós do GKE.

  3. Clique em Gerir acesso. É aberto o painel Gerir acesso.

  4. Clique em Adicionar responsável. O painel Conceder acesso é aberto.

  5. No campo Novos responsáveis, especifique o responsável, como um grupo de administradores.

  6. No menu pendente Selecionar uma função, selecione a função Utilizador da conta de serviço.

  7. Clique em Guardar. O painel Conceder acesso é fechado.

  8. Feche o painel Gerir acesso.

gcloud

Conceda a função de 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

Substitua o seguinte:

  • SA_NAME: o nome da conta de serviço personalizada.
  • SERVICE_ACCOUNT_PROJECT_ID: o ID do projeto que contém a conta de serviço personalizada.
  • PRINCIPAL: o identificador principal, como user:baklavainthebalkans@example.com.

Config Connector

Nota: este passo requer o Config Connector. Siga as instruções de instalação para instalar o Config Connector no seu cluster.

Aplique a função iam.serviceAccountUser à sua conta de serviço. Transfira o seguinte recurso como policy-service-account-user.yaml. Substitua [SA_NAME] e [PROJECT_ID] pelas suas próprias informações.

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

Depois de conceder a função na conta de serviço, esses responsáveis podem usar essa conta de serviço para criar clusters e conjuntos de nós. Para mais informações, consulte os seguintes documentos:

Configure a utilização da conta de serviço em vários projetos

Se a conta de serviço do nó não estiver no mesmo projeto que o cluster, os agentes de serviço no projeto do cluster precisam de autorizações adicionais na conta de serviço. Para mais informações, consulte o artigo Contas de serviço de nós e agentes de serviço de projetos.

Para conceder as funções necessárias em contas de serviço de nós que não estão no projeto do cluster, siga estes passos:

  1. Para ativar a associação de contas de serviço entre projetos, atualize as políticas da sua organização.
  2. Para conceder as funções necessárias na conta de serviço personalizada aos agentes de serviço no projeto do cluster, selecione uma das seguintes opções:

    Consola

    1. Na Google Cloud consola, aceda à página Contas de serviço.

      Aceda a Contas de serviço

    2. Selecione a caixa de verificação da conta de serviço personalizada que criou para usar com os nós do GKE.

    3. Clique em Gerir acesso. É aberto o painel Gerir acesso.

    4. Conceda a função Criador de tokens de contas de serviço ao agente de serviço do Compute Engine no projeto do cluster:

      1. No painel Gerir acesso, clique em Adicionar principal. O painel Conceder acesso é aberto.
      2. No campo Novos membros, especifique o endereço de email do agente de serviço do Compute Engine no projeto do cluster:

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

        Substitua CLUSTER_PROJECT_NUMBER pelo número do projeto do seu projeto de cluster.

      3. No menu Selecionar uma função, selecione a função Criador de tokens de contas de serviço.

      4. Clique em Guardar. O painel Conceder acesso é fechado.

    5. Conceda a função de utilizador da conta de serviço ao agente de serviço do GKE no projeto do cluster:

      1. No painel Gerir acesso, clique em Adicionar principal. O painel Conceder acesso é aberto.
      2. No campo Novos membros, especifique o endereço de email do agente de serviço do GKE no projeto do cluster:

        service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
        
      3. No menu Selecionar uma função, selecione a função Utilizador da conta de serviço.

      4. Clique em Guardar. O painel Conceder acesso é fechado.

    6. Feche o painel Gerir acesso.

    gcloud

    1. Obtenha o número do projeto do projeto do cluster:

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

      Substitua CLUSTER_PROJECT_ID pelo ID do projeto do cluster.

      O resultado é semelhante a 123456789.

    2. Conceda a função roles/iam.serviceAccountTokenCreator à conta de serviço personalizada ao agente de serviço do Compute Engine no projeto do cluster:

      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
      

      Substitua o seguinte:

      • SA_NAME: o nome da conta de serviço personalizada.
      • SERVICE_ACCOUNT_PROJECT_ID: o ID do projeto que contém a sua conta de serviço personalizada.
      • CLUSTER_PROJECT_NUMBER: o número do projeto do seu projeto de cluster.
    3. Conceda a função roles/iam.serviceAccountUser à conta de serviço personalizada ao agente de serviço do GKE no projeto do cluster:

      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
      

Permita a obtenção de imagens de repositórios privados

Se tiver imagens em repositórios privados do Artifact Registry, tem de conceder à conta de serviço do nó acesso a esses repositórios. Mesmo que use a conta de serviço do Compute Engine predefinida, pode ter de conceder à conta de serviço acesso ao seu repositório se este estiver noutro projeto.

Para extrair imagens privadas do Artifact Registry, conceda a função Leitor do Artifact Registry (roles/artifactregistry.reader) no repositório à conta de serviço do nó.

Consola

  1. Na Google Cloud consola, aceda à página Repositórios.

    Aceda a Repositórios

  2. Selecione a caixa de verificação do seu repositório.

  3. Clique em Mostrar painel de informações. É aberto o painel de informações do repositório.

  4. No separador Autorizações, clique em Adicionar principal. O painel Conceder acesso é aberto.

  5. No campo Novos membros, especifique o endereço de email da conta de serviço do nó.

  6. Clique em Selecionar uma função para abrir a caixa de diálogo de seleção de funções.

  7. Selecione a função Leitor do Artifact Registry.

  8. Clique em Guardar.

gcloud

Conceda a função de roles/artifactregistry.reader no repositório:

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

Substitua o seguinte:

Config Connector

Nota: este passo requer o Config Connector. Siga as instruções de instalação para instalar o Config Connector no seu cluster.

  1. Guarde o seguinte manifesto 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"

    Substitua o seguinte:

    • SA_NAME: o nome da sua conta de serviço de IAM.
    • PROJECT_ID: o ID do seu Google Cloud projeto.
    • REPOSITORY_NAME: o nome do seu repositório do Artifact Registry.
  2. Conceda a função Leitor do Artifact Registry à conta de serviço:

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

O que se segue?