![](/img/trans.png)
[英]Unable to access Google Cloud Storage from Google Kubernetes Engine using default service account and google cloud libraries
[英]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文檔 :
創建服務帳戶
gcloud iam service-accounts create [SERVICE_ACCOUNT_NAME]
獲取完整的iam帳戶名稱
gcloud iam service-accounts list
結果將如下所示:
[SERVICE_ACCOUNT_NAME]@[PROJECT_NAME].iam.gserviceaccount.com
授予所有者訪問服務帳戶項目的權限
gcloud projects add-iam-policy-binding [PROJECT_NAME] --member serviceAccount:[SERVICE_ACCOUNT_NAME]@[PROJECT_NAME].iam.gserviceaccount.com --role roles/owner
創建密鑰文件
gcloud iam service-accounts keys create mycredentials.json --iam-account [SERVICE_ACCOUNT_NAME]@[PROJECT_NAME].iam.gserviceaccount.com
創建app-key
Secret
kubectl create secret generic app-key --from-file=credentials.json=mycredentials.json
然后,此app-key
密鑰將安裝在deployment.yaml中
編輯解壓縮文件
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.