設定 GKE 節點服務帳戶

Google Kubernetes Engine (GKE) 節點會使用 Identity and Access Management (IAM) 服務帳戶執行工作,例如記錄及提取工作負載的容器映像檔。本文將說明如何為特定用途的服務帳戶授予角色,以及如何建立自訂服務帳戶,而非使用預設服務帳戶。詳情請參閱節點服務帳戶

事前準備

開始之前,請確認您已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文中的指令。

必要的角色

如要取得管理 IAM 服務帳戶和角色所需的權限,請要求管理員授予下列 IAM 角色:

  • 安全管理員 (roles/iam.securityAdmin) 叢集專案
  • 在另一個專案中設定服務帳戶: 服務帳戶專案的安全管理員 (roles/iam.securityAdmin)

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

授予 GKE 的最低必要角色

GKE 會使用附加至節點的 IAM 服務帳戶,執行記錄和監控等系統工作。這些節點服務帳戶至少須具備專案的 Kubernetes Engine 預設節點服務帳戶 (roles/container.defaultNodeServiceAccount) 角色。根據預設,GKE 會使用專案中自動建立的 Compute Engine 預設服務帳戶做為節點服務帳戶。

如果貴機構強制執行iam.automaticIamGrantsForDefaultServiceAccounts機構政策限制,專案中的預設 Compute Engine 服務帳戶可能不會自動取得 GKE 的必要權限。

以下各節說明如何將 roles/container.defaultNodeServiceAccount 角色授予預設的 Compute Engine 服務帳戶,或是您建立的新自訂服務帳戶。

設定預設的 Compute Engine 服務帳戶

如要將 roles/container.defaultNodeServiceAccount 角色授予 Compute Engine 預設服務帳戶,請完成下列步驟:

控制台

  1. 前往「歡迎」頁面:

    前往「歡迎」頁面

  2. 在「專案編號」欄位中,按一下「複製到剪貼簿」圖示
  3. 前往「IAM」(身分與存取權管理) 頁面:

    前往「身分與存取權管理」頁面

  4. 點按「 Grant access」(授予存取權)
  5. 在「New principals」(新增主體) 欄位中,指定下列值:
    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    PROJECT_NUMBER 替換為您複製的專案編號。
  6. 在「Select a role」(選取角色) 選單中,選取「Kubernetes Engine Default Node Service Account」(Kubernetes Engine 預設節點服務帳戶) 角色。
  7. 按一下 [儲存]

gcloud

  1. 找出 Google Cloud 專案編號:
    gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)"

    PROJECT_ID 替換為專案 ID。

    輸出結果會與下列內容相似:

    12345678901
    
  2. roles/container.defaultNodeServiceAccount 角色授予 Compute Engine 預設服務帳戶:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --role="roles/container.defaultNodeServiceAccount"

    PROJECT_NUMBER 替換為上一步的專案編號。

設定自訂節點服務帳戶

如要建立自訂服務帳戶,並授予 GKE 服務帳戶所需角色,請完成下列步驟:

控制台

  1. 前往「Service accounts」(服務帳戶) 頁面:

    前往「Service accounts」(服務帳戶)

  2. 按一下 「建立服務帳戶」
  3. 輸入服務帳戶名稱。系統會根據名稱,在「服務帳戶 ID」欄位中自動產生服務帳戶的專屬 ID。
  4. 按一下「建立並繼續」
  5. 在「Select a role」(選取角色) 選單中,選取「Kubernetes Engine Default Node Service Account」(Kubernetes Engine 預設節點服務帳戶) 角色。
  6. 按一下 [完成]

gcloud

  1. 建立服務帳戶:
    gcloud iam service-accounts create SA_NAME

    SA_NAME 替換為可識別服務帳戶的專屬名稱。

  2. Kubernetes Engine 預設節點服務帳戶 (roles/container.defaultNodeServiceAccount) 角色授予服務帳戶:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
        --role=roles/container.defaultNodeServiceAccount

    更改下列內容:

    • PROJECT_ID:您的 Google Cloud 專案 ID。
    • SA_NAME:您建立的服務帳戶名稱。

Terraform

建立 IAM 服務帳戶,並授予專案的 roles/container.defaultNodeServiceAccount 角色:

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}"
}

設定連接器

附註:此步驟需要使用設定連接器。請按照安裝操作說明在叢集上安裝設定連接器。

  1. 如要建立服務帳戶,請以 service-account.yaml 格式下載以下資源:
    apiVersion: iam.cnrm.cloud.google.com/v1beta1
    kind: IAMServiceAccount
    metadata:
      name: [SA_NAME]
    spec:
      displayName: [DISPLAY_NAME]

    更改下列內容:

    • [SA_NAME]:新服務帳戶的名稱。
    • [DISPLAY_NAME]:服務帳戶的顯示名稱。
  2. 建立服務帳戶:
    kubectl apply -f service-account.yaml
  3. 在服務帳戶中套用 roles/logging.logWriter 角色:
    1. 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]

      更改下列內容:

      • [SA_NAME]:服務帳戶名稱。
      • [PROJECT_ID]:您的 Google Cloud 專案 ID。
    2. 將角色套用至服務帳戶:
      kubectl apply -f policy-logging.yaml
  4. 在服務帳戶中套用 roles/monitoring.metricWriter 角色:
    1. policy-metrics-writer.yaml 格式下載以下資源。 將 [SA_NAME][PROJECT_ID] 改成您自己的資訊。
      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]

      更改下列內容:

      • [SA_NAME]:服務帳戶名稱。
      • [PROJECT_ID]:您的 Google Cloud 專案 ID。
    2. 將角色套用至服務帳戶:
      kubectl apply -f policy-metrics-writer.yaml
  5. 在服務帳戶中套用 roles/monitoring.viewer 角色:
    1. 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]

      更改下列內容:

      • [SA_NAME]:服務帳戶名稱。
      • [PROJECT_ID]:您的 Google Cloud 專案 ID。
    2. 將角色套用至服務帳戶:
      kubectl apply -f policy-monitoring.yaml
  6. 在服務帳戶中套用 roles/autoscaling.metricsWriter 角色:
    1. 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]

      更改下列內容:

      • [SA_NAME]:服務帳戶名稱。
      • [PROJECT_ID]:您的 Google Cloud 專案 ID。
    2. 將角色套用至服務帳戶:
      kubectl apply -f policy-autoscaling-metrics-writer.yaml

您也可以將這個服務帳戶用於其他專案的資源。如需操作說明,請參閱「啟用跨專案的服務帳戶模擬功能」。

允許主體附加自訂服務帳戶

建立叢集或節點集區時,您可以附加自訂服務帳戶。如要允許主體 (例如平台管理員) 使用自訂服務帳戶建立 GKE 資源,請將自訂服務帳戶的「服務帳戶使用者」(roles/iam.serviceAccountUser) 角色授予該主體。如要授予這個角色,請選取下列其中一個選項:

控制台

  1. 前往 Google Cloud 控制台的「Service accounts」(服務帳戶) 頁面:

    前往「Service accounts」(服務帳戶)

    在資源選取器中,選擇包含自訂服務帳戶的專案。

  2. 勾選您建立的自訂服務帳戶核取方塊,即可搭配 GKE 節點使用。

  3. 按一下「管理存取權」。 「管理存取權」窗格隨即開啟。

  4. 按一下「新增主體」。 「授予存取權」窗格隨即開啟。

  5. 在「New principals」(新增主體) 欄位中,指定主體,例如管理員群組。

  6. 在「Select a role」(請選擇角色) 下拉式選單中,選取「Service Account User」(服務帳戶使用者) 角色。

  7. 按一下 [儲存]。「授予存取權」窗格會關閉。

  8. 關閉「管理存取權」窗格。

gcloud

授予 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

更改下列內容:

  • SA_NAME:自訂服務帳戶的名稱。
  • SERVICE_ACCOUNT_PROJECT_ID:包含自訂服務帳戶的專案 ID。
  • PRINCIPAL主體 ID,例如 user:baklavainthebalkans@example.com

設定連接器

附註:此步驟需要使用設定連接器。請按照安裝操作說明在叢集上安裝設定連接器。

在服務帳戶中套用 iam.serviceAccountUser 角色。以 policy-service-account-user.yaml 格式下載以下資源。將 [SA_NAME][PROJECT_ID] 改成您自己的資訊。

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

在服務帳戶上授予角色後,這些主體就能使用該服務帳戶建立叢集和節點集區。詳情請參閱下列文件:

設定跨專案服務帳戶使用情形

如果節點服務帳戶與叢集不在同一個專案中,叢集專案中的服務代理程式需要服務帳戶的額外權限。詳情請參閱「節點服務帳戶和專案服務代理程式」。

