Harbor Instance Deployment
本文档介绍 Harbor Operator 的订阅以及基于 Harbor 实例部署的相关功能。
Harbor 部署所需的 Pod Security Admission(PSA)级别取决于所使用的存储方式:
-
HostPath 存储:PSA 级别必须配置为
Privileged,因为在Restricted策略下不允许使用hostPath卷。 -
PVC 或 StorageClass 存储:Harbor 可以在
RestrictedPSA 级别下部署。
各部署模板支持的 PSA 级别如下:
目录
前提条件部署规划基本信息部署前资源规划部署后配置规划实例部署通过Harbor Quick Start 模板部署通过 Harbor High Availability 模板部署通过 Harbor Object Storage 模板部署通过 YAML 部署高可用(YAML 片段)存储(YAML 片段)网络访问(YAML 片段)Redis 访问凭据配置PostgreSQL 访问凭据配置管理员账号配置完整 YAML 示例:单实例、节点存储、NodePort 网络访问完整 YAML 示例:高可用、StorageClass、Ingress 网络访问后续操作配置单点登录(SSO)配置 HTTPS配置镜像扫描漏洞数据库策略其他信息在 IPv6 环境中部署 Harbor前提条件
-
本文档适用于平台提供的 Harbor 2.14 及以上版本。该版本已基于 Operator 等技术与平台解耦。
-
请确保已在目标集群中部署(订阅)Harbor Operator,即 Harbor Operator 已准备好创建实例。
部署规划
Harbor 支持多种资源配置,以适配不同的客户场景。不同场景下,所需资源和配置可能存在较大差异。因此,本节介绍在部署 Harbor 实例之前需要考虑哪些部署规划内容,以及各决策点会带来哪些影响,帮助用户据此进行后续的具体实例部署。
基本信息
-
平台提供的 Harbor Operator 基于社区官方 Harbor Operator,并增强了企业级能力,例如 ARM 支持和安全漏洞修复。在功能上与社区版本完全兼容,在使用体验上则通过可选且可自定义的模板提升了 Harbor 部署的便捷性。
-
Harbor 实例包含多个组件,例如负责管理镜像文件的
Registry组件、为应用元数据和用户信息提供存储的PostgreSQL组件,以及用于缓存的Redis组件等。平台提供专业的 PostgreSQL Operator 和 Redis Operator,因此在部署 Harbor 实例时,不再直接部署 Redis 和 PostgreSQL 资源,而是通过配置现有实例的特定访问凭据进行接入。
部署前资源规划
部署前资源规划是指需要在部署之前决定,并在部署时生效的规划内容。主要包括以下方面:
高可用
-
Harbor 支持高可用部署,主要影响和限制如下:
-
每个组件都会使用多个副本
-
网络访问不再支持
NodePort,而需要通过Ingress配置的域名访问 -
存储方式不再支持
node storage,而需要通过StorageClass或PVC访问
-
资源
根据社区建议和实践,非高可用的 Harbor 实例最低可使用 2 核 4Gi 资源;在高可用模式下,为保证稳定运行,至少需要 8 核 16Gi 资源。
存储
-
平台提供的常见存储方式均可用于 Harbor,例如 storage class、persistent volume claim、节点存储等。
-
如果要有意跳过 Trivy 的持久化,请保持
spec.helmValues.persistence.persistentVolumeClaim.trivy.storageClass不设置。此时漏洞数据库将存放在emptyDir卷中,因此每次 Trivy Pod 重启都会触发完整数据库下载,并在完成之前阻塞漏洞扫描。 -
节点存储不适用于
high availability模式,因为它会将文件存储在宿主节点的指定路径下 -
另外,Harbor 也支持对象存储。配置说明请参见使用对象存储作为 Registry 存储后端。
在 生产环境 或 高负载场景(例如大规模镜像推送/拉取或高并发镜像工作负载)中,不建议将 NFS 作为 Harbor 的存储后端。由于协议特性限制,NFS 无法完全满足 Harbor Registry 对元数据密集型操作的要求。在高负载下,这通常会导致制品上传失败,并可能出现如下错误:
- digest invalid: provided digest did not match uploaded content
- blob upload unknown
- blob upload invalid
如果仍希望在 测试环境 中使用 NFS 作为 Harbor 的存储后端,可在 NFS 服务器上启用 sync 和 no_wdelay(具体配置请咨询存储提供商),并将 Registry 组件的副本数设置为 1,以缓解上述问题。
网络
-
平台提供两种主流的网络访问方式:
NodePort和Ingress-
NodePort需要指定 HTTP 端口和 SSH 端口,并确保端口可用。NodePort不适用于high availability模式 -
Ingress需要指定域名,并确保域名解析正常
-
-
平台支持 HTTPS 协议,需要在实例部署后进行配置。详情请参见配置 HTTPS。
Redis
建议使用块存储(例如 TopoLVM),以获得更高的 IOPS 和更低的延迟。
-
Harbor 当前依赖的 Redis 组件版本为 v6。建议使用平台提供的 Redis Operator 部署 Redis 实例,然后通过配置访问凭据完成 Redis 集成。
- Redis 访问通过配置特定格式内容的
secret资源实现。详情请参见配置 Redis、PostgreSQL 和账号访问凭据。 - Harbor 支持连接启用 TLS 的外部 Redis。配置示例请参见启用 TLS 的 Redis 示例。
- Redis 访问通过配置特定格式内容的
PostgreSQL
建议使用块存储(例如 TopoLVM),以获得更高的 IOPS 和更低的延迟。
-
支持的 PostgreSQL 版本请参见版本兼容矩阵。建议使用平台提供的 PostgreSQL Operator 部署 PostgreSQL 实例,并通过配置相应的访问凭据完成集成。
- PostgreSQL 访问通过配置特定格式内容的
secret资源实现。详情请参见配置 Redis、PostgreSQL 和账号访问凭据。
- PostgreSQL 访问通过配置特定格式内容的
账号凭据
初始化 Harbor 实例时,需要配置管理员账号及其密码。该操作通过配置 secret 资源完成。详情请参见配置 Redis、PostgreSQL 和账号访问凭据。
部署后配置规划
部署后配置规划是指不需要在部署前做出决策,但可在部署后通过标准化操作按需调整的规划内容。主要包括单点登录(SSO)、HTTPS 配置、外部负载均衡器配置等。详情请参见后续操作。
实例部署
平台提供的 Harbor Operator 主要支持两种部署方式:通过模板部署和通过 YAML 部署。
平台提供了两个内置模板供使用:Harbor Quick Start 模板和 Harbor High Availability 模板,同时也支持自定义模板,以满足不同的客户场景。
内置模板和 YAML 部署的相关信息如下:
通过 Harbor Quick Start 模板部署
该模板用于快速创建适合开发和测试场景的轻量级 Harbor 实例,不建议用于生产环境。
- 计算资源:CPU 2 核,内存 4Gi
- 存储方式:使用本地节点存储,需要配置存储节点 IP 和路径
- 网络访问:使用 NodePort 方式,与存储共用节点 IP,需要指定端口
- 依赖服务:需要配置现有 Redis 和 PostgreSQL 的访问凭据
- 其他设置:需要配置账号凭据,SSO 功能默认关闭
根据模板提示填写相关信息即可完成部署。
通过 Harbor High Availability 模板部署
部署高可用 Harbor 实例需要更高的资源配置,并提供更高的可用性标准。
- 计算资源:CPU 16 核,内存 16 Gi
- 存储方式:使用 storage class 资源存储镜像文件、后台任务日志和镜像扫描漏洞数据库
- 网络访问:使用 Ingress 方式,需要指定域名
- 依赖服务:需要配置现有 Redis 和 PostgreSQL 的访问凭据
- 其他设置:需要配置账号凭据,SSO 功能默认关闭
要实现 Harbor 高可用,外部依赖必须满足以下条件:
Redis和PostgreSQL实例必须是高可用的- 网络负载均衡器必须是高可用的;使用 ALB 时,必须配置 VIP
- 集群节点数必须大于 2
根据模板提示填写相关信息即可完成部署。
通过 Harbor Object Storage 模板部署
基于对象存储部署 Harbor 实例。
- 计算资源:8 CPU 核,16 Gi 内存
- 存储:镜像文件使用对象存储,后台任务日志使用数据库存储
- 网络访问:使用 Ingress 访问服务,并指定域名
- 依赖项:配置现有 Redis 和 PostgreSQL 的访问凭据
- 其他设置:配置账号凭据,SSO 功能默认关闭
在该模板中,Trivy 扫描器不持久化数据;它会挂载一个 emptyDir,因此每次 Pod 重启都会重新下载漏洞数据库,并在同步完成之前暂时阻塞新的扫描。
请确认所提供的对象存储凭据满足所需的 S3 API 权限,详情请参见对象存储凭据。
根据模板提示填写相关信息即可完成部署。
通过 YAML 部署
YAML 部署是最基础也是最强大的部署能力。这里我们为 部署规划 部分中的各个维度提供相应的 YAML 片段,并给出两个完整的 YAML 示例,帮助用户理解 YAML 配置方式,并按需进行配置调整。
高可用(YAML 片段)
在高可用模式下,Harbor 各组件副本数应至少为 2。YAML 配置片段如下:
存储(YAML 片段)
Harbor 数据存储主要包括三部分:
- Registry:负责管理和存储容器镜像及制品,处理镜像上传、下载和存储操作。
- Jobservice:执行镜像复制、垃圾回收以及其他定时或按需任务等后台任务。
- Trivy:对容器镜像进行漏洞扫描,以识别安全问题并确保符合安全策略。
当前支持三种存储配置方式:storage class、PVC 和本地节点存储。 使用 storage class 或 pvc 时,存储必须支持多节点读写(ReadWriteMany)。
对于 Registry,也可以使用对象存储(S3)作为存储后端。
Jobservice 支持将作业日志存储在多个位置(文件、数据库、stdout)。 如果你没有选择将 jobservice 日志输出到文件, 则无需为 jobservice 配置存储后端。详情请参见配置作业日志存储。
storage class 配置片段:
PVC 配置片段(PVC 需要提前创建):
本地节点存储配置片段:
将对象存储(S3)配置为 Registry 存储后端:
-
对象存储可使用 Amazon S3 或 S3 兼容服务,例如 MinIO、Ceph。
-
对象存储桶必须提前创建。
-
<object-storage-secret>secret 必须提前创建。
更多详情请参见 S3 storage driver
如果要在平台中使用 Ceph,请参见 Ceph 分布式存储。
Harbor 当前仅支持将 Registry 组件配置为使用 S3 存储。其他组件仍将继续使用 PVC 或 StorageClass 进行持久化存储。
网络访问(YAML 片段)
网络访问主要包括两种方式:域名访问和 NodePort 访问。
域名访问配置片段:
NodePort 访问配置片段:
Redis 访问凭据配置
这是在配置 Redis 凭据 secret 资源后,Harbor 实例中这些凭据的配置片段:
单实例示例:
哨兵示例:
启用 TLS 的 Redis 示例
启用 TLS 的 Redis 说明:
caBundleSecretName是全局 Harbor Helm 值。所引用的 Secret 必须包含名为ca.crt的键。- 对于启用 TLS 的 Redis Sentinel,继续在
redis.external.addr中使用 Sentinel 地址,设置redis.external.sentinelMasterSet,并启用redis.external.tlsOptions.enable: true。 - Harbor 仅支持 Redis TLS 的服务器证书校验,不支持客户端证书。
- 目前不支持通过 TLS 将 Harbor 连接到 Alauda Cache Service for Redis OSS。
PostgreSQL 访问凭据配置
这是在配置 PostgreSQL 凭据 secret 资源后,Harbor 实例中这些凭据的配置片段:
管理员账号配置
这是在配置账号凭据 secret 资源后,Harbor 实例中这些凭据的配置片段:
完整 YAML 示例:单实例、节点存储、NodePort 网络访问
完整 YAML 示例:高可用、StorageClass、Ingress 网络访问
后续操作
配置单点登录(SSO)
仅当数据库中尚未添加本地用户时,才可以将认证模式从 database 更改为 OIDC。如果 Harbor 数据库中存在除 admin 之外的任何用户,则无法更改认证模式。
详情参见:配置 OIDC Provider 认证
配置 SSO 包括以下步骤:
- 在全局集群中注册一个 SSO 认证客户端
- 准备 SSO 认证配置
- 配置 Harbor 实例使用 SSO 认证
在全局集群中创建以下 OAuth2Client 资源,以注册 SSO 认证客户端:
编辑 Harbor 实例,添加以下配置:
配置 HTTPS
部署 Harbor 实例后,可根据需要配置 HTTPS。
首先,在实例所在的命名空间中创建一个 TLS 证书 Secret:
然后编辑 Harbor 实例的 YAML 配置,以启用 HTTPS 访问:
配置镜像扫描漏洞数据库策略
Harbor 的镜像扫描功能由 Trivy 组件实现。考虑到用户的网络环境,该组件默认使用内置的离线漏洞数据库。由于漏洞数据库不会更新,因此无法及时发现新漏洞。
如果你希望保持漏洞数据库的最新状态,可以编辑 Harbor 实例的 YAML 配置,启用在线更新策略(该策略需要访问 GitHub):
启用在线更新策略后,Trivy 会在扫描前根据上次更新时间判断是否更新漏洞数据库。由于下载漏洞数据库需要一定时间,如果你不需要 Java 漏洞扫描,也可以编辑 Harbor 实例的 YAML 配置,禁用 Java 漏洞数据库更新:
如果你保留离线数据库工作流,并且 init-offline-db init 容器在解压数据库时发生 OOM,可以单独提高 init 阶段资源,而不影响主 Trivy 运行时资源:
该设置仅影响 Pod 初始化期间的 init 容器,不会提升主 Trivy 容器的稳态资源上限。
其他信息
在 IPv6 环境中部署 Harbor
Harbor 支持在 IPv6 环境中部署,但你需要确保客户端工具版本支持 IPv6。如果遇到 invalid reference format 错误,请检查你的客户端工具版本是否支持 IPv6。
相关社区问题: