登录 Docker 和 Helm

本页面介绍了如何使用受管理的 Harbor 服务 (MHS) 凭据帮助程序或 CLI Secret 登录 Docker 或 Helm。

为了提供灵活性,Google Distributed Cloud (GDC) air-gapped 提供了两种方法,用于从 Harbor 注册表实例向 Docker 和 Helm 进行身份验证。第一种方法是使用受管理的 Harbor 服务 (MHS) 凭据帮助程序和您的 GDC 身份登录 Docker 或 Helm CLI。通过 GDC 进行身份验证后,您可以登录 Docker 客户端并执行 Docker 操作,而无需在 Harbor 中创建或管理单独的 CLI Secret。

第二种方法是使用 CLI Secret。使用 Identity-Aware Proxy (IAP) 进行身份验证并首次登录 Harbor 界面后,您可以使用 Docker 或 Helm CLI 访问 Harbor。Docker 和 Helm CLI 无法处理 IAP 的重定向,因此 Harbor 提供了一个 CLI Secret,以便在从 Docker 或 Helm 登录时使用。仅当 Harbor 使用 IAP 身份验证时,此方法才可用。

准备工作

如需为 Harbor 注册表实例配置 Docker 和 Helm 身份验证,您必须具备以下条件:

  • 环境中安装的 MHS 凭据帮助程序 docker-credential-mhs。凭据帮助程序默认包含在 gdcloud CLI 软件包中。如需了解详情,请参阅 gdcloud CLI 概览
  • 必要的身份和访问权限角色。请让您的组织 IAM 管理员为您授予 Harbor Instance Viewer (harbor-instance-viewer) 角色。

使用 GDC 身份登录 Docker

使用 MHS 凭据帮助程序和您的 GDC 身份登录 Docker CLI。如需使用 Docker 进行身份验证,请按以下步骤操作:

  1. 按照登录中的说明,使用 GDC 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 中配置租户项目:

    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}/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 身份登录 Helm

使用 MHS 凭据帮助程序和您的 GDC 身份登录 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 Secret 登录 Docker 或 Helm

如需使用 CLI Secret 登录 Docker 或 Helm,请按以下步骤操作:

  1. 使用 IAP 用户账号登录 Harbor。
  2. 点击您的用户名,然后选择用户个人资料
  3. 如需复制与您的账号关联的 CLI 密钥,请点击 复制
  4. 可选:如需显示用于自动生成或手动创建新 CLI Secret 的按钮,请点击用户个人资料中的 椭圆。

  5. 如果您生成了新的 CLI 密钥,请点击 Copy 进行复制。

  6. 现在,您可以在通过 Docker 或 Helm CLI 登录 Harbor 时,将 CLI Secret 用作密码:

    docker login -u USERNAME -p CLI_SECRET HARBOR_INSTANCE_URL

替换以下内容:

  • USERNAME:Harbor 账号用户名
  • CLI_SECRET:生成的 CLI 密钥。
  • HARBOR_INSTANCE_URL:Harbor 实例的网址。