Harbor 是一个开源容器注册表。可以将用于 Harbor 注册表的 TKG 扩展部署为要部署到 Tanzu Kubernetes 集群的容器映像的专用注册表存储。

Harbor 扩展版本依赖关系

在由 Tanzu Kubernetes Grid 服务 置备的 Tanzu Kubernetes 集群中安装用于 Harbor 注册表的 TKG 扩展时,请遵循以下最低版本要求。
组件 最低版本
vCenter Server

7.0.2.00400

vSphere 命名空间

0.0.10-18245956

主管集群

v1.20.2+vmware.1-vsc0.0.10-18245956

Tanzu Kubernetes 版本

v1.20.7+vmware.1-tkg.1.7fb9067

Harbor 扩展必备条件

在部署用于 Harbor 注册表的 TKG 扩展 v1.3.1 之前,请遵循以下必备条件。

Harbor 扩展的其他要求

用于 Harbor 注册表的 TKG 扩展 v1.3.1 在安装前和安装后具有其他要求。
  • Harbor 扩展需要使用默认的 PVC 存储类。请参见查看 TKG 扩展的持久存储要求
  • Harbor 扩展需要 HTTP/S 输入。具体来说,Harbor 服务通过 Contour 扩展中的 Envoy 服务公开。作为必备条件,请部署 Contour 扩展。请参见部署和管理用于 Contour Ingress 的 TKG 扩展
    • 如果对 主管集群 使用的是 NSX-T 网络连接,请创建 LoadBalancer 类型的 Envoy 服务。
    • 如果对 主管集群 使用的是 vSphere vDS 网络连接,请创建 LoadBalancer 类型或 NodePort 类型的 Envoy 服务,具体取决于您的环境和要求。
  • Harbor 扩展需要使用 DNS。安装 Harbor 扩展后,需要配置 DNS。
    • 出于测试和验证目的,请将 Harbor 和 Notary FQDN 添加到本地 /etc/hosts 文件中。以下说明介绍了如何执行此操作。
    • 在生产环境中,Harbor 要求本地 DNS 服务器上具有 DNS 区域(如 BIND)或公有云上具有 DNS 区域(如 AWS Route53、Azure DNS 或 Google CloudDNS)。设置 DNS 后,要在 DNS 服务器中自动注册 Harbor FQDN,请安装外部 DNS 扩展。请参见部署和管理用于外部 DNS 服务发现的 TKG 扩展

部署 Harbor 扩展

