Docker と Helm にログインする

このページでは、Managed Harbor Service(MHS)認証情報ヘルパーまたは CLI シークレットを使用して Docker または Helm にログインする方法について説明します。

柔軟性を確保するため、Google Distributed Cloud(GDC)エアギャップでは、Harbor レジストリ インスタンスから Docker と Helm で認証を行う 2 つの方法が用意されています。1 つ目の方法は、Managed Harbor Service(MHS)認証情報ヘルパーと GDC ID を使用して Docker または Helm CLI にログインすることです。GDC で認証すると、Harbor で個別の CLI シークレットを作成または管理することなく、Docker クライアントにログインして Docker オペレーションを実行できます。

2 つ目の方法は、CLI シークレットを使用する方法です。Identity-Aware Proxy(IAP)を使用して認証し、Harbor インターフェースに初めてログインしたら、Docker または Helm CLI を使用して Harbor にアクセスします。Docker CLI と Helm CLI は IAP のリダイレクトを処理できないため、Harbor は Docker または Helm からログインするときに使用する CLI シークレットを提供します。このメソッドは、Harbor が IAP 認証を使用している場合にのみ使用できます。

始める前に

Harbor レジストリ インスタンスの Docker と Helm の認証を構成するには、次のものが必要です。

  • 環境にインストールされている MHS 認証ヘルパー docker-credential-mhs。認証情報ヘルパーは、gdcloud CLI バンドルにデフォルトで含まれています。詳細については、gdcloud CLI の概要をご覧ください。
  • 必要な ID とアクセスロール。組織の IAM 管理者に、Harbor インスタンス閲覧者(harbor-instance-viewer)ロールを付与するよう依頼します。

GDC ID で Docker にログインする

GDC ID で MHS 認証ヘルパーを使用して、Docker CLI にログインします。Docker で認証を行うには、次の操作を行います。

  1. ログインの手順に沿って、GDC CLI で Management API サーバーにログインします。

  2. MHS 認証ヘルパー docker-credential-mhs を使用するように 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://##)
    
    docker-credential-mhs configure-docker --registries=${REGISTRY}
    

    次のように置き換えます。

  3. Harbor ルート CA を信頼するように Docker を構成するの手順に沿って操作します。

  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 でテナント プロジェクトを構成します。

    TENANT_PROJECT=PROJECT_NAME
    gdcloud config set project $TENANT_PROJECT
    

    次の出力が表示されます。

    Updated property [core/project].
    
  6. 管理アクセス権がある Harbor プロジェクトを特定します。Harbor プロジェクトを作成します(存在しない場合)。

  7. イメージの push や pull などの 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}/harbor-project/nginx:latest
    latest: Pulling from harbor-project/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 に再度ログインする必要があります。詳しくは、ログインをご覧ください。

GDC ID で Helm にログインする

GDC ID で MHS 認証情報ヘルパーを使用して Helm CLI にログインします。

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 シークレットを使用して Docker または Helm にログインする

CLI シークレットを使用して Docker または Helm にログインする手順は次のとおりです。

  1. IAP ユーザー アカウントで Harbor にログインします。
  2. ユーザー名をクリックし、[ユーザー プロフィール] を選択します。
  3. アカウントに関連付けられている CLI シークレットをコピーするには、 [コピー] をクリックします。
  4. 省略可: 新しい CLI シークレットを自動的に生成または手動で作成するボタンを表示するには、ユーザー プロフィールの 省略記号をクリックします。

  5. 新しい CLI シークレットを生成した場合は、 [コピー] をクリックしてコピーします。

  6. これで、Docker CLI または Helm CLI から Harbor にログインするときに、CLI シークレットをパスワードとして使用できます。

    docker login -u USERNAME -p CLI_SECRET HARBOR_INSTANCE_URL

次のように置き換えます。

  • USERNAME: Harbor アカウントのユーザー名
  • CLI_SECRET: 生成された CLI シークレット。
  • HARBOR_INSTANCE_URL: Harbor インスタンスの URL。