簡體   English   中英

無法從Google Kubernetes Engine群集訪問Google Cloud Datastore

[英]Can't access Google Cloud Datastore from Google Kubernetes Engine cluster

我有一個簡單的應用程序,從數據存儲區獲取和提取信息。

它可以在任何地方使用,但是當我從Kubernetes Engine集群中運行它時,我得到了這個輸出:

Error from Get()
rpc error: code = PermissionDenied desc = Request had insufficient authentication scopes.
Error from Put()
rpc error: code = PermissionDenied desc = Request had insufficient authentication scopes.

我正在使用cloud.google.com/go/datastore包和Go語言。

我不知道為什么我收到此錯誤,因為應用程序在其他地方工作正常。

更新:

正在尋找答案,我在Google網上論壇中發現了這條評論:

為了從GCE使用Cloud Datastore,需要為實例配置一些額外的范圍。 這些不能添加到現有GCE實例,但您可以使用以下Cloud SDK命令創建新實例:

gcloud compute instances創建hello-datastore --project --zone --scopes datastore userinfo-email

這是否意味着默認情況下我無法使用GKE中的數據存儲區?

更新2:

我可以看到,在創建我的集群時,我沒有啟用任何權限(默認情況下對大多數服務禁用)。 我想這就是造成這個問題的原因:

奇怪的是,即使它被禁用(使用cloudsql_proxy容器),我也可以使用CloudSQL。

所以我在調試這個問題的過程中學到的是:

  • 在創建Kubernetes群集期間,您可以為將要創建的GCE節點指定權限。

  • 例如,如果您在創建期間在群集節點上啟用數據存儲訪問,則可以直接從Pod訪問數據存儲,而無需設置任何其他內容。

  • 如果對像我這樣的大多數事物(默認設置)禁用了群集節點權限,則需要為每個想要使用GCP資源(如數據存儲區)的應用程序創建適當的服務帳戶。

  • 另一種方法是使用gcloud命令創建新節點池,設置所需的權限范圍,然后將所有部署遷移到新節點池(相當繁瑣)。

因此,在一天結束時,我通過為我的應用程序創建服務帳戶,下載JSON身份驗證密鑰,創建包含該密鑰的Kubernetes秘密來修復此問題,在Datastore的情況下,我將GOOGLE_APPLICATION_CREDENTIALS環境變量設置為已安裝的秘密JSON密鑰的路徑。

這樣,當我的應用程序啟動時,它會檢查GOOGLE_APPLICATION_CREDENTIALS變量是否存在,並根據變量指向的JSON密鑰對數據存儲區API訪問進行身份驗證。

部署YAML代碼段:

  ...
  containers:
  - image: foo
    name: foo
    env:
    - name: GOOGLE_APPLICATION_CREDENTIALS
      value: /auth/credentials.json
    volumeMounts:
    - name: foo-service-account
      mountPath: "/auth"
      readOnly: true
  volumes:
  - name: foo-service-account
    secret:
      secretName: foo-service-account

經過幾個小時的努力,我還能夠連接到數據存儲區。 以下是我的結果,大部分來自Google文檔

  1. 創建服務帳戶

    gcloud iam service-accounts create [SERVICE_ACCOUNT_NAME]

  2. 獲取完整的iam帳戶名稱

    gcloud iam service-accounts list

    結果將如下所示:

    [SERVICE_ACCOUNT_NAME]@[PROJECT_NAME].iam.gserviceaccount.com

  3. 授予所有者訪問服務帳戶項目的權限

    gcloud projects add-iam-policy-binding [PROJECT_NAME] --member serviceAccount:[SERVICE_ACCOUNT_NAME]@[PROJECT_NAME].iam.gserviceaccount.com --role roles/owner

  4. 創建密鑰文件

    gcloud iam service-accounts keys create mycredentials.json --iam-account [SERVICE_ACCOUNT_NAME]@[PROJECT_NAME].iam.gserviceaccount.com

  5. 創建app-key Secret

    kubectl create secret generic app-key --from-file=credentials.json=mycredentials.json

    然后,此app-key密鑰將安裝在deployment.yaml中

  6. 編輯解壓縮文件

deployment.yaml:

...
spec:
 containers:
 - name: app
   image: eu.gcr.io/google_project_id/springapplication:v1
   volumeMounts:
   - name: google-cloud-key
     mountPath: /var/secrets/google
   env:
   - name: GOOGLE_APPLICATION_CREDENTIALS
     value: /var/secrets/google/credentials.json
   ports:
   - name: http-server
     containerPort: 8080
 volumes:
 - name: google-cloud-key
   secret:
     secretName: app-key

我使用的是簡約的Dockerfile,如:

FROM SCRATCH
ADD main /
EXPOSE 80
CMD ["/main"]

在嘗試連接到GCP數據存儲區時,我的應用程序處於無限“掛起”狀態。 在玩了很多玩之后,我發現SCRATCH Docker鏡像可能缺少Google雲庫所需的某些環境工具/變量/庫。 使用此Dockerfile現在可以正常工作:

FROM golang:alpine
RUN apk add --no-cache ca-certificates
ADD main /
EXPOSE 80
CMD ["/main"]

它不要求我提供Google憑據環境變量。 庫似乎會自動了解它的運行位置(可能來自context.Background()?)並自動使用Google在GKE上創建集群時為您創建的默認服務帳戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM