本主题介绍了如何将 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 是一个开源、受信任的云原生容器注册表,用于存储、签名和扫描内容。Tanzu Kubernetes Grid 包含 Harbor 的签名、打包二进制文件,您可以将其部署到工作负载集群中,以便为该集群提供容器注册表服务。此 Harbor 软件包通过添加用户通常需要的功能(如安全和身份控制和管理)来扩展开源 Docker 分发。
Tanzu Kubernetes Grid 包括 Harbor 的签名二进制文件,您可以将其部署到:
部署为共享服务时,Harbor 可用于由同一独立管理集群管理的所有工作负载集群。要将 Harbor 作为共享服务实施,请将其部署到专用于运行共享服务的特殊集群中。每个管理集群只能有一个共享服务集群。
VMware 建议在具有负载均衡功能的基础架构上与 Harbor 注册表一起安装 ExternalDNS,尤其是在 Harbor 可用性非常重要的生产环境或其他环境中。
如果输入负载均衡器的 IP 地址发生更改,ExternalDNS 将自动选取更改并将新地址重新映射到 Harbor 主机名。这样就无需按照连接到 Harbor 用户界面中所述手动重新映射地址。
kubectl
和 Carvel 工具。有关说明,请参见安装 Tanzu CLI 和其他工具以与 vSphere with Tanzu 主管配合使用或安装 Tanzu CLI 和其他工具以与独立管理集群配合使用。tanzu login
命令登录到 Tanzu CLI。注意无法在 Internet 受限的环境中将 Harbor 的代理缓存功能用于运行 Tanzu Kubernetes Grid v2.2。您仍然可以使用 Harbor 代理缓存来代理以前版本的 Tanzu Kubernetes Grid 中的映像,以及应用程序映像等非 Tanzu 映像。
要为 Harbor 部署准备集群,请执行以下操作:
将 kubectl
的上下文设置为工作负载集群或共享服务集群。例如:
kubectl config use-context tkg-services-admin@tkg-services
如果集群没有安装有 Harbor 软件包的软件包存储库,如 tanzu-standard
存储库,请安装一个:
注意如果要将基于计划的集群(旧版)作为目标,请跳过此步骤。对于基于计划的集群,在
tanzu-package-repo-global
命名空间中的每个集群能够自动启用tanzu-standard
软件包存储库。
tanzu package repository add PACKAGE-REPO-NAME --url PACKAGE-REPO-ENDPOINT --namespace tkg-system
其中:
PACKAGE-REPO-NAME
是软件包存储库的名称,如 tanzu-standard
或使用 ADDITIONAL_IMAGE_REGISTRY
变量配置的专用映像注册表的名称。PACKAGE-REPO-ENDPOINT
是软件包存储库的 URL。
tanzu-standard
URL 为 projects.registry.vmware.com/tkg/packages/standard/repo:v2.2.0
。要从 Tanzu CLI 获取此值,请参见列出软件包存储库,或在 Tanzu Mission Control 中查看集群 (Cluster) 窗格中的附加模块 (Addons) > 存储库 (Repositories) 列表。如果尚未执行此操作,请安装证书管理器和 Contour 软件包。有关说明,请参见安装 Contour 以进行 Ingress 控制。
(可选)安装 ExternalDNS 软件包。有关说明,请参见安装 ExternalDNS 以进行服务发现。
继续下面的将 Harbor 部署到集群中。
按照以下过程将 Harbor 部署到工作负载集群或共享服务集群中:
确认 Harbor 软件包在集群中可用:
tanzu package available list -A
检索可用软件包的版本:
tanzu package available list harbor.tanzu.vmware.com -A
从 standard
软件包存储库下载 Harbor 软件包:
imgpkg pull -b projects.registry.vmware.com/tkg/packages/standard/harbor:PACKAGE-VERSION -o /tmp/harbor-package-PACKAGE-VERSION
其中,PACKAGE-VERSION
是 tanzu package available list
所列的软件包版本,但 _
字符替代了 +
字符。还必须包含前缀 v
。例如,v2.7.1_vmware.1-tkg.1
。
例如:
imgpkg pull -b projects.registry.vmware.com/tkg/packages/standard/harbor:v2.7.1_vmware.1-tkg.1 -o /tmp/harbor-package-v2.7.1_vmware.1-tkg.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.7.1,请运行:
image_url=$(kubectl -n tkg-system get packages harbor.tanzu.vmware.com.2.7.1+vmware.1-tkg.1 -o jsonpath='{.spec.template.spec.fetch[0].imgpkgBundle.image}')
imgpkg pull -b $image_url -o /tmp/harbor-package-2.7.1
bash /tmp/harbor-package-2.7.1/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
在 harbor-data-values.yaml
文件中指定其他设置。
hostname
设置设定为要用于访问 Harbor 的主机名。例如,harbor.yourdomain.com
。tls.crt
、tls.key
和 ca.crt
设置。证书可以由受信任的颁发机构签名,也可以自签名。如果将这些设置留空,Tanzu Kubernetes Grid 将自动生成自签名证书。generate-passwords.sh
脚本,则可以选择使用更易于记住的内容更新 harborAdminPassword
。以下情况需要非空值:
storageClass
: 在 persistence.persistentVolumeClaim
下,对于 registry
、jobservice
、database
、redis
和 trivy
,请将 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
设置为 yaml
、json
或 table
。
例如:
tanzu package available get harbor.tanzu.vmware.com/2.7.1+vmware.1-tkg.1 --values-schema
移除 harbor-data-values.yaml
文件中的所有注释:
yq -i eval '... comments=""' harbor-data-values.yaml
安装软件包:
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-packages
或 tanzu-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.7.1+vmware.1-tkg.1 \
--values-file harbor-data-values.yaml \
--namespace my-packages
确认已安装 harbor
软件包:
tanzu package installed list -A
要查看有关软件包的更多详细信息,还可以运行:
tanzu package installed get harbor --namespace PACKAGE-NAMESPACE
其中,PACKAGE-NAMESPACE
是安装 harbor
软件包的命名空间。
确认 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
通过列出集群中的所有 Pod,确认 Harbor 服务正在运行:
kubectl get pods -A
在 tanzu-system-registry
命名空间中,您应该会看到在名称类似于以下内容的 Pod 中运行的 harbor
core
、database
、jobservice
、notary
、portal
、redis
、registry
和 trivy
服务:
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
[...]
从 tanzu-system-registry
命名空间中的 harbor-tls
密钥获取 Harbor CA 证书:
kubectl -n tanzu-system-registry get secret harbor-tls -o=jsonpath="{.data.ca\.crt}" | base64 -d
记录以下步骤的输出
如果 Harbor 注册表使用自签名 CA,请根据集群的部署方式使用适用的过程将其添加到工作负载集群:
已部署主管:
已部署独立管理集群:
Harbor UI 通过在集群中 tanzu-system-ingress
的命名空间中运行的 Envoy 服务负载均衡器公开。要允许用户连接到 Harbor UI,必须将 Envoy 服务负载均衡器的地址映射到 Harbor 服务的主机名,例如 harbor.yourdomain.com
。
获取 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 地址。
将 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 使用自签名证书,请从 https://harbor.yourdomain.com/api/v2.0/systeminfo/getcert
下载 Harbor CA 证书并将其安装在本地计算机上,以便 Docker 可以信任此 CA 证书。
/etc/docker/certs.d/harbor.yourdomain.com/ca.crt
。使用用户 admin
身份登录 Harbor 注册表。出现提示时,输入在集群中安装 Harbor 软件包时设置的 harborAdminPassword
。
docker login harbor.yourdomain.com -u admin
标记已在本地提取的现有映像,例如 nginx:1.7.9
。
docker tag nginx:1.7.9 harbor.yourdomain.com/library/nginx:1.7.9
将映像推送到 Harbor 注册表。
docker push harbor.yourdomain.com/library/nginx:1.7.9
现在,您可以从安装了 Harbor CA 证书的任何计算机上的 Harbor 注册表中提取映像。
docker pull harbor.yourdomain.com/library/nginx:1.7.9
如果需要在部署后更改 Harbor 软件包的配置,请按照以下步骤更新部署的 Harbor 软件包。
更新 harbor-data-values.yaml
中的 Harbor 配置。例如,可以通过更新 persistence.persistentVolumeClaim.registry.size
值来增加注册表存储量。
更新已安装软件包的配置:
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.7.1+vmware.1-tkg.1 \
--values-file harbor-data-values.yaml \
--namespace my-packages
将使用新值或者您添加的值协调 Harbor 软件包。kapp-controller
应用更改可能需要长达五分钟的时间。
有关 tanzu package installed update
命令的详细信息,请参见安装和管理软件包中的更新软件包。您可以使用以下命令更新已安装软件包的版本和配置。
注意如果要将 Harbor 软件包更新到 v2.7.1,并且之前已将 Harbor Scandata Volume EmptyDir Overlay 应用于该软件包,则必须先从 Harbor
PackageInstall
资源中移除覆盖注释,然后再更新软件包版本。您可以手动移除注释,也可以运行kubectl -n MY-PACKAGES-NAMESPACE annotate packageinstalls harbor ext.packaging.carvel.dev/ytt-paths-from-secret-name.0-
,其中MY-PACKAGES-NAMESPACE
是PackageInstall
资源的命名空间。