本主题介绍了如何将 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。要为 Harbor 部署准备集群,请执行以下操作:
将 kubectl
的上下文设置为工作负载集群或共享服务集群。例如:
kubectl config use-context tkg-services-admin@tkg-services
如果集群尚未安装 standard
软件包存储库,请进行安装:
注意如果要将基于计划的集群(旧版)作为目标,请跳过此步骤。对于基于计划的集群,在
tanzu-package-repo-global
命名空间中的每个集群能够自动启用tanzu-standard
软件包存储库。
tanzu package repository add tanzu-standard --url PACKAGE-REPOSITORY-ENDPOINT --namespace tkg-system
其中,PACKAGE-REPOSITORY-ENDPOINT
是 standard
软件包存储库的 URL。对于此版本,URL 为 projects.registry.vmware.com/tkg/packages/standard/repo:v2.1.1
。
要从 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.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
通过执行以下操作之一设置 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
在 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.6.3+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.6.3+vmware.1-tkg.1 \
--values-file harbor-data-values.yaml \
--namespace my-packages
如果使用 ebs.csi.aws.com
作为 storageClass
,请执行以下操作之一:
将存储类 VolumeBoundMode
从 Immediate
更改为 WaitForFirstConsumer
。
修补 Harbor Scandata Volume EmptyDir 覆盖网络,如下所示。此覆盖网络会将 scandata 卷设置为空目录,以避免在将 jobLog
卷和 scandata
卷挂载到同一个 jobservice pod 时影响 scandata 导出功能和导致 AZ 冲突:
创建一个文件 scandata-empty-dir-overlay.yaml
,其中包含下面的 Harbor Scandata 卷 EmptyDir 覆盖网络代码。
为覆盖网络创建通用密钥:
kubectl -n test create secret generic scandata-empty-dir-overlay -o yaml --dry-run=client --from-file=scandata-emptyDir-overlay.yaml | kubectl apply -f -
kubectl -n test annotate packageinstalls harbor ext.packaging.carvel.dev/ytt-paths-from-secret-name.0=scandata-empty-dir-overlay
isReconciling
:kubectl get pkgi harbor -n my-packages
isReconciling
,请删除现有的 Harbor Pod,以便它们重新创建:kubectl delete pods --all -n 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 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.6.3+vmware.1-tkg.1 \
--values-file harbor-data-values.yaml \
--namespace my-packages
将使用新值或者您添加的值协调 Harbor 软件包。kapp-controller
应用更改可能需要长达五分钟的时间。
有关 tanzu package installed update
命令的详细信息,请参见安装和管理软件包中的更新软件包。您可以使用以下命令更新已安装软件包的版本和配置。
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