4

我有一個簡單的應用程序,可以從數據存儲獲取和放置信息。無法從Google Kubernetes引擎羣集訪問Google Cloud Datastore

它的工作原理無處不在,但是當我從Kubernetes引擎集羣中運行它,我得到這個輸出:

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語言。

我不知道爲什麼我得到這個錯誤,因爲應用程序在其他地方工作得很好。

更新:

尋找一個答案,我發現在谷歌羣組這個評論:一對夫婦的配置

爲了從GCE使用雲存儲,實例必須是額外的範圍。這些不能被添加到現有 GCE實例,但你可以創建一個新的與 以下雲SDK命令:

gcloud計算實例創建Hello-數據存儲--project --zone --scopes數據存儲用戶信息 - 電子郵件

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

更新2:

我可以看到我的創建羣集時,我沒有啓用任何權限(這是默認情況下,大多數服務已禁用)。我想這是什麼導致了問題:

奇怪的是,我可以用CLOUDSQL就好了,即使它已禁用(使用cloudsql_proxy容器)。

+0

你只是試圖在實例本身的編輯權限? – vjdhama

回答

3

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

  • 在創建一個Kubernetes集羣您可以指定將要創建的GCE節點上的權限。

  • 例如,如果您在創建期間在羣集節點上啓用數據存儲訪問,則您將能夠直接從Pod訪問數據存儲,而無需另外設置其他任何設置。

  • 如果您的羣集節點權限在大多數情況下都是禁用的(默認設置),您將需要爲每個想要使用GCP資源(如Datastore)的應用程序創建適當的服務帳戶。

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

所以在這一天結束時,我通過創建爲我的應用服務帳戶,下載JSON認證密鑰固定的問題,創造一個Kubernetes祕密它包含的關鍵,而在數據存儲的情況下,我將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 
相關問題