创建 Harbor 项目

在 Harbor 中,项目是用于组织和管理容器映像集合的逻辑单元。它提供了一种将相关制品分组在一起并对整个集合应用特定政策、访问权限控制和复制规则的方法。在创建项目之前,无法将映像推送或拉取到 Harbor。

准备工作

在开始之前,您必须至少登录一次 Harbor 界面,以使用 Harbor 注册表初始化您的身份。

所需 IAM 角色

如需创建 Harbor 项目和管理映像命名空间,请与您的 IAM 项目管理员联系,请求获取 Harbor 项目创建者 (harbor-project-creator) 角色,该角色可让您在项目命名空间中创建、获取和监视 Harbor 项目。此角色包含定义新映像命名空间所需的权限,以便您为容器化应用建立安全边界。

创建 Harbor 项目

使用 GDC 控制台、gdcloud CLI 或 API 创建 Harbor 项目。

控制台

在 GDC 控制台中,按以下步骤操作:

  1. 点击导航菜单中 CI/CD 部分的 Harbor Container Registry 链接。
  2. 点击创建 Harbor 项目。
  3. 输入项目的名称。
  4. 可选:漏洞扫描功能默认处于启用状态。如需为 Harbor 项目停用自动漏洞扫描,请点击为项目启用漏洞扫描切换开关。如需了解详情,请参阅扫描漏洞。
  5. 点击创建。
  6. 系统会显示一条确认消息,说明您的项目已成功创建。
  7. 创建 Harbor 项目后,登录 Harbor 界面以确认您可以查看 Harbor 项目。

gdcloud

创建 Harbor 项目:

  gdcloud harbor harbor-projects create HARBOR_PROJECT \
    --project=PROJECT \
    --instance=INSTANCE

替换以下内容:

  • HARBOR_PROJECT:要创建的 Harbor 项目的名称。
  • PROJECT:GDC 项目的名称。
  • INSTANCE:实例的名称。

API

GDC 控制台和 gdcloud CLI 会将 Harbor 项目创建者设置为您的用户账号。使用 API 时,您必须自行设置 spec.creatorSubject 字段。

  1. 在可用区级管理 API 服务器上创建 HarborInstanceProject 自定义资源。创建资源后,您无法更改 creatorSubject 或 autoScan 字段,因此请在创建资源之前检查这两个值。

    kubectl --kubeconfig MANAGEMENT_API_SERVER create -f - <<EOF
    apiVersion: artifactregistry.gdc.goog/v1
    kind: HarborInstanceProject
    metadata:
      name: INSTANCE-HARBOR_PROJECT
      namespace: PROJECT
    spec:
      projectName: HARBOR_PROJECT
      harborInstanceRef:
        name: INSTANCE
      creatorSubject:
        apiGroup: rbac.authorization.k8s.io
        kind: User
        name: HARBOR_USERNAME
      autoScan: true
    EOF
    

    替换以下内容:

    • MANAGEMENT_API_SERVER:可用区级管理 API 服务器的 kubeconfig 文件的路径。如需了解详情,请参阅切换到可用区级上下文。
    • INSTANCE:Harbor 注册表实例的名称。
    • HARBOR_PROJECT:要创建的 Harbor 项目的名称。
    • PROJECT:包含 Harbor 注册表实例的 GDC 项目的名称。
    • HARBOR_USERNAME:您的 Harbor 用户名,与您登录后在 Harbor 界面用户菜单中显示的用户名完全相同。此用户将成为 Harbor 项目的 Harbor 项目管理员。请使用人员的用户名,而不是服务账号。如需了解详情,请参阅准备工作。

    autoScan 字段可为推送到项目的映像启用自动漏洞扫描。如需停用自动扫描,请将其设置为 false。如需了解详情,请参阅扫描漏洞。

  2. 验证是否已创建 Harbor 项目并分配了创建者:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      get harborinstanceproject INSTANCE-HARBOR_PROJECT \
      -n PROJECT
    

    PROJECTCREATEDSTATUS 列显示 Created,PROJECTSUBJECTASSIGNEDSTATUS 列显示 SubjectAssigned。

    如果 PROJECTSUBJECTASSIGNEDSTATUS 列显示 SubjectAssignError,请检查条件消息:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      describe harborinstanceproject INSTANCE-HARBOR_PROJECT \
      -n PROJECT
    

    user ... not found 消息表示 creatorSubject 字段中指定的用户尚未登录 Harbor 界面。Harbor 服务每 30 秒重试一次,因此在用户登录后,状态会更改为 SubjectAssigned。

修复在没有创建者的情况下创建的 Harbor 项目

如果贵组织任何项目中的 HarborInstanceProject 资源未设置 spec.creatorSubject 字段,Harbor 服务将停止处理贵组织中 Harbor 资源的更改。症状包括 Harbor 实例未准备就绪、新的 Harbor 项目保持无状态,以及映像拉取失败并出现 x509: certificate signed by unknown authority 错误。

如需解决此问题,您需要在包含受影响资源的项目中拥有 Harbor Instance Admin (harbor-instance-admin) 角色。如果您没有此角色,请让拥有此角色的用户完成这些步骤。如果您不知道哪个资源受到影响,请与您的基础架构运营商 (IO) 联系,他们可以在 Harbor 服务日志中找到该资源。

  1. 检查受影响的 HarborInstanceProject 资源是否设置了 spec.creatorSubject 字段:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      get harborinstanceproject HARBOR_INSTANCE_PROJECT \
      -n PROJECT -o jsonpath='{.spec.creatorSubject}'
    

    替换以下内容:

    • MANAGEMENT_API_SERVER:可用区级管理 API 服务器的 kubeconfig 文件的路径。如需了解详情,请参阅切换到可用区级上下文。
    • HARBOR_INSTANCE_PROJECT:HarborInstanceProject 资源的名称。您通过此页面上的 API 标签页创建的资源名为 INSTANCE-HARBOR_PROJECT。
    • PROJECT:包含资源的 GDC 项目的名称。

    输出为空表示未设置该字段。

  2. 与 GDC 项目的所有者确认要分配为 Harbor 项目管理员的 Harbor 用户名。由于您在设置 spec.creatorSubject 字段后无法更改该字段,因此请先验证用户名,然后再将该字段添加到每个受影响的资源:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      patch harborinstanceproject HARBOR_INSTANCE_PROJECT \
      -n PROJECT --type merge \
      -p '{"spec":{"creatorSubject":{"apiGroup":"rbac.authorization.k8s.io","kind":"User","name":"HARBOR_USERNAME"}}}'
    

    将 HARBOR_USERNAME 替换为要分配为 Harbor 项目管理员的用户的 Harbor 用户名。此角色可以删除映像和管理项目成员。用户必须至少登录过一次 Harbor 界面,并且用户名必须与 Harbor 界面用户菜单中显示的名称完全一致。

  3. 验证创建者是否已分配:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      get harborinstanceproject HARBOR_INSTANCE_PROJECT \
      -n PROJECT
    

    所有受影响的资源都修复后,Harbor 服务会在大约 10 分钟内重启并恢复处理更改,并且 PROJECTSUBJECTASSIGNEDSTATUS 列会显示 SubjectAssigned。如果 15 分钟后从 Harbor 拉取映像仍然失败,请与您的 IO 联系。向 IO 提供您已修复的资源的名称和项目,以便 IO 可以检查其他受影响的资源,并在需要时重启 Harbor 服务。

后续步骤

创建 Harbor 项目后,请配置 Docker 和 Helm 客户端以连接到 Harbor 注册表: