使用服務帳戶通過 Cloud Platform 驗證

本教學課程示範如何建立 Google Cloud 服務帳戶、指派角色以驗證 Cloud Platform 服務,以及在 GKE 上執行的應用程式中使用服務帳戶憑證。

此範例使用 Cloud Pub/Sub,但相關操作說明也適用於任何 Cloud Platform 服務。本教學課程中的範例應用程式使用服務帳戶驗證 Cloud Pub/Sub,並且訂閱以 Python 為基礎的應用程式向 Pub/Sub 主題發佈的訊息。

目標

本教學課程包含下列步驟:

  • 如何建立服務帳戶
  • 如何為您的服務帳戶指派必要角色以使用 Cloud Pub/Sub
  • 如何將帳戶金鑰儲存為 Kubernetes 密鑰
  • 如何使用服務帳戶設定和部署應用程式。

本教學課程使用的範例應用程式會訂閱 Pub/Sub 主題,並列印發佈至標準輸出的訊息。您必須使用正確權限設定應用程式、使用 gcloud 發佈訊息,以及檢查容器的輸出串流以確認收到的訊息是否正確無誤。

為何使用服務帳戶?

容器叢集中的每個節點都是一個 Compute Engine 執行個體。因此,根據預設,在容器叢集中執行的應用程式均會繼承 Compute Engine 執行個體的部署範圍。

Google Cloud Platform 會自動建立名為「Compute Engine 預設服務帳戶」的服務帳戶,GKE 會將其與其建立的節點相關聯。需視專案的設定而定,預設服務帳戶不一定具備使用其他 Cloud Platform API 的權限。GKE 也會指派一些有限的存取權範圍給 Compute 執行個體。我們不建議透過更新預設服務帳戶的權限或指派更多存取權範圍給 Compute 執行個體的方式,從 GKE 上執行的 Pod 驗證其他 Cloud Platform 服務。

若要從在 GKE 上執行的應用程式驗證 Google Cloud Platform 服務,建議的做法是建立您自己的服務帳戶。在理想情況下,向 Cloud Platform API 發出要求的每一個應用程式均應建立一個新的服務帳戶。

不同應用程式使用各自服務帳戶的好處包括:

  • 能夠更清楚瞭解和稽核應用程式所發出的 API 要求。

  • 可以撤銷特定應用程式的金鑰,不必因為共用某服務帳戶,而必須一次撤銷所有應用程式的 API 存取權。

  • 如果發生服務帳戶憑證遭駭的潛在安全事件,可以降低憑證曝露的風險。

事前準備

請採取下列步驟以啟用 Kubernetes Engine API:
  1. 造訪 Google Cloud Platform 主控台的 Kubernetes Engine 頁面
  2. 建立或選取專案。
  3. 等待 API 和相關服務完成啟用。這可能需要幾分鐘的時間。
  4. 請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

請安裝下列指令列工具,我們將在本教學課程中使用這些工具:

  • gcloud 可用來建立和刪除 Kubernetes Engine 叢集。gcloud 會包含在 Google Cloud SDK 中。
  • kubectl 可用於管理 Kubernetes,這是 Kubernetes Engine 使用的叢集自動化調度管理系統。您可以使用 gcloud 來安裝 kubectl
    gcloud components install kubectl

設定 gcloud 指令列工具的預設設定

為了節省您在 gcloud 指令列工具中輸入專案 IDCompute Engine 區域選項的時間,建議您採用以下預設設定:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

啟用 Pub/Sub API

在本教學課程中,您必須在專案中啟用 Cloud Pub/Sub API,因為範例應用程式會使用 Pub/Sub API 接收來自 Pub/Sub 主題的訊息:

啟用 API

建立容器叢集

建立名為 pubsub-test 的容器叢集,以部署 Pub/Sub 訂閱者應用程式:

gcloud container clusters create pubsub-test

步驟 1:建立 Pub/Sub 主題

您將部署的 Pub/Sub 訂閱者應用程式會在 Pub/Sub 主題 echo 上使用名為 echo-read 的訂閱。請在部署應用程式之前建立這些資源:

gcloud pubsub topics create echo
gcloud pubsub subscriptions create echo-read --topic=echo

步驟 2:部署 Pub/Sub 訂閱者應用程式

下一個步驟是部署應用程式容器以擷取發佈至 Pub/Sub 主題的訊息。這個應用程式是透過 Google Cloud Pub/Sub 用戶端程式庫以 Python 語言編寫而成,您可以在 GitHub 上取得原始碼。

下列資訊清單檔案所述的部署會執行此應用程式 Docker 映像檔的單一執行個體:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pubsub
spec:
  selector:
    matchLabels:
      app: pubsub
  template:
    metadata:
      labels:
        app: pubsub
    spec:
      containers:
      - name: subscriber
        image: gcr.io/google-samples/pubsub-sample:v1

若要部署這個資訊清單,請以 pubsub.yaml 格式將其下載至您的電腦,並執行下列指令:

kubectl apply -f pubsub.yaml

應用程式完成部署後,請執行下列指令以查詢 Pod:

kubectl get pods -l app=pubsub
輸出:
NAME                      READY     STATUS             RESTARTS   AGE
pubsub-2009462906-1l6bh   0/1       CrashLoopBackOff   1          30s

