登入 Docker 和 Helm

本頁面說明如何使用代管 Harbor 服務 (MHS) 憑證輔助程式或 CLI 密鑰,登入 Docker 或 Helm。

Google Distributed Cloud (GDC) 實體隔離方案中的 Harbor 登錄檔執行個體,會使用 Identity-Aware Proxy (IAP) 進行驗證。您可以透過 Docker 或 Helm CLI,使用下列任一方法登入 Harbor 登錄檔執行個體:

  • MHS 憑證輔助程式 (docker-credential-mhs):使用已驗證的 GDC 身分,自動處理 IAP 驗證。使用 gdcloud CLI 登入後,docker-credential-mhs 會擷取已驗證的使用者身分,並透過 Harbor 驗證您的存取權。驗證完成後,Harbor 會向 Docker 或 Helm 提供短期權杖,讓您執行登錄檔作業,不必建立或管理個別的 CLI 密鑰。
  • CLI 密鑰:使用 Harbor 使用者個人資料中的靜態 CLI 密鑰。首次使用 IAP 登入 Harbor 網頁介面後,您可以擷取 CLI 密鑰,並在透過 Docker 或 Helm CLI 登入時,將其做為密碼使用。這個方法僅適用於 Harbor UI。

事前準備

如要為 Harbor 登錄檔執行個體設定 Docker 和 Helm 驗證,您必須在環境中安裝 MHS 憑證輔助程式 (docker-credential-mhs)。gdcloud CLI 套件預設包含憑證輔助程式。詳情請參閱「gdcloud CLI 總覽」。

必要的 IAM 角色

如要設定 Harbor 登錄檔執行個體的驗證機制,請與 IAM 專案管理員聯絡,要求取得 Harbor 執行個體檢視者 (harbor-instance-viewer) 角色,以便取得、列出及監控專案命名空間中的 Harbor 執行個體。這個角色具備必要權限,可查看現有 Harbor 執行個體的詳細資料,以便擷取登錄檔網址進行驗證。

使用 MHS 憑證輔助程式登入

向 docker-credential-mhs 驗證身分的方式取決於 CLI 用戶端:您可以設定 Docker 自動擷取憑證,或直接擷取臨時憑證來登入 Docker。

登入 Docker

