12

我試圖讓Kubernetes從另一個項目的Google Container Registry中下載圖片。按照docs你應該使用創建的圖像上拉的祕密:爲不會過期的谷歌容器註冊表創建圖像拉密?

$ kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL 

但是我不知道什麼DOCKER_USERDOCKER_PASSWORD我應該使用與谷歌容器註冊認證?縱觀GCR docs它說,密碼是訪問令牌,你可以通過運行得到:

$ gcloud auth print-access-token 

這實際工作......一會兒。問題似乎是這個訪問令牌在一小時之後(我相信是)過期了。我需要一個密碼(或者其他東西),在創建我的圖像拉密時不會過期。否則,Kubernetes羣集無法在一小時左右後下載新圖像。什麼是正確的方法來做到這一點?

回答

9

這真的很棘手,但經過大量的跟蹤和錯誤,我想我已經得到了它的工作。

  1. 轉到谷歌開發者控制檯> API管理>憑據,然後單擊「創建憑證」,並創建了「服務帳戶鍵」
  2. 在「服務帳戶」,選擇新命名新鍵「GCR」(讓密鑰類型是JSON)
  3. 創建密鑰,並存儲在磁盤上的文件(從這裏開始,我們假定它是~/secret.json下儲存)。
  4. 現在,使用碼頭工人通過命令行登錄到GCR:

    $ docker login -e [email protected] -u _json_key -p "$(cat ~/secret.json)" https://eu.gcr.io

    這將在您的~/.docker/config.json文件中生成「https://eu.gcr.io」的條目。

  5. 將「https://eu.gcr.io」下的JSON結構複製到名爲「〜/ docker-config.json」的新文件中,刪除換行符!例如:

    {"https://eu.gcr.io": { "auth": "<key>","email": "your[email protected]"}}

  6. 的Base64編碼文件:

    $ cat ~/docker-config.json | base64

  7. 這將打印很長的base64編碼字符串複製此字符串並將其粘貼到圖片拉祕密的定義(稱爲~/pullsecret.yaml):

apiVersion: v1 
    kind: Secret 
    metadata: 
    name: mykey 
    data: 
    .dockercfg: <paste base64 encoded string here> 
    type: kubernetes.io/dockercfg 
  • 現在創建祕密:

    $ kubectl create -f ~/pullsecret.yaml

  • 現在可以使用該拉祕密從一個吊艙,例如:
  • apiVersion: v1 
    kind: Pod 
    metadata: 
        name: foo 
        namespace: awesomeapps 
    spec: 
        containers: 
        - image: "janedoe/awesomeapp:v1" 
         name: foo 
        imagePullSecrets: 
        - name: mykey 
    

    或者將其添加到service account

    +0

    感謝分享!我非常接近但嘗試使用已存在gcr.io憑據的現有'〜/ .docker/config',但我認爲它們與錯誤的服務帳戶綁定......或其他東西。無論如何,一對夫婦指出:當創建新的服務帳戶(步驟2)時,我不得不選擇一個角色,所以我選擇了似乎已經工作的Project> Viewer。另外,使用'base64'命令,你可以刪除'cat'並添加'-w 0'來避免換行符:'base64 -w 0〜/ docker-config.json' –

    +1

    另外,看起來他們已經[將祕密類型的名稱從'dockercfg'改爲'dockerconfigjson'](http://kubernetes.io/docs/user-guide/images/),這就是我使用的。我在k8s 1.4.0上。 –

    +0

    Aand另外一條評論...在第5步中,您遺漏了頂級的「{」auths「:'json鍵。從該文件中刪除換行符也不是必須的,但是您希望縮小docker配置的範圍,使其只需將您想要的權限複製到Kubernetes機密中。 –

    2

    還可以授予服務帳戶羣集運行作爲訪問GCS鬥:

    eu.artifacts.{project-id}.appspot.com 
    

    This答案有幾個gsutil命令來實現這一目標。

    +0

    是的, Google雲博客也提到了這一點:https://medium.com/google-cloud/using-single-docker-repository-with-multiple-gke-projects-1672689f780c – Sander

    4

    它與kubectl你下載your_service_account.json

    kubectl create secret docker-registry mydockercfg \ 
        --docker-server "https://eu.gcr.io" \ 
        --docker-username _json_key \ 
        --docker-email [email protected] \ 
        --docker-password=$(cat your_service_account.json) 
    

    一個重要的細節之後,從谷歌是參加在JSON所有的線成一排要容易得多。

    1

    official ways,您可以:

    $ docker login -e [email protected] -u _json_key -p "$JSON_KEY" https://gcr.io 
    

    注:電子郵件沒有被使用,所以你可以把任何你在它想要的。

    gcr.io更改爲Google Container Registry(例如eu.gcr.io)中顯示的任何域名。

    要獲得$JSON_KEY

    1. 轉到API Manager > Credentials
    2. 單擊 「創建憑證」>服務帳戶關鍵
      • 服務帳戶:新的服務帳戶
        • 名稱:任何你想要的,如Docker Registry (read-only)
        • 角色:存儲(向下滾動)>存儲對象查看器
      • 密鑰類型:JSON
    3. 下載爲keyfile.json
    4. JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
    5. 現在你可以使用它。

    登錄後,您可以運行docker pull。您也可以複製更新的~/.dockercfg以保留設置。

    1

    這個答案可以確保您的Kubernetes機密中只包含一組碼頭憑證,併爲您處理修整換行。

    按照從約翰最偉大的答案相同的前三個步驟:

    1. 轉到谷歌開發者控制檯> API管理>憑據,然後單擊「創建憑證」,並創建了「服務帳戶鍵」

    2. 在「服務帳戶」,選擇新命名新鍵「GCR」(讓密鑰類型是JSON)

    3. 創建密鑰,並存儲在磁盤上的文件(從這裏開始,我們假設它是根據存儲~/secret.json

    接下來,運行這些命令,生成並注入所需的泊塢窗憑證到您的集羣:

    export GCR_KEY_JSON=$(cat ~/secret.json | tr -d '\n') 
    mv ~/.docker/config.json ~/.docker/config-orig.json 
    cat >~/.docker/config.json <<EOL 
    { 
        "auths": { 
        "gcr.io": {} 
        } 
    } 
    EOL 
    docker login -e [email protected] -u _json_key -p "$GCR_KEY_JSON" https://gcr.io 
    export DOCKER_CONFIG_JSON_NO_NEWLINES=$(cat ~/.docker/config.json | tr -d '\n') 
    mv ~/.docker/config-orig.json ~/.docker/config.json 
    cat >secrets.yaml <<EOL 
    apiVersion: v1 
    kind: Secret 
    metadata: 
        name: gcr-key 
    data: 
        .dockerconfigjson: $(echo -n ${DOCKER_CONFIG_JSON_NO_NEWLINES} | base64 | tr -d '\n') 
    type: kubernetes.io/dockerconfigjson 
    
    EOL 
    kubectl create -f secrets.yaml 
    

    當你指定一個從GCR拉圖像豆莢,包括在gcr-key祕密名字你spec部分:

    spec: 
        imagePullSecrets: 
        - name: gcr-key 
        containers: 
        - image: ... 
    
    0

    無需像拉的祕密,可以通過IAM configur完成ation

    我試過其他的答案,但我無法得到圖像拉祕密的方法工作。

    但是我發現可以通過在Kubernetes集羣所在的項目中授予對計算引擎默認服務帳戶的訪問權限來完成此操作。此服務帳戶由GCP自動創建。

    如下所述: https://cloud.google.com/container-registry/docs/access-control#granting_users_and_other_projects_access_to_a_registry

    您需要執行以下命令授予訪問服務的集裝箱註冊表

    gsutil iam ch serviceAccount:[EMAIL-ADDRESS]:objectViewer gs://[BUCKET_NAME] 
    

    BUCKET_NAME的Cloud Storage值:

    artifacts.[PROJECT-ID].appspot.com for images pushed to gcr.io/[PROJECT-ID], or 
    [REGION].artifacts.[PROJECT-ID].appspot.com, where [REGION] is: 
    us for registry us.gcr.io 
    eu for registry eu.gcr.io 
    asia for registry asia.gcr.io 
    

    電子郵件地址:

    The email address of the service account called: **Compute Engine default service account** in the GCP project where the Kubernetes cluster run