用于 Harbor 注册表的 TKG 扩展将在集群上安装多个容器。有关详细信息,请参见 https://goharbor.io/
容器 资源类型 副本 描述
harbor-core 部署 1 用于 Envoy 的管理和配置服务器
harbor-database Pod 1 Postgres 数据库
harbor-jobservice 部署 1 Harbor 作业服务
harbor-notary-server 部署 1 Harbor Notary 服务
harbor-notary-signer 部署 1 Harbor Notary
harbor-portal 部署 1 Harbor Web 界面
harbor-redis Pod 1 Harbor Redis 实例
harbor-registry 部署 2 Harbor 容器注册表实例
harbor-trivy Pod 1 Harbor 映像漏洞扫描程序
要使用 TKG 扩展安装 Harbor 注册表,请完成以下步骤。
  1. 验证您是否已完成每个扩展必备条件。请参见Harbor 扩展必备条件Harbor 扩展的其他要求
  2. 将目录更改为 Harbor 扩展。
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/registry/harbor
  3. 创建 tanzu-system-registry 命名空间以及 Harbor 服务帐户和角色。
    kubectl apply -f namespace-role.yaml
  4. 创建 Harbor 数据值文件。
    cp harbor-data-values.yaml.example harbor-data-values.yaml
  5. harbor-data-values.yaml 中指定必需的密码和密钥。
    Harbor 注册表需要表中列出并描述的多个密码和密钥。
    密码或密码 描述
    harborAdminPassword Harbor 管理员的初始密码。
    secretKey 用于加密的密钥。必须是包含 16 个字符的字符串。
    database.password Postgres 数据库的初始密码。
    core.secret 核心服务器与其他组件通信时,将使用密钥。
    core.xsrfKey XSRF 密钥。必须是包含 32 个字符的字符串。
    jobservice.secret 作业服务与其他组件通信时,将使用密钥。
    registry.secret 密钥用于保护客户端和注册表存储后端的上载状态。
    要自动生成随机密码和密钥并填充 harbor-data-values.yaml 文件,请运行以下命令:
    bash generate-passwords.sh harbor-data-values.yaml
    成功后,您可能会看到以下消息:
    Successfully generated random passwords and secrets in harbor-data-values.yaml

    打开 harbor-data-values.yaml 文件并验证必需的密码和密钥。

  6. (如有必要)在 harbor-data-values.yaml 中指定其他 Harbor 配置值。通常更新的值可能包括以下字段:
    配置字段 描述
    hostname

    默认的 Harbor 主机名为 core.harbor.domain

    如有必要,可根据您的要求更改此值。

    port.https

    默认值为 443

    如果对 主管集群 使用的是 NSX-T 网络连接,进而使用 LoadBalancer 类型的 Envoy 输入服务,请将此设置保留为默认值 443

    如果对 主管集群 使用的是 vDS 网络连接,进而使用 NodePort 类型的 Envoy 输入服务,请将此值设置为与 Envoy 节点端口相匹配。

    clair.enabled

    为了支持 Trivy,Clair 映像扫描仪已弃用。这两者均在配置文件中启用。

    要禁用 Clair,请将其值设置为 false

    persistence.persistentVolumeClaim. <component>.accessMode

    此设置有多个实例。

    默认值为 ReadWriteOnce

    按照计划,即将发布的版本将支持 ReadWriteMany

    imageChartStorage.type

    默认值为 filesystem

    如有必要,请更改并配置所使用的存储。

    proxy 如果需要,请为 Harbor 配置代理。如果配置了代理,则需要默认值 noProxy
  7. 使用数据值创建密钥。
    kubectl create secret generic harbor-data-values --from-file=values.yaml=harbor-data-values.yaml -n tanzu-system-registry
    tanzu-system-registry 命名空间中创建了 secret/harbor-data-values。可通过运行以下命令对此进行验证:
    kubectl get secrets -n tanzu-system-registry
  8. 部署 Harbor 扩展。
    kubectl apply -f harbor-extension.yaml

    成功后,应该会看到 app.kappctrl.k14s.io/harbor created

  9. 检查 Harbor 应用程序的状态。
    kubectl get app harbor -n tanzu-system-registry
    成功后,状态将从 Reconciling 更改为 Reconcile succeeded
    NAME     DESCRIPTION   SINCE-DEPLOY   AGE
    harbor   Reconciling   96s            98s
    NAME     DESCRIPTION           SINCE-DEPLOY   AGE
    harbor   Reconcile succeeded   39s            2m29s
    如果状态为 Reconcile failed,请参见对 Harbor 注册表部署进行故障排除
  10. 查看有关 Harbor 扩展的详细信息。
    kubectl get app harbor -n tanzu-system-registry -o yaml
  11. 查看 Harbor 部署对象的状态。
    kubectl get deployments -n tanzu-system-registry

    成功后,您可能会看到以下部署:

    NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
    harbor-core            1/1     1            1           5m16s
    harbor-jobservice      1/1     1            1           5m16s
    harbor-notary-server   1/1     1            1           5m16s
    harbor-notary-signer   1/1     1            1           5m16s
    harbor-portal          1/1     1            1           5m16s
    harbor-registry        1/1     1            1           5m16s
  12. 查看 Harbor pod 的状态:
    kubectl get pods -n tanzu-system-registry
    NAME                                    READY   STATUS    RESTARTS   AGE
    harbor-core-9cbf4b79d-gxvgx             1/1     Running   0          7m11s
    harbor-database-0                       1/1     Running   0          7m11s
    harbor-jobservice-6b656ccb95-lm47d      1/1     Running   0          7m11s
    harbor-notary-server-8494c684db-gm7jf   1/1     Running   0          7m11s
    harbor-notary-signer-6f96b549d4-dzcnm   1/1     Running   0          7m11s
    harbor-portal-5b8f4ddbd-qdnp2           1/1     Running   0          7m11s
    harbor-redis-0                          1/1     Running   0          7m11s
    harbor-registry-688894c58d-72txm        2/2     Running   0          7m11s
    harbor-trivy-0                          1/1     Running   0          7m11s
  13. (如有必要)对 Harbor 安装进行故障排除。请参见对 Harbor 注册表部署进行故障排除

使用 LoadBalancer 类型的 Envoy 服务为 Harbor 配置 DNS(NSX-T 网络连接)

如果通过 LoadBalancer 公开必备的 Envoy 服务,请获取负载均衡器的外部 IP 地址,并创建 Harbor FQDN 的 DNS 记录。
  1. 获取 LoadBalancer 类型的 Envoy 服务的 External-IP 地址。
    kubectl get service envoy -n tanzu-system-ingress
    您应该会看到返回的 External-IP 地址,例如:
    NAME    TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
    envoy   LoadBalancer   10.99.25.220   10.195.141.17   80:30437/TCP,443:30589/TCP   3h27m
    或者,也可以使用以下命令获取 External-IP 地址。
    kubectl get svc envoy -n tanzu-system-ingress -o jsonpath='{.status.loadBalancer.ingress[0]}'
  2. 要验证 Harbor 扩展的安装,请使用映射到负载均衡器的 External-IP 地址的 Harbor 和 Notary FQDN 更新本地 /etc/hosts 文件,例如:
    127.0.0.1 localhost
    127.0.1.1 ubuntu
    # TKGS Harbor with Envoy Load Balancer IP
    10.195.141.17 core.harbor.domain
    10.195.141.17 core.notary.harbor.domain
    
  3. 要验证 Harbor 扩展的安装,请登录到 Harbor。请参见登录到 Harbor Web 界面
  4. 在 DNS 服务器上创建两个 CNAME 记录,以将 Envoy 服务负载均衡器 External-IP 地址映射到 Harbor FQDN 和 Notary FQDN。
  5. 安装外部 DNS 扩展。请参见部署和管理用于外部 DNS 服务发现的 TKG 扩展

使用 NodePort 类型的 Envoy 服务为 Harbor 配置 DNS(vDS 网络连接)

如果通过 NodePort 公开必备的 Envoy 服务,请获取工作节点的虚拟机 IP 地址,并创建 Harbor FQDN 的 DNS 记录。
注: 要使用 NodePort,必须在 harbor-data-values.yaml 文件中指定正确的 port.https 值。
  1. 将上下文切换到置备了集群的 vSphere 命名空间
    kubectl config use-context VSPHERE-NAMESPACE
  2. 列出集群中的节点。
    kubectl get virtualmachines
    您应该会看到集群节点,例如:
    NAME                                            POWERSTATE   AGE
    tkgs-cluster-X-control-plane-6dgln              poweredOn    6h7m
    tkgs-cluster-X-control-plane-j6hq6              poweredOn    6h10m
    tkgs-cluster-X-control-plane-xc25f              poweredOn    6h14m
    tkgs-cluster-X-workers-9twdr-59bc54dc97-kt4cm   poweredOn    6h12m
    tkgs-cluster-X-workers-9twdr-59bc54dc97-pjptr   poweredOn    6h12m
    tkgs-cluster-X-workers-9twdr-59bc54dc97-t45mn   poweredOn    6h12m
  3. 选择其中一个工作节点,然后使用以下命令对其进行描述。
    kubectl describe virtualmachines tkgs-cluster-X-workers-9twdr-59bc54dc97-kt4cm
  4. 找到虚拟机的 IP 地址,例如 Vm Ip: 10.115.22.43
  5. 要验证 Harbor 扩展的安装,请使用映射到工作节点 IP 地址的 Harbor 和 Notary FQDN 更新本地 /etc/hosts 文件,例如:
    127.0.0.1 localhost
    127.0.1.1 ubuntu
    # TKGS Harbor with Envoy NodePort
    10.115.22.43 core.harbor.domain
    10.115.22.43 core.notary.harbor.domain
    
  6. 要验证 Harbor 扩展的安装,请登录到 Harbor。请参见登录到 Harbor Web 界面
  7. 在 DNS 服务器上创建两个 CNAME 记录,以将工作节点 IP 地址映射到 Harbor FQDN 和 Notary FQDN。
  8. 安装外部 DNS 扩展。请参见部署和管理用于外部 DNS 服务发现的 TKG 扩展

登录到 Harbor Web 界面

安装并配置 Harbor 后,请登录并开始使用。
  1. 访问 Harbor 注册表 Web 界面 (https://core.harbor.domain) 或您使用的主机名。

    Harbor 注册表 Web 界面。

  2. 使用用户名 admin 和生成的密码(放在 harbor-data-values.yaml 文件中)登录到 Harbor。

    Harbor 登录页面,带有用户名 admin 和生成的密码。

  3. 验证您是否可以访问 Harbor 用户界面。

    登录后,将显示 Harbor 用户界面的“项目”选项卡。

  4. 获取 Harbor CA 证书。

    在 Harbor 界面中,选择项目 > ,或者创建新项目

    单击注册表证书并下载 Harbor CA 证书 (ca.crt)。

  5. 将 Harbor CA 证书添加到 Docker 客户端的信任库中,以便可以将容器映像推送到 Harbor 注册表以及从 Harbor 注册表中提取容器映像。请参见使用嵌入式 Harbor 注册表 证书配置 Docker 客户端
  6. 有关使用 Harbor 的详细信息,请参阅 Harbor 文档

对 Harbor 注册表部署进行故障排除

如果部署或协调失败,请运行 kubectl get pods -n tanzu-system-registry 以查看 pod 状态。harbor Pod 应为 Running。如果 pod 状态为 ImagePullBackOffImageCrashLoopBackOff,则无法提取容器映像。检查数据值和扩展 YAML 文件中的注册表 URL,并确保它们准确无误。

查看容器日志,其中 name-XXXX 是运行 kubectl get pods -A 时的唯一 pod 名称:
kubectl logs pod/harbor-XXXXX -c harbor -n tanzu-system-registry

更新 Harbor 扩展

可更新部署到 Tanzu Kubernetes 集群的 Contour 扩展。

  1. 从密钥获取 Harbor 数据值。
    kubectl get secret harbor-data-values -n tanzu-system-registry -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > harbor-data-values.yaml
    
  2. 更新 harbor-data-values.yaml 中的 Harbor 数据值。
  3. 更新 Harbor 数据值密钥。
    kubectl create secret generic harbor-data-values --from-file=values.yaml=harbor-data-values.yaml -n tanzu-system-registry -o yaml --dry-run | kubectl replace -f-
    
    将使用新数据值协调 Harbor 扩展。
    注: 默认情况下,kapp-controller 将每 5 分钟同步一次应用程序。更新应在 5 分钟或更短的时间内生效。如果希望更新立即生效,请将 harbor-extension.yaml 中的 syncPeriod 更改为更低的值,然后使用 kubectl apply -f harbor-extension.yaml 应用 Contour 扩展。
  4. 检查扩展的状态。
    kubectl get app harbor -n tanzu-system-registry

    更新 Contour 后,Contour 应用状态应更改为 Reconcile Succeeded

  5. 查看详细状态并进行故障排除。
    kubectl get app harbor -n tanzu-system-registry -o yaml

删除 Harbor 扩展

Tanzu Kubernetes 集群中删除 Harbor 扩展。

注: 按顺序完成步骤。在删除 Contour 扩展和应用之前,请不要删除 Contour 命名空间和角色对象。删除 Contour 命名空间和角色对象将删除 kapp-controller 使用的服务帐户。如果在删除应用和扩展之前删除了此服务帐户,可能会导致系统错误。
  1. 将目录更改为 Harbor 扩展文件的下载位置。
    cd /extensions/registry/harbor/
  2. 删除 Harbor 应用。
    kubectl delete app harbor -n tanzu-system-registry
    预期结果:
    app.kappctrl.k14s.io "harbor" deleted
  3. 验证是否已删除 Harbor 应用。
    kubectl get app Harbor -n tanzu-system-registry
    预期结果:应用结果为 Not Found
    apps.kappctrl.k14s.io "harbor" not found
  4. 删除注册表命名空间。
    只有在确认已完全删除 Harbor 扩展和应用后,才能安全地删除命名空间和角色对象。
    kubectl delete -f namespace-role.yaml
    预期结果:删除部署了 Harbor 的命名空间以及基于角色的关联访问控制对象。
    namespace "tanzu-system-registry" deleted
    serviceaccount "harbor-extension-sa" deleted
    role.rbac.authorization.k8s.io "harbor-extension-role" deleted
    rolebinding.rbac.authorization.k8s.io "harbor-extension-rolebinding" deleted
    clusterrole.rbac.authorization.k8s.io "harbor-extension-cluster-role" deleted
    clusterrolebinding.rbac.authorization.k8s.io "harbor-extension-cluster-rolebinding" deleted

升级 Harbor 扩展

如果部署了现有的 Harbor 扩展,可以将其升级到最新版本。
  1. 获取 Harbor configmap。
    kubectl get configmap harbor -n tanzu-system-harbor -o 'go-template={{ index .data "harbor.yaml" }}' > harbor-configmap.yaml
    
  2. 删除现有的 Harbor 部署。请参见删除 Harbor 扩展
  3. 部署 Harbor 扩展。请参见部署 Harbor 扩展