從舊版存取權範圍遷移

本頁說明執行 Kubernetes 1.10 版和更新版本的叢集存取權範圍異動。這些異動僅影響您的叢集與 Cloud Storage 和 Compute Engine 的互動。

何謂存取權範圍?

存取權範圍是一種舊式方法,為節點以及使用應用程式預設憑證 (ADC),在節點上執行的工作負載指定權限。在執行早於 Kubernetes 1.10 版的叢集,系統會向叢集的預設服務帳戶授予一組預設的「存取權範圍」gcloud 和 Google Cloud Platform 主控台會向這些叢集授予 compute-rwstorage-ro 存取權範圍:

  • compute-rw 授予所有 Compute Engine API 方法的完整存取權
  • storage-ro 授予「所有」Cloud Storage 資源 (包含儲存在 Container Registry 中的私人映像檔) 的唯讀存取權

存取權範圍的異動

從 Kubernetes 1.10 版本開始,根據預設,gcloud 和 GCP 主控台不再對新叢集和新節點集區授予 compute-rw 存取權範圍。 此外,若在 gcloud container create 指定 --scopesgcloud 將不再以無訊息的方式新增 compute-rwstorage-ro

這些變更可確保您的預設服務帳戶只擁有執行叢集的必要權限,進而改善專案的安全性。

我的工作負載是否會受到影響?

若工作負載不需要呼叫這些範圍授予 (存取權) 的 API,您不需要執行任何動作。

然而,若工作負載需要與 Compute Engine 或 Cloud Storage 互動的權限,工作負載便可能受到影響。我們建議您使用對等的 Cloud Identity and Access Management 角色,建立自訂的服務帳戶

若您覆寫範圍,且您的工作負載需要與 Cloud Storage 互動的權限 (包含從 Container Registry 提取私人容器映像檔,則必須包含 storage-ro 的範圍。

或者,若要複製早於 1.10 版叢集的行為,請參閱還原至舊版存取權範圍

影響

Compute Engine 和 Cloud Storage 會針對在 Kubernetes 1.10 版叢集中執行但缺乏所需權限範圍的應用程式傳回 403 錯誤。

此外,權限範圍不足的要求回應會包含一個列出必要範圍的 HTTP 標頭。例如:

WWW-Authenticate: Bearer realm="https://accounts.google.com/", error=insufficient_scope, scope="https://www.googleapis.com/auth/compute.readonly"

設定工作負載的自訂服務帳戶

Cloud Identity & Access Management (Cloud IAM) 是存取控制系統,向 GCP 專案內的使用者和服務帳戶授予授權角色。服務帳戶為特殊的 Google 帳戶,可代替您執行工作,例如部署應用程式。您可使用 Cloud IAM 建立服務帳戶,然後使用 Cloud IAM 政策繫結來保護帳戶。

若您的工作負載需要 Compute Engine 的存取權,請授予服務帳戶 Compute Engine 管理員角色。若工作負載需要從 Container Registry 提取私人映像檔,請授予 Storage 物件檢視者角色。

建立服務帳戶

若要建立名為 kubernetes-engine-node-sa 的自訂服務帳戶,請執行下列指令:

export NODE_SA_NAME=kubernetes-engine-node-sa
gcloud iam service-accounts create $NODE_SA_NAME \
  --display-name "GKE Node Service Account"
export NODE_SA_EMAIL=`gcloud iam service-accounts list --format='value(email)' \
  --filter='displayName:Node Service Account'`

授予最小角色

若設定服務帳戶使用「最小」必要角色和 GKE 權限,請執行下列指令。$PROJECT 為您的專案 ID

export PROJECT=`gcloud config get-value project`
gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/monitoring.metricWriter
gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/monitoring.viewer
gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/logging.logWriter

請參閱最小角色,以瞭解詳細資訊。

授予其他角色

若要授予服務帳戶 Compute Engine 管理員角色,請執行下列指令:

gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/compute.admin

若要授予 Storage 物件檢視者角色:

gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/storage.objectviewer

如要瞭解如何將服務帳戶存取權授予儲存在 Container Registry 中的私人映像檔,請參閱向使用者和其他專案授予註冊資料庫的存取權

使用自訂的服務帳戶建立叢集或節點集區

若要建立使用自訂服務帳戶的叢集,請執行下列指令:

gcloud container clusters create --service-account=$NODE_SA_EMAIL

若要在現有叢集中建立節點集區:

gcloud container node-pools create --service-account=$NODE_SA_EMAIL

還原至舊版存取權範圍

如果您要在執行 Kubernetes 1.10 版和更新版本中的叢集繼續使用舊版存取權範圍,您必須手動新增這些範圍。

主控台

如要使用 GCP 主控台建立叢集,請執行下列步驟:

  1. 造訪 GCP 主控台的 Google Kubernetes Engine 選單。

    造訪 Google Kubernetes Engine 選單

  2. 按一下 [Create cluster] (建立叢集)。

  3. 從「Master Version」(主版本) 選擇最新的 Kubernetes 1.10 版本。

  4. 視需要設定叢集。請先不要點選 [Create] (建立)

  5. 按一下預設節點集區的 [Advanced edit] (進階編輯功能)

  6. 在「Access scopes」(存取權範圍) 區段中,選取 [Set access for each API] (針對各個 API 設定存取權)

  7. 在 Compute Engine 選取 [Read Write] (讀取/寫入)。依預設,儲存空間應為「Read Only」(唯讀)

  8. 按一下 [Save] (儲存) 退出「Advanced edit」(進階編輯功能) 視窗。

  9. 按一下 [Create] (建立)。

gcloud

如要建立叢集,請執行下列指令。

gcloud container clusters create example-cluster --scopes compute-rw,gke-default

若要在現有叢集中建立節點集區:

gcloud container node-pools create example-pool --scopes compute-rw,gke-default
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 說明文件