您可以看到容器無法啟動並進入 CrashLoopBackOff 狀態。請執行下列指令,以檢查 Pod 的記錄:

kubectl logs -l app=pubsub
輸出:
...
google.gax.errors.RetryError: GaxError(Exception occurred in retry method
that was not classified as transient, caused by <_Rendezvous of RPC that
terminated with (StatusCode.PERMISSION_DENIED, Request had insufficient
authentication scopes.) l10n-attrs-original-order="of,RPC,that,terminated,with,Request,had,insufficient,authentication">)

堆疊追蹤及錯誤訊息指出應用程式無權查詢 Cloud Pub/Sub 服務。

步驟 3:建立服務帳戶憑證

若要將 Google Cloud Platform 服務的存取權授予在 GKE 上執行的應用程式,您必須使用服務帳戶

若要建立服務帳戶,請前往 GCP 主控台的服務帳戶,然後按一下「建立服務帳戶」

  1. 指定「服務帳戶名稱」(例如,pubsub-app)。
  2. 在「角色」下拉選單中,選擇 [Pub/Sub → Subscriber]。
  3. 點選 [建立金鑰] 並且選擇其類型為 JSON。
  4. 按一下 [建立]。

服務帳戶建立完成後,請將含有服務帳戶憑證的 JSON 金鑰檔案下載至您的電腦。您將使用此金鑰檔來設定應用程式驗證 Cloud Pub/Sub API。

步驟 4:將憑證匯入為密鑰

Kubernetes 提供 Secret 資源類型,可以將憑證儲存在容器叢集內,並直接在部署於 GKE 的應用程式中使用。

如要另存 JSON 密鑰文件為密鑰檔名 pubsub-key,您可以使用已下載之服務帳戶憑證文件的路徑,來執行以下指令:

kubectl create secret generic pubsub-key --from-file=key.json=PATH-TO-KEY-FILE.json

這個指令會建立名為 pubsub-key 的密鑰;此密鑰的 key.json 檔案含有您從 GCP 主控台下載的私密金鑰內容。建立密鑰後,您應從電腦中移除此金鑰檔案。

步驟 5:使用密鑰設定應用程式

若要在應用程式中使用 pubsub-key 密鑰,您必須修改部署規格以便執行下列作業:

  1. 使用密鑰定義磁碟區。
  2. 將密鑰磁碟區掛接到應用程式容器。
  3. 設定 GOOGLE_APPLICATION_CREDENTIALS 環境變數以指向密鑰磁碟區掛接中的金鑰檔案。

更新後的資訊清單檔案如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pubsub
spec:
  selector:
    matchLabels:
      app: pubsub
  template:
    metadata:
      labels:
        app: pubsub
    spec:
      volumes:
      - name: google-cloud-key
        secret:
          secretName: pubsub-key
      containers:
      - name: subscriber
        image: gcr.io/google-samples/pubsub-sample:v1
        volumeMounts:
        - name: google-cloud-key
          mountPath: /var/secrets/google
        env:
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/secrets/google/key.json

這個資訊清單檔案定義下列項目,以便讓應用程式可以使用憑證:

  • 名為 google-cloud-key 的磁碟區,此磁碟區使用名為 pubsub-key 的密鑰。

  • 磁碟區掛接,以便在容器的 /var/secrets/google 目錄中可以取得 google-cloud-key

  • GOOGLE_APPLICATION_CREDENTIALS 環境變數設為 /var/secrets/google/key.json,此值含有密鑰以磁碟區掛接至容器時的憑證檔案

請注意,Google Cloud 用戶端程式庫會自動辨識 GOOGLE_APPLICATION_CREDENTIALS 環境變數,在本例中,用戶端程式庫是指 Python 適用的 Cloud Pub/Sub 用戶端。

若要部署這個資訊清單,請將其下載至您的電腦做為 pubsub-with-secret.yaml,並執行下列指令:

kubectl apply -f pubsub-with-secret.yaml

正確部署完成後,Pod 狀態應列為 Running

kubectl get pods -l app=pubsub
輸出:
NAME                     READY     STATUS    RESTARTS   AGE
pubsub-652482369-2d6h2   1/1       Running   0          29m

步驟 6:測試接收 Pub/Sub 訊息

現在您已設定應用程式,請將訊息發佈至名為 echo 的 Pub/Sub 主題:

gcloud pubsub topics publish echo --message="Hello, world!"

在幾秒鐘內,應用程式應該就會選取該訊息並列印至輸出串流。若要檢查已部署的 Pod 中的記錄,請執行下列指令:

kubectl logs -l app=pubsub
輸出:
Pulling messages from Pub/Sub subscription...
[2017-06-19 12:31:42.501123] ID=130941112144812 Data=Hello, world!

您已在 GKE 上成功設定應用程式,可以使用服務帳戶憑證來驗證 Pub/Sub API!

清除

如要避免系統向您的 Google Cloud Platform 帳戶收取您在本教學課程中使用資源的相關費用:

  1. 清除 Pub/Sub 訂閱與主題:

    gcloud pubsub subscriptions delete echo-read
    gcloud pubsub topics delete echo
  2. 刪除容器叢集:

    gcloud container clusters delete pubsub-test

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

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

這個網頁
Kubernetes Engine 教學課程