在 Harbor 中,项目是用于组织和管理容器映像集合的逻辑单元。它提供了一种将相关制品分组在一起并对整个集合应用特定政策、访问权限控制和复制规则的方法。在创建项目之前,无法将映像推送或拉取到 Harbor。
准备工作
在开始之前,您必须至少登录一次 Harbor 界面,以使用 Harbor 注册表初始化您的身份。
所需 IAM 角色
如需创建 Harbor 项目和管理映像命名空间,请与您的 IAM 项目管理员联系,请求获取 Harbor 项目创建者 (harbor-project-creator) 角色,该角色可让您在项目命名空间中创建、获取和监视 Harbor 项目。此角色包含定义新映像命名空间所需的权限,以便您为容器化应用建立安全边界。
创建 Harbor 项目
使用 GDC 控制台、gdcloud CLI 或 API 创建 Harbor 项目。
控制台
在 GDC 控制台中,按以下步骤操作:
- 点击导航菜单中 CI/CD 部分的 Harbor Container Registry 链接。
- 点击创建 Harbor 项目。
- 输入项目的名称。
- 可选:漏洞扫描功能默认处于启用状态。如需为 Harbor 项目停用自动漏洞扫描,请点击为项目启用漏洞扫描切换开关。如需了解详情,请参阅扫描漏洞。
- 点击创建。
- 系统会显示一条确认消息,说明您的项目已成功创建。
- 创建 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 字段。
在可用区级管理 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。如需了解详情,请参阅扫描漏洞。验证是否已创建 Harbor 项目并分配了创建者:
kubectl --kubeconfig MANAGEMENT_API_SERVER \ get harborinstanceproject INSTANCE-HARBOR_PROJECT \ -n PROJECTPROJECTCREATEDSTATUS列显示Created,PROJECTSUBJECTASSIGNEDSTATUS列显示SubjectAssigned。如果
PROJECTSUBJECTASSIGNEDSTATUS列显示SubjectAssignError,请检查条件消息:kubectl --kubeconfig MANAGEMENT_API_SERVER \ describe harborinstanceproject INSTANCE-HARBOR_PROJECT \ -n PROJECTuser ... 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 服务日志中找到该资源。
检查受影响的
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 项目的名称。
输出为空表示未设置该字段。
与 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 界面用户菜单中显示的名称完全一致。验证创建者是否已分配:
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 注册表: