为服务注册表安装 Harbor

本主题介绍了如何将 Harbor 部署到 Tanzu Kubernetes Grid 中的工作负载集群或共享服务集群。

注意

vSphere with Tanzu 上,可以在主管上安装 Harbor,如在主管上安装和配置 Harbor 中所述,也可以在各个工作负载集群中安装 Harbor,如下所述。
由于主管服务是共享的,因此 vSphere with Tanzu 不支持将软件包部署到单独的共享服务集群。

Harbor v2.6.0 发行说明中注释,Notary 和 Chartmuseum 已在 Harbor v2.6 中已被弃用,并计划在将来的版本中删除。用户应切换到 Sigstore Cosign 以进行容器签名和验证。

Harbor

Harbor 是一个开源、受信任的云原生容器注册表,用于存储、签名和扫描内容。Tanzu Kubernetes Grid 包含 Harbor 的签名、打包二进制文件,您可以将其部署到工作负载集群中,以便为该集群提供容器注册表服务。此 Harbor 软件包通过添加用户通常需要的功能(如安全和身份控制和管理)来扩展开源 Docker 分发。

Tanzu Kubernetes Grid 包括 Harbor 的签名二进制文件,您可以将其部署到:

  • 用于为该集群提供容器注册表服务的工作负载集群
  • 共享服务集群,用于在具有独立管理集群的部署中为其他工作负载集群提供容器注册表服务。

部署为共享服务时,Harbor 可用于由同一独立管理集群管理的所有工作负载集群。要将 Harbor 作为共享服务实施,请将其部署到专用于运行共享服务的特殊集群中。每个管理集群只能有一个共享服务集群。

Harbor 注册表和 ExternalDNS

VMware 建议在具有负载均衡功能的基础架构上与 Harbor 注册表一起安装 ExternalDNS,尤其是在 Harbor 可用性非常重要的生产环境或其他环境中。

如果输入负载均衡器的 IP 地址发生更改,ExternalDNS 将自动选取更改并将新地址重新映射到 Harbor 主机名。这样就无需按照连接到 Harbor 用户界面中所述手动重新映射地址。

必备条件

为 Harbor 部署准备集群

要为 Harbor 部署准备集群,请执行以下操作:

  1. kubectl 的上下文设置为工作负载集群或共享服务集群。例如:

    kubectl config use-context tkg-services-admin@tkg-services
    
  2. 如果集群尚未安装 standard 软件包存储库,请进行安装:

    注意

    如果要将基于计划的集群(旧版)作为目标,请跳过此步骤。对于基于计划的集群,在 tanzu-package-repo-global 命名空间中的每个集群能够自动启用 tanzu-standard 软件包存储库。

    tanzu package repository add tanzu-standard --url PACKAGE-REPOSITORY-ENDPOINT --namespace tkg-system
    

    其中,PACKAGE-REPOSITORY-ENDPOINTstandard 软件包存储库的 URL。对于此版本,URL 为 projects.registry.vmware.com/tkg/packages/standard/repo:v2.1.1

    要从 Tanzu CLI 获取此值,请参见列出软件包存储库,或在 Tanzu Mission Control 中查看集群 (Cluster) 窗格中的附加模块 (Addons) > 存储库 (Repositories) 列表。

  3. 如果尚未执行此操作,请安装证书管理器和 Contour 软件包。有关说明,请参见安装 Contour 以进行 Ingress 控制

  4. (可选)安装 ExternalDNS 软件包。有关说明,请参见安装 ExternalDNS 以进行服务发现

  5. 继续下面的将 Harbor 部署到集群中

将 Harbor 部署到集群

按照以下过程将 Harbor 部署到工作负载集群或共享服务集群中:

  1. 确认 Harbor 软件包在集群中可用:

    tanzu package available list -A
    
  2. 检索可用软件包的版本:

    tanzu package available list harbor.tanzu.vmware.com -A
    
  3. standard 软件包存储库下载 Harbor 软件包:

    imgpkg pull -b projects.registry.vmware.com/tkg/packages/standard/harbor:PACKAGE-VERSION -o /tmp/harbor-package-PACKAGE-VERSION
    

    其中,PACKAGE-VERSIONtanzu package available list 所列的软件包版本,但 _ 字符替代了 + 字符。还必须包含前缀 v。例如,v2.6.3_vmware.1-tkg.1

    例如:

    imgpkg pull -b projects.registry.vmware.com/tkg/packages/standard/harbor:v2.6.3_vmware.1-tkg.1 -o /tmp/harbor-package-v2.6.3_vmware.1-tkg.1
    
    1. 通过执行以下操作之一设置 harbor-data-values.yaml 文件中的必需密码和密钥:

      • 要自动生成随机密码和密钥,请运行:

        image_url=$(kubectl -n tkg-system get packages harbor.tanzu.vmware.com.PACKAGE-VERSION -o jsonpath='{.spec.template.spec.fetch[0].imgpkgBundle.image}')
        imgpkg pull -b $image_url -o /tmp/harbor-package-PACKAGE-VERSION
        
        cp /tmp/harbor-package-PACKAGE-VERSION/config/values.yaml harbor-data-values.yaml
        
        bash /tmp/harbor-package-PACKAGE-VERSION/config/scripts/generate-passwords.sh harbor-data-values.yaml
        

        其中,PACKAGE-VERSION 是要安装的 Harbor 软件包的版本。

        例如,对于 Harbor 软件包 v2.6.3,请运行:

        image_url=$(kubectl -n tkg-system get packages harbor.tanzu.vmware.com.2.6.3+vmware.1-tkg.1 -o jsonpath='{.spec.template.spec.fetch[0].imgpkgBundle.image}')
        imgpkg pull -b $image_url -o /tmp/harbor-package-2.6.3
        bash /tmp/harbor-package-2.6.3/config/scripts/generate-passwords.sh harbor-data-values.yaml
        
      • 要设置自己的密码和密钥,请更新 harbor-data-values.yaml 文件中的以下条目:

        • harborAdminPassword
        • secretKey
        • database.password
        • core.secret
        • core.xsrfKey
        • jobservice.secret
        • registry.secret
    2. harbor-data-values.yaml 文件中指定其他设置。

      • hostname 设置设定为要用于访问 Harbor 的主机名。例如,harbor.yourdomain.com
      • 要使用您自己的证书,请使用证书、密钥和 CA 证书的内容更新 tls.crttls.keyca.crt 设置。证书可以由受信任的颁发机构签名,也可以自签名。如果将这些设置留空,Tanzu Kubernetes Grid 将自动生成自签名证书。
      • 如果使用 generate-passwords.sh 脚本,则可以选择使用更易于记住的内容更新 harborAdminPassword
      • 以下情况需要非空值:

        • storageClass: 在 persistence.persistentVolumeClaim 下,对于 registryjobservicedatabaseredistrivy,请将 storageClass 设置为由 kubectl get sc 返回的存储配置文件。
        注意

        使用 azure-file 存储类时,您无法在挂载磁盘后更改文件系统权限,因为存在 Azure 文档中的使用 Azure 文件时出现“无法更改权限”错误中所述的 Azure 问题。

        • pspNames: 将 pspNames 设置为 kubectl get psp 返回的 PSP 值,例如,"vmware-system-restricted,vmware-system-privileged"
      • 另外,更新其他 persistence 设置以指定 Harbor 如何存储数据。

        如果需要在 Harbor 中存储大量容器映像,请将 persistence.persistentVolumeClaim.registry.size 设置为更大的数值。

      要查看有关 harbor-data-values.yaml 文件中的值的详细信息,请针对目标集群运行以下命令:

      tanzu package available get harbor.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
      

      其中,AVAILABLE-VERSION 是 Harbor 软件包的版本。--values-schema 标记从 Harbor 软件包的 Package API 资源中检索valuesSchema 部分。您可以将值结构定义的输出格式 --output 设置为 yamljsontable

      例如:

      tanzu package available get harbor.tanzu.vmware.com/2.6.3+vmware.1-tkg.1 --values-schema
      
    3. 移除 harbor-data-values.yaml 文件中的所有注释:

      yq -i eval '... comments=""' harbor-data-values.yaml
      
  4. 安装软件包:

    tanzu package install harbor \
    --package harbor.tanzu.vmware.com \
    --version AVAILABLE-PACKAGE-VERSION \
    --values-file harbor-data-values.yaml \
    --namespace TARGET-NAMESPACE
    

    其中:

    • TARGET-NAMESPACE 是要在其中安装 Harbor 软件包的命名空间。例如,my-packagestanzu-cli-managed-packages 命名空间。

      • 如果未指定 --namespace 标记,则 Tanzu CLI 会在 default 命名空间中安装软件包及其资源。与 Harbor 组件关联的 Harbor Pod 和任何其他资源是在 tanzu-system-registry 命名空间中创建的;请勿将 Harbor 软件包安装到此命名空间中。
      • 指定的命名空间必须已存在,例如,通过运行 kubectl create namespace my-packages
    • AVAILABLE-PACKAGE-VERSION 是上面检索到的版本。

    例如:

    tanzu package install harbor \
    --package harbor.tanzu.vmware.com \
    --version 2.6.3+vmware.1-tkg.1 \
    --values-file harbor-data-values.yaml \
    --namespace my-packages
    
  5. 如果使用 ebs.csi.aws.com 作为 storageClass,请执行以下操作之一:

    • 将存储类 VolumeBoundModeImmediate 更改为 WaitForFirstConsumer

      • 请注意,这是一个集群范围的操作,可能会影响 Harbor 以外的服务。
    • 修补 Harbor Scandata Volume EmptyDir 覆盖网络,如下所示。此覆盖网络会将 scandata 卷设置为空目录,以避免在将 jobLog 卷和 scandata 卷挂载到同一个 jobservice pod 时影响 scandata 导出功能和导致 AZ 冲突:

      1. 创建一个文件 scandata-empty-dir-overlay.yaml,其中包含下面的 Harbor Scandata 卷 EmptyDir 覆盖网络代码。

      2. 为覆盖网络创建通用密钥:

        kubectl -n test  create secret generic scandata-empty-dir-overlay -o yaml --dry-run=client --from-file=scandata-emptyDir-overlay.yaml | kubectl apply -f -
        
      3. 使用密钥修补 Harbor 软件包:
        kubectl -n test annotate packageinstalls harbor ext.packaging.carvel.dev/ytt-paths-from-secret-name.0=scandata-empty-dir-overlay
        
      4. 检查软件包状态是否为 isReconciling
        kubectl get pkgi harbor -n my-packages
        
      5. 如果软件包状态不是 isReconciling,请删除现有的 Harbor Pod,以便它们重新创建:
        kubectl delete pods --all -n my-packages
        
  6. 确认已安装 harbor 软件包:

    tanzu package installed list -A
    

    要查看有关软件包的更多详细信息,还可以运行:

    tanzu package installed get harbor --namespace PACKAGE-NAMESPACE
    

    其中,PACKAGE-NAMESPACE 是安装 harbor 软件包的命名空间。

  7. 确认 harbor 应用已在 PACKAGE-NAMESPACE 中成功协调:

    kubectl get apps -A
    

    如果状态不是 Reconcile Succeeded,请查看 harbor 应用的完整状态详细信息。查看完整状态可帮助您解决问题。

    kubectl get app harbor --namespace PACKAGE-NAMESPACE -o yaml
    

    其中,PACKAGE-NAMESPACE 是安装软件包的命名空间。如果故障排除无法帮助您解决问题,则必须先卸载软件包,然后再重新安装:

    tanzu package installed delete harbor --namespace PACKAGE-NAMESPACE
    
  8. 通过列出集群中的所有 Pod,确认 Harbor 服务正在运行:

    kubectl get pods -A
    

    tanzu-system-registry 命名空间中,您应该会看到在名称类似于以下内容的 Pod 中运行的 harbor coredatabasejobservicenotaryportalredisregistrytrivy 服务:

    NAMESPACE               NAME                                    READY   STATUS    RESTARTS   AGE
    [...]
    tanzu-system-ingress    contour-6b568c9b88-h5s2r                1/1     Running   0          26m
    tanzu-system-ingress    contour-6b568c9b88-mlg2r                1/1     Running   0          26m
    tanzu-system-ingress    envoy-wfqdp                             2/2     Running   0          26m
    tanzu-system-registry   harbor-core-557b58b65c-4kzhn            1/1     Running   0          23m
    tanzu-system-registry   harbor-database-0                       1/1     Running   0          23m
    tanzu-system-registry   harbor-jobservice-847b5c8756-t6kfs      1/1     Running   0          23m
    tanzu-system-registry   harbor-notary-server-6b74b8dd56-d7swb   1/1     Running   2          23m
    tanzu-system-registry   harbor-notary-signer-69d4669884-dglzm   1/1     Running   2          23m
    tanzu-system-registry   harbor-portal-8f677757c-t4cbj           1/1     Running   0          23m
    tanzu-system-registry   harbor-redis-0                          1/1     Running   0          23m
    tanzu-system-registry   harbor-registry-85b96c7777-wsdnj        2/2     Running   0          23m
    tanzu-system-registry   harbor-trivy-0                          1/1     Running   0          23m
    [...]
    
  9. tanzu-system-registry 命名空间中的 harbor-tls 密钥获取 Harbor CA 证书:

    kubectl -n tanzu-system-registry get secret harbor-tls -o=jsonpath="{.data.ca\.crt}" | base64 -d
    

    复制输出。

连接到 Harbor 用户界面

Harbor UI 通过在集群中 tanzu-system-ingress 的命名空间中运行的 Envoy 服务负载均衡器公开。要允许用户连接到 Harbor UI,必须将 Envoy 服务负载均衡器的地址映射到 Harbor 服务的主机名,例如 harbor.yourdomain.com

  1. 获取 Envoy 服务负载均衡器的地址。

    kubectl get svc envoy -n tanzu-system-ingress -o jsonpath='{.status.loadBalancer.ingress[0]}'
    

    在没有 NSX Advanced Load Balancer (ALB) vSphere 上,将通过 NodePort 而非 LoadBalancer 公开 Envoy 服务,因此上述输出将为空,并且可以改用集群中任何工作节点的 IP 地址。在具有 NSX ALB 的vSphere 上,Envoy 服务具有类似于 20.54.226.44 的负载均衡器 IP 地址。

  2. 将 Envoy 服务负载均衡器的地址映射到 Harbor 服务的主机名。对于在 vSphere 上运行的集群,必须在 /etc/hosts 中添加 IP 到主机名的映射或在 DNS 服务器中添加相应的 A 记录。例如,如果 IP 地址为 10.93.9.100,请将以下内容添加到 /etc/hosts

    10.93.9.100 harbor.yourdomain.com notary.harbor.yourdomain.com
    

    在 Windows 计算机上,等效于 /etc/hosts/ 的是 C:\Windows\System32\Drivers\etc\hosts

现在,用户可以通过在 Web 浏览器中导航到 https://harbor.yourdomain.com 来连接到 Harbor UI 并使用您在 harbor-data-values.yaml 中配置的 harborAdminPassword 以用户 admin 身份登录。

推送映像到 Harbor 和从中提取映像

现在,已设置 Harbor,您可以将映像推送到 Harbor,使其可供集群提取。

  1. 如果 Harbor 使用自签名证书,请从 https://harbor.yourdomain.com/api/v2.0/systeminfo/getcert 下载 Harbor CA 证书并将其安装在本地计算机上,以便 Docker 可以信任此 CA 证书。

    • 在 Linux 上,将证书另存为 /etc/docker/certs.d/harbor.yourdomain.com/ca.crt
    • 在 macOS 上,按照此过程操作。
    • 在 Windows 上,右键单击证书文件,然后选择安装证书 (Install Certificate)
  2. 使用用户 admin 身份登录 Harbor 注册表。出现提示时,输入在集群中安装 Harbor 软件包时设置的 harborAdminPassword

    docker login harbor.yourdomain.com -u admin
    
  3. 标记已在本地提取的现有映像,例如 nginx:1.7.9

    docker tag nginx:1.7.9 harbor.yourdomain.com/library/nginx:1.7.9
    
  4. 将映像推送到 Harbor 注册表。

    docker push harbor.yourdomain.com/library/nginx:1.7.9
    
  5. 现在,您可以从安装了 Harbor CA 证书的任何计算机上的 Harbor 注册表中提取映像。

    docker pull harbor.yourdomain.com/library/nginx:1.7.9
    

更新正在运行的 Harbor 部署

如果需要在部署后更改 Harbor 软件包的配置,请按照以下步骤更新部署的 Harbor 软件包。

  1. 更新 harbor-data-values.yaml 中的 Harbor 配置。例如,可以通过更新 persistence.persistentVolumeClaim.registry.size 值来增加注册表存储量。

  2. 更新已安装软件包的配置:

    tanzu package installed update harbor \
    --version INSTALLED-PACKAGE-VERSION \
    --values-file harbor-data-values.yaml \
    --namespace INSTALLED-PACKAGE-NAMESPACE
    

    其中:

    • INSTALLED-PACKAGE-VERSION 是已安装 Harbor 软件包的版本。
    • INSTALLED-PACKAGE-NAMESPACE 是安装 Harbor 软件包的命名空间。

    例如:

    tanzu package installed update harbor \
    --version 2.6.3+vmware.1-tkg.1 \
    --values-file harbor-data-values.yaml \
    --namespace my-packages
    

将使用新值或者您添加的值协调 Harbor 软件包。kapp-controller 应用更改可能需要长达五分钟的时间。

有关 tanzu package installed update 命令的详细信息,请参见安装和管理软件包中的更新软件包。您可以使用以下命令更新已安装软件包的版本和配置。

Harbor Scandata 卷 EmptyDir 覆盖网络

scandata-empty-dir-overlay.yaml

#@ load("@ytt:overlay", "overlay")
​
#@overlay/match by=overlay.and_op(overlay.subset({"kind": "Deployment"}), overlay.subset({"metadata": {"name": "harbor-jobservice"}}))
---
spec:
  template:
    spec:
      volumes:
        #@overlay/match by="name"
        #@overlay/remove
        - name: job-scandata-exports
        #@overlay/append
        - name: job-scandata-exports
          emptyDir:
            sizeLimit: 500Mi
check-circle-line exclamation-circle-line close-line
Scroll to top icon