本主题介绍了如何将 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
。有关说明,请参见安装 Tanzu CLI 和 Kubernetes CLI 以与 vSphere with Tanzu 主管配合使用或安装 Tanzu CLI 和 Kubernetes CLI 以与独立管理集群配合使用。tanzu context use
命令登录到 Tanzu CLI。imgpkg
的信息,请参见安装 Carvel 工具。注意无法在 Internet 受限的环境中将 Harbor 的代理缓存功能用于运行 Tanzu Kubernetes Grid v2.3。您仍然可以使用 Harbor 代理缓存来代理以前版本的 Tanzu Kubernetes Grid 中的映像,以及应用程序映像等非 Tanzu 映像。
要为 Harbor 部署准备集群,请执行以下操作:
将 kubectl
的上下文设置为工作负载集群或共享服务集群。例如:
kubectl config use-context tkg-services-admin@tkg-services
如果集群没有安装有 Harbor 软件包的软件包存储库,如 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:v2023.10.16
。要从 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
通过检索 Harbor 软件包的默认配置为该软件包创建配置文件:
tanzu package available get harbor.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
其中,PACKAGE-VERSION
是 tanzu package available list
所列的软件包版本,但 _
字符替代了 +
字符。还必须包含前缀 v
。例如,v2.8.4_vmware.1-tkg.1
。
注意上述使用
--default-values-file-output
的方法仅呈现部分配置。要获取 Harbor 软件包的完整配置文件,请使用imgpkg
从包中获取该文件。例如:imgpkg pull -b projects.registry.vmware.com/tkg/packages/standard/harbor:PACKAGE-VERSION -o /tmp/harbor-package-PACKAGE-VERSION
通过执行以下操作之一设置 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.8.4,请运行:
image_url=$(kubectl -n tkg-system get packages harbor.tanzu.vmware.com.2.8.4+vmware.1-tkg.1 -o jsonpath='{.spec.template.spec.fetch[0].imgpkgBundle.image}')
imgpkg pull -b $image_url -o /tmp/harbor-package-2.8.4
bash /tmp/harbor-package-2.8.4/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.8.4+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.8.4+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.8.4+vmware.1-tkg.1 \
--values-file harbor-data-values.yaml \
--namespace my-packages
将使用新值或者您添加的值协调 Harbor 软件包。kapp-controller
应用更改可能需要长达五分钟的时间。
有关 tanzu package installed update
命令的详细信息,请参见安装和管理软件包中的更新软件包。您可以使用以下命令更新已安装软件包的版本和配置。