如要授予節點服務帳戶必要角色 (不在叢集專案中),請按照下列步驟操作:

  1. 如要啟用跨專案服務帳戶附加功能,請更新機構政策
  2. 如要將自訂服務帳戶的必要角色授予叢集專案中的服務代理程式,請選取下列其中一個選項:

    控制台

    1. 前往 Google Cloud 控制台的「Service accounts」(服務帳戶) 頁面。

      前往「Service accounts」(服務帳戶)

    2. 勾選您建立的自訂服務帳戶核取方塊,即可搭配 GKE 節點使用。

    3. 按一下「管理存取權」。 「管理存取權」窗格隨即開啟。

    4. 在叢集專案中,將「Service Account Token Creator」角色授予 Compute Engine 服務代理人:

      1. 在「管理存取權」窗格中,按一下 「新增主體」。「授予存取權」窗格隨即開啟。
      2. 在「New principals」(新增主體) 欄位中,指定叢集專案中 Compute Engine 服務代理人的電子郵件地址:

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

        CLUSTER_PROJECT_NUMBER 替換為叢集專案的專案編號。

      3. 在「Select a role」(選取角色) 選單中,選取「Service Account Token Creator」(服務帳戶憑證建立者) 角色。

      4. 按一下 [儲存]。「授予存取權」窗格就會關閉。

    5. 在叢集專案中,將服務帳戶使用者角色授予 GKE 服務代理程式:

      1. 在「管理存取權」窗格中,按一下 「新增主體」。「授予存取權」窗格隨即開啟。
      2. 在「New principals」(新增主體) 欄位中,指定叢集專案中 GKE 服務代理程式的電子郵件地址:

        service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
        
      3. 在「Select a role」(選取角色) 選單中,選取「Service Account User」(服務帳戶使用者) 角色。

      4. 按一下 [儲存]。「授予存取權」窗格會關閉。

    6. 關閉「管理存取權」窗格。

    gcloud

    1. 取得叢集專案的專案編號:

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

      CLUSTER_PROJECT_ID 替換為叢集專案的專案 ID。

      輸出內容類似 123456789

    2. 在叢集專案中,將自訂服務帳戶的 roles/iam.serviceAccountTokenCreator 角色授予 Compute Engine 服務代理人:

      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
      

      更改下列內容:

      • SA_NAME:自訂服務帳戶的名稱。
      • SERVICE_ACCOUNT_PROJECT_ID:包含自訂服務帳戶的專案 ID。
      • CLUSTER_PROJECT_NUMBER:叢集專案的專案編號。
    3. 在叢集專案中,將自訂服務帳戶的 roles/iam.serviceAccountUser 角色授予 GKE 服務代理程式:

      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
      

允許從私人存放區提取映像檔

如果 Artifact Registry 私人存放區中有映像檔,您必須授予節點服務帳戶這些存放區的存取權。即使使用預設的 Compute Engine 服務帳戶,如果存放區位於其他專案,您可能仍須授予服務帳戶存放區存取權。

如要從 Artifact Registry 提取私人映像檔,請將存放區的Artifact Registry Reader 角色 (roles/artifactregistry.reader) 授予節點服務帳戶。

控制台

  1. 前往 Google Cloud 控制台的「Repositories」頁面。

    前往「Repositories」(存放區) 頁面

  2. 選取存放區的核取方塊。

  3. 按一下「顯示資訊面板」。存放區資訊窗格隨即開啟。

  4. 在「權限」分頁中,按一下 「新增主體」。「授予存取權」窗格隨即開啟。

  5. 在「新增主體」欄位中,指定節點服務帳戶的電子郵件地址

  6. 按一下「請選擇角色」,開啟角色選取對話方塊。

  7. 選取「Artifact Registry Reader」角色。

  8. 按一下 [儲存]

gcloud

授予存放區的 roles/artifactregistry.reader 角色:

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

更改下列內容:

設定連接器

附註:此步驟需要使用設定連接器。請按照安裝操作說明在叢集上安裝設定連接器。

  1. 將下列資訊清單儲存為 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"

    更改下列內容:

    • SA_NAME:IAM 服務帳戶的名稱。
    • PROJECT_ID:您的 Google Cloud 專案 ID。
    • REPOSITORY_NAME:Artifact Registry 存放區的名稱。
  2. 將 Artifact Registry 讀取者角色指派給服務帳戶:

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

後續步驟