このページでは、Managed Harbor Service(MHS)認証情報ヘルパーまたは CLI シークレットを使用して Docker または Helm にログインする方法について説明します。
Google Distributed Cloud(GDC)エアギャップの Harbor レジストリ インスタンスは、認証に Identity-Aware Proxy(IAP)を使用します。Docker CLI または Helm CLI から Harbor レジストリ インスタンスにログインするには、次のいずれかの方法を使用します。
- MHS 認証情報ヘルパー(
docker-credential-mhs): 認証済みの GDC ID を使用して、IAP 認証を自動的に処理します。gdcloud CLI でログインすると、docker-credential-mhsは認証されたユーザー ID を取得し、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 インスタンスの詳細を表示するために必要な権限が含まれているため、認証用のレジストリ URL を取得できます。
MHS 認証情報ヘルパーを使用してログインする
docker-credential-mhs での認証方法は、CLI クライアントによって異なります。認証情報を自動的に取得するように Docker を構成することも、一時的な認証情報を直接取得して Docker にログインすることもできます。
Docker にログインする
Docker で認証するには、次の操作を行います。
ログインの手順に沿って、gdcloud CLI を使用して Management API サーバーにログインします。
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}次のように置き換えます。
PROJECT_NAME: テナント プロジェクトの名前。これは、Harbor インスタンスの作成時に指定したプロジェクト名と同じです。HARBOR_INSTANCE_NAME: Harbor レジストリ インスタンスを作成するで作成した Harbor インスタンスの名前。
Harbor ルート CA を信頼するように Docker を構成するの手順に沿って操作します。
省略可:
mhsエントリが~/.docker/config.jsonに追加されていることを確認して、認証情報ヘルパーが正常に構成されていることを確認します。cat DOCKER_CONFIG_PATHDOCKER_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"の正常な出力を示しています。gdcloud CLI でテナント プロジェクトを構成します。
TENANT_PROJECT=PROJECT_NAME gdcloud config set project $TENANT_PROJECT次の出力が表示されます。
Updated property [core/project].管理アクセス権を持つ Harbor プロジェクトを特定します。存在しない場合は、Harbor プロジェクトを作成します。
イメージの 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}/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 で認証する手順は次のとおりです。
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"}認証情報を使用して 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 シークレットを使用して Docker または Helm にログインする手順は次のとおりです。
- IAP ユーザー アカウントで Harbor にログインします。
- ユーザー名をクリックし、[ユーザー プロフィール] を選択します。
- アカウントに関連付けられている CLI シークレットをコピーするには、 [コピー] をクリックします。
省略可: 新しい CLI シークレットを自動生成または手動作成するためのボタンを表示するには、ユーザー プロファイルの [その他] をクリックします。
新しい CLI シークレットを生成した場合は、 [コピー] をクリックしてコピーします。
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。
次のステップ
Docker と Helm にログインすると、レジストリが接続され、使用を開始できます。