如要使用 Docker 進行驗證,請按照下列步驟操作:

  1. 按照「登入」中的操作說明,使用 gdcloud CLI 登入 Management API 伺服器。

  2. 設定 Docker 使用 MHS 憑證輔助程式 docker-credential-mhs:

    TENANT_PROJECT=PROJECT_NAME
    HARBOR_INSTANCE_NAME=HARBOR_INSTANCE_NAME
    REGISTRY=$(kubectl get harborinstance $HARBOR_INSTANCE_NAME -n $TENANT_PROJECT -o jsonpath='{.status.url}' | sed s#https://##)
    
    docker-credential-mhs configure-docker --registries=${REGISTRY}
    

    更改下列內容:

  3. 按照「將 Docker 設為信任 Harbor 根 CA」中的操作說明進行。

  4. 選用:確認 mhs 項目已新增至 ~/.docker/config.json,驗證憑證輔助程式是否已成功設定:

    cat DOCKER_CONFIG_PATH
    

    將 DOCKER_CONFIG_PATH 替換為 Docker 設定檔的路徑,例如 ~/.docker/config.json。

    輸出結果會與下列內容相似:

    {
        "auths": {
            "10.200.0.1": {
                "auth": "YWRtaW46YWRtaW4="
            },
            "10.200.16.5:10443": {
                "auth": "YWRtaW46ZEROVVJCVWE1a1FBcE4xQQ=="
            }
        },
        "credHelpers": {
            "asia.gcr.io": "gcloud",
            "eu.gcr.io": "gcloud",
            "gcr.io": "gcloud",
            "marketplace.gcr.io": "gcloud",
            "myinstance-e2e-test-user.org-1.zone1.google.gdch.test": "mhs",
            "staging-k8s.gcr.io": "gcloud",
            "us-central1-docker.pkg.dev": "gcloud",
            "us.gcr.io": "gcloud"
        }
    }
    

    這個範例顯示 "myinstance-e2e-test-user.org-1.zone1.google.gdch.test": "mhs" 的成功輸出內容。

  5. 在 gdcloud CLI 中設定租戶專案:

    TENANT_PROJECT=PROJECT_NAME
    gdcloud config set project $TENANT_PROJECT
    

    系統會顯示下列輸出內容:

    Updated property [core/project].
    
  6. 找出您具備管理權限的 Harbor 專案。如果沒有,請建立 Harbor 專案。

  7. 執行 Docker 作業,例如推送或提取映像檔:

    TENANT_PROJECT=PROJECT_NAME
    HARBOR_INSTANCE_NAME=HARBOR_INSTANCE_NAME
    REGISTRY=$(kubectl get harborinstance $HARBOR_INSTANCE_NAME -n $TENANT_PROJECT -o jsonpath='{.status.url}' | sed s#https://##)
    HARBOR_PROJECT=HARBOR_PROJECT_NAME
    
    # Push image
    docker pull nginx
    docker tag nginx ${REGISTRY}/${HARBOR_PROJECT}/nginx:latest
    docker push ${REGISTRY}/${HARBOR_PROJECT}/nginx:latest
    
    # Pull image
    docker pull ${REGISTRY}/${HARBOR_PROJECT}/nginx:latest
    

    如果成功,輸出結果會與下列內容相似:

    # Push image
    root@gpc-adhoc-70846130vm-bootstrapper-zone1:~# docker push ${REGISTRY}/harbor-project/nginx:latest
    The push refers to repository [myinstance-e2e-test-user.org-1.zone1.google.gdch.test/harbor-project/nginx]
    e4e9e9ad93c2: Pushed
    6ac729401225: Pushed
    8ce189049cb5: Pushed
    296af1bd2844: Pushed
    63d7ce983cd5: Pushed
    b33db0c3c3a8: Pushed
    98b5f35ea9d3: Pushed
    latest: digest: sha256:7ba542bde95e6523a4b126f610553e3657b8108bc3175596ee7e911ae1219bfc size: 1778
    
    # Pull image
    root@gpc-adhoc-70846130vm-bootstrapper-zone1:~# docker pull ${REGISTRY}/library/nginx:latest
    latest: Pulling from library/nginx
    Digest: sha256:7ba542bde95e6523a4b126f610553e3657b8108bc3175596ee7e911ae1219bfc
    Status: Image is up to date for myinstance-e2e-test-user.org-1.zone1.google.gdch.test/harbor-project/nginx:latest
    

    如果作業失敗,您可能會看到以下輸出內容:

    E1025 19:21:39.322290 1273587 get.go:24] failed to get user name: user is not logged in or login expired, please login again
    

    在這個範例中,GDC 驗證工作階段已過期,您必須再次登入 GDC。詳情請參閱「登入」。

登入 Helm

如要使用 Helm 進行驗證,請按照下列步驟操作:

  1. 向 GDC 驗證後,請從憑證輔助程式擷取使用者憑證:

    echo $REGISTRY | docker-credential-mhs get
    

    輸出結果會與下列內容相似:

    {"Username":"tokenreview$fop-infrastructure-operator@example.com","Secret":"STS-Bearer-3q2o6mBKk44Gzi4105vyiSnXMuixtnm-RnyxSgJtnYkNbGV7drpwgIuftinAXVlo0Im9kgoGmc2WcZTSjE-vh2a71Su7YjB6qIAjAQ5ABkY03AHNfkHhRZzxthumDIVAd08wm2weit3_NpMPgOnf9qMblds_Q0PAWk2OhpodBpCfyl3LWZpIZBaNVgtg-TB_7fjpEDOm-_Q5VYABScOgZFP_bw"}
    
  2. 使用憑證登入 Helm CLI。系統提示輸入憑證時,請使用憑證輔助程式傳回的憑證。

    helm registry login $REGISTRY
    Username: tokenreview$fop-infrastructure-operator@example.com
    Password: STS-Bearer-3q2o6mBKk44Gzi4105vyiSnXMuixtnm-RnyxSgJtnYkNbGV7drpwgIuftinAXVlo0Im9kgoGmc2WcZTSjE-vh2a71Su7YjB6qIAjAQ5ABkY03AHNfkHhRZzxthumDIVAd08wm2weit3_NpMPgOnf9qMblds_Q0PAWk2OhpodBpCfyl3LWZpIZBaNVgtg-TB_7fjpEDOm-_Q5VYABScOgZFP_bw
    

    這項作業的成功輸出內容如下所示:

    Login Succeeded
    

使用 CLI 密鑰登入

如要使用 CLI Secret 登入 Docker 或 Helm,請按照下列步驟操作:

  1. 使用 IAP 使用者帳戶登入 Harbor。
  2. 按一下使用者名稱,然後選取「使用者個人資料」。
  3. 如要複製與帳戶相關聯的 CLI 密鑰,請按一下 「Copy」(複製)。
  4. 選用:如要顯示自動產生或手動建立新 CLI 密鑰的按鈕,請按一下使用者個人資料中的 「More」(更多)。

  5. 如果您產生了新的 CLI 密鑰,請按一下 「Copy」(複製) 複製密鑰。

  6. 從 Docker 或 Helm CLI 登入 Harbor 時,請使用 CLI 密鑰做為密碼:

    docker login -u USERNAME -p CLI_SECRET HARBOR_INSTANCE_URL
    

    更改下列內容:

    • USERNAME:Harbor 帳戶使用者名稱。
    • CLI_SECRET:產生的 CLI 密鑰。
    • HARBOR_INSTANCE_URL:Harbor 執行個體的網址。

後續步驟

登入 Docker 和 Helm 後,系統會連結登錄檔,您就可以開始使用: