Harbor 是一个开源容器注册表。可以将用于 Harbor 注册表的 Tanzu 软件包安装为要部署到 TKG 2 集群的容器映像的专用注册表存储。

软件包要求

安装用于 Harbor 注册表的 Tanzu 软件包时,请遵循以下要求。
此外,Harbor 注册表在安装前和安装后还有其他要求。
  • Harbor 扩展需要 HTTP/S 输入。具体来说,Harbor 服务通过 Contour 扩展中的 Envoy 服务公开。作为必备条件,请部署 Contour 软件包。请参见使用 Kubectl 安装用于 Contour Ingress 的 Tanzu 软件包
    • 如果对 主管 使用的是 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 扩展。

Harbor 组件

用于 Harbor 注册表的 Tanzu 软件包将在集群中安装多个容器。有关详细信息,请参见 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 映像漏洞扫描程序

安装 Harbor 软件包

要使用 Tanzu 软件包安装 Harbor 注册表,请完成以下步骤。

  1. 创建 harbor.yaml 规范
    请参阅以下示例。将 harbor-data-values 部分中的值替换为环境的相应值,包括主机名、存储类、TLS 密钥和密码。
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: harbor-sa
      namespace: tkg-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: habor-role-binding
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
      - kind: ServiceAccount
        name: harbor-sa
        namespace: tkg-system
    ---
    apiVersion: packaging.carvel.dev/v1alpha1
    kind: PackageInstall
    metadata:
      name: harbor
      namespace: tkg-system
    spec:
      serviceAccountName: harbor-sa
      packageRef:
        refName: harbor.tanzu.vmware.com
        versionSelection:
          constraints: 2.5.3+vmware.1-tkg.1
      values:
      - secretRef:
          name: harbor-data-values
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: harbor-data-values
      namespace: tkg-system
    stringData:
      values.yml: |
        namespace: tanzu-system-registry
        hostname: harbor.example.com
        port:
          https: 443
        logLevel: info
        tlsCertificate:
          tls.crt: ""
          tls.key: ""
          ca.crt:
        tlsCertificateSecretName:
        enableContourHttpProxy: true
        harborAdminPassword: <ENTER-STRONG-PASSWORD-HERE>
        secretKey: <ENTER-SECRET-KEY>
        database:
          password: <ENTER-STRONG-PASSWORD-HERE>
          shmSizeLimit:
          maxIdleConns:
          maxOpenConns:
        exporter:
          cacheDuration:
        core:
          replicas: 1
          secret: <ENTER-SECRET>
          xsrfKey: <ENTER-XSRF-KEY-WHICH-IS-AN-ALPHANUMERIC-STRING-WITH-32-CHARS>
        jobservice:
          replicas: 1
          secret: <ENTER-SECRET>
        registry:
          replicas: 1
          secret: <ENTER-SECRET>
        notary:
          enabled: true
        trivy:
          enabled: true
          replicas: 1
          gitHubToken: ""
          skipUpdate: false
        persistence:
          persistentVolumeClaim:
            registry:
              existingClaim: ""
              storageClass: "tkg2-storage-profile"
              subPath: ""
              accessMode: ReadWriteOnce
              size: 50Gi
            jobservice:
              existingClaim: ""
              storageClass: "tkg2-storage-profile"
              subPath: ""
              accessMode: ReadWriteOnce
              size: 10Gi
            database:
              existingClaim: ""
              storageClass: "tkg2-storage-profile"
              subPath: ""
              accessMode: ReadWriteOnce
              size: 10Gi
            redis:
              existingClaim: ""
              storageClass: "tkg2-storage-profile"
              subPath: ""
              accessMode: ReadWriteOnce
              size: 10Gi
            trivy:
              existingClaim: ""
              storageClass: "tkg2-storage-profile"
              subPath: ""
              accessMode: ReadWriteOnce
              size: 10Gi
        proxy:
          httpProxy:
          httpsProxy:
          noProxy: 127.0.0.1,localhost,.local,.internal
        pspNames: vmware-system-restricted
        network:
          ipFamilies: ["IPv4", "IPv6"]
  2. 安装 Harbor。
    kubectl apply -f harbor.yaml

使用 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
    #TKG2 Harbor with Envoy Load Balancer IP
    10.195.141.17 core.harbor.domain
    10.195.141.17 core.notary.harbor.domain
    
  3. 要验证 Harbor 扩展的安装,请登录到 Harbor。
  4. 在 DNS 服务器上创建两个 CNAME 记录,以将 Envoy 服务负载均衡器 External-IP 地址映射到 Harbor FQDN 和 Notary FQDN。
  5. 安装外部 DNS 扩展。

使用 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
  3. 选择其中一个工作节点,然后使用以下命令对其进行描述。
    kubectl describe virtualmachines tkg2-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
    #TKG2 Harbor with Envoy NodePort
    10.115.22.43 core.harbor.domain
    10.115.22.43 core.notary.harbor.domain
    
  6. 要验证 Harbor 扩展的安装,请登录到 Harbor。
  7. 在 DNS 服务器上创建两个 CNAME 记录,以将工作节点 IP 地址映射到 Harbor FQDN 和 Notary FQDN。
  8. 安装外部 DNS 扩展。

登录到 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 注册表中提取容器映像。请参见将容器注册表与 主管 上的 TKG 2 集群配合使用
  6. 有关使用 Harbor 的详细信息,请参阅 Harbor 文档