Harbor Instance Deployment

本文档介绍 Harbor Operator 的订阅以及基于 Harbor 实例部署的相关功能。

Pod Security Admission 级别限制

Harbor 部署所需的 Pod Security Admission(PSA)级别取决于所使用的存储方式:

  1. HostPath 存储:PSA 级别必须配置为 Privileged,因为在 Restricted 策略下不允许使用 hostPath 卷。

  2. PVC 或 StorageClass 存储:Harbor 可以在 Restricted PSA 级别下部署。

各部署模板支持的 PSA 级别如下:

Deployment TemplateSupported PSA Levels
Harbor Quick Start TemplatePrivileged
Harbor High Availability TemplatePrivileged, Baseline, Restricted
Harbor Object Storage TemplatePrivileged, Baseline, Restricted

前提条件

  • 本文档适用于平台提供的 Harbor 2.14 及以上版本。该版本已基于 Operator 等技术与平台解耦。

  • 请确保已在目标集群中部署(订阅)Harbor Operator,即 Harbor Operator 已准备好创建实例。

部署规划

Harbor 支持多种资源配置,以适配不同的客户场景。不同场景下,所需资源和配置可能存在较大差异。因此,本节介绍在部署 Harbor 实例之前需要考虑哪些部署规划内容,以及各决策点会带来哪些影响,帮助用户据此进行后续的具体实例部署。

基本信息

  1. 平台提供的 Harbor Operator 基于社区官方 Harbor Operator,并增强了企业级能力,例如 ARM 支持和安全漏洞修复。在功能上与社区版本完全兼容,在使用体验上则通过可选且可自定义的模板提升了 Harbor 部署的便捷性。

  2. Harbor 实例包含多个组件,例如负责管理镜像文件的 Registry 组件、为应用元数据和用户信息提供存储的 PostgreSQL 组件,以及用于缓存的 Redis 组件等。平台提供专业的 PostgreSQL Operator 和 Redis Operator,因此在部署 Harbor 实例时,不再直接部署 Redis 和 PostgreSQL 资源,而是通过配置现有实例的特定访问凭据进行接入。

部署前资源规划

部署前资源规划是指需要在部署之前决定,并在部署时生效的规划内容。主要包括以下方面:

高可用

  • Harbor 支持高可用部署,主要影响和限制如下:

    • 每个组件都会使用多个副本

    • 网络访问不再支持 NodePort,而需要通过 Ingress 配置的域名访问

    • 存储方式不再支持 node storage,而需要通过 StorageClassPVC 访问

资源

根据社区建议和实践,非高可用的 Harbor 实例最低可使用 2 核 4Gi 资源;在高可用模式下,为保证稳定运行,至少需要 8 核 16Gi 资源。

存储

存储选型指南
ComponentSupported Storage TypeDescription
Registry对象存储(例如 MinIO)
文件存储(例如 Ceph FS)
对于镜像拉取并发较高的场景,建议使用对象存储并开启重定向功能。
存储磁盘的顺序读写吞吐量(1 MB 块大小)不应低于 100 MiB/s。
JobService文件存储(例如 Ceph FS)作业日志也可以存储到数据库中,此时无需为 job service 配置存储。
Trivy文件存储(例如 Ceph FS)用于存储漏洞数据库和缓存;是否持久化为可选项。
如果不持久化,则会回退到 emptyDir,因此重启后需要重新下载数据库,并会暂时中断扫描。
  • 平台提供的常见存储方式均可用于 Harbor,例如 storage class、persistent volume claim、节点存储等。

  • 如果要有意跳过 Trivy 的持久化,请保持 spec.helmValues.persistence.persistentVolumeClaim.trivy.storageClass 不设置。此时漏洞数据库将存放在 emptyDir 卷中,因此每次 Trivy Pod 重启都会触发完整数据库下载,并在完成之前阻塞漏洞扫描。

  • 节点存储不适用于 high availability 模式,因为它会将文件存储在宿主节点的指定路径下

  • 另外,Harbor 也支持对象存储。配置说明请参见使用对象存储作为 Registry 存储后端

请勿将 NFS 用作存储后端

生产环境高负载场景(例如大规模镜像推送/拉取或高并发镜像工作负载)中,不建议将 NFS 作为 Harbor 的存储后端。由于协议特性限制,NFS 无法完全满足 Harbor Registry 对元数据密集型操作的要求。在高负载下,这通常会导致制品上传失败,并可能出现如下错误:

  • digest invalid: provided digest did not match uploaded content
  • blob upload unknown
  • blob upload invalid

如果仍希望在 测试环境 中使用 NFS 作为 Harbor 的存储后端,可在 NFS 服务器上启用 syncno_wdelay(具体配置请咨询存储提供商),并将 Registry 组件的副本数设置为 1,以缓解上述问题。

网络

  • 平台提供两种主流的网络访问方式:NodePortIngress

    • NodePort 需要指定 HTTP 端口和 SSH 端口,并确保端口可用。NodePort 不适用于 high availability 模式

    • Ingress 需要指定域名,并确保域名解析正常

  • 平台支持 HTTPS 协议,需要在实例部署后进行配置。详情请参见配置 HTTPS

Redis

Redis 组件存储选型指南

建议使用块存储(例如 TopoLVM),以获得更高的 IOPS 和更低的延迟。

PostgreSQL

PostgreSQL 组件存储选型指南

建议使用块存储(例如 TopoLVM),以获得更高的 IOPS 和更低的延迟。

账号凭据

初始化 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 高可用,外部依赖必须满足以下条件:

  1. RedisPostgreSQL 实例必须是高可用的
  2. 网络负载均衡器必须是高可用的;使用 ALB 时,必须配置 VIP
  3. 集群节点数必须大于 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 配置片段如下:

spec:
  helmValues:
    core:
      replicas: 2
    portal:
      replicas: 2
    jobservice:
      replicas: 2
    registry:
      replicas: 2

存储(YAML 片段)

Harbor 数据存储主要包括三部分:

  • Registry:负责管理和存储容器镜像及制品,处理镜像上传、下载和存储操作。
  • Jobservice:执行镜像复制、垃圾回收以及其他定时或按需任务等后台任务。
  • Trivy:对容器镜像进行漏洞扫描,以识别安全问题并确保符合安全策略。

当前支持三种存储配置方式:storage class、PVC 和本地节点存储。 使用 storage class 或 pvc 时,存储必须支持多节点读写(ReadWriteMany)。

对于 Registry,也可以使用对象存储(S3)作为存储后端。

Jobservice 支持将作业日志存储在多个位置(文件、数据库、stdout)。 如果你没有选择将 jobservice 日志输出到文件, 则无需为 jobservice 配置存储后端。详情请参见配置作业日志存储

storage class 配置片段:

spec:
  helmValues:
    persistence:
      enabled: true
      persistentVolumeClaim:
        registry:
          storageClass: ceph
          accessMode: ReadWriteMany
          size: 10Gi
        jobservice:
          jobLog:
            storageClass: ceph
            accessMode: ReadWriteMany
            size: 1Gi
        trivy:
          storageClass: ceph
          accessMode: ReadWriteMany
          size: 5Gi

PVC 配置片段(PVC 需要提前创建):

spec:
  helmValues:
    harbor:
      persistence:
        enabled: true
        persistentVolumeClaim:
          registry:
            existingClaim: <registry component pvc>
          jobservice:
            jobLog:
              existingClaim: <jobservice component pvc>
          trivy:
            existingClaim: <trivy component pvc>

本地节点存储配置片段:

spec:
  helmValues:
    persistence:
      enabled: true
      hostPath:
        registry:
          path: <registry component node storage path>
        jobservice:
          path: <jobservice component node storage path>
        trivy:
          path: <trivy component node storage path>
    registry:
      nodeSelector:
        kubernetes.io/hostname: <node name>
    jobservice:
      nodeSelector:
        kubernetes.io/hostname: <node name>
    trivy:
      nodeSelector:
        kubernetes.io/hostname: <node name>

将对象存储(S3)配置为 Registry 存储后端:

  • 对象存储可使用 Amazon S3 或 S3 兼容服务,例如 MinIO、Ceph。

  • 对象存储桶必须提前创建。

  • <object-storage-secret> secret 必须提前创建。

    spec:
      helmValues:
        harbor:
          persistence:
            enabled: true
            imageChartStorage:
              disableredirect: true
              s3:
                existingSecret: <object-storage-secret>
                bucket: <bucket>
                region: <region>
                regionendpoint: <regionendpoint>
                v4auth: true
              type: s3
            persistentVolumeClaim:
              jobservice:
                jobLog:
                  existingClaim: <jobservice component pvc>
              trivy:
                existingClaim: <trivy component pvc>
FieldDescriptionExample Value
object-storage-secret包含 S3 access key 和 secret key 的 Secret,详情请参见对象存储凭据object-storage-secret
bucket对象存储桶名称,必须提前创建harbor-registry
regionendpoint对象存储服务的 Endpoint URL(如需要请包含端口)http://192.168.133.37:32227
region对象存储所在区域(MinIO 通常为 us-east-1us-east-1
disableredirect设置为 false 可启用重定向并提升拉取性能。Harbor 将为层返回临时 S3 URL,因此客户端必须能够访问 S3 端点,否则层下载会失败)true

更多详情请参见 S3 storage driver

如果要在平台中使用 Ceph,请参见 Ceph 分布式存储

INFO

Harbor 当前仅支持将 Registry 组件配置为使用 S3 存储。其他组件仍将继续使用 PVC 或 StorageClass 进行持久化存储。

网络访问(YAML 片段)

网络访问主要包括两种方式:域名访问和 NodePort 访问。

域名访问配置片段:

spec:
  helmValues:
    expose:
      type: ingress
      tls:
        enabled: false
      ingress:
        hosts:
          core: <domain name>

    externalURL: http://<domain name>

NodePort 访问配置片段:

spec:
  helmValues:
    expose:
      type: nodePort
      nodePort:
        name: harbor
        ports:
          http:
            port: 80
            nodePort: <port number>

    externalURL: http://<node IP>:<port number>

Redis 访问凭据配置

这是在配置 Redis 凭据 secret 资源后,Harbor 实例中这些凭据的配置片段:

单实例示例:

spec:
  helmValues:
    database:
    redis:
      external:
        addr: "<redis access address>:<redis port>"
        existingSecret: <secret storing redis password>
        existingSecretKey: password
      type: external

哨兵示例:

spec:
  helmValues:
    database:
    redis:
      external:
        addr: "<sentinel1 access address>:<sentinel1 port>,<sentinel2 access address>:<sentinel2 port>,<sentinel3 access address>:<sentinel3 port>"
        sentinelMasterSet: mymaster
        existingSecret: <secret storing redis password>
        existingSecretKey: password
      type: external
启用 TLS 的 Redis 示例
apiVersion: v1
kind: Secret
metadata:
  name: redis-ca-bundle
type: Opaque
stringData:
  ca.crt: |
    -----BEGIN CERTIFICATE-----
    <redis server root ca>
    -----END CERTIFICATE-----
---
spec:
  helmValues:
    caBundleSecretName: redis-ca-bundle
    redis:
      external:
        addr: "<redis access address>:<redis tls port>"
        existingSecret: <secret storing redis password>
        existingSecretKey: password
        tlsOptions:
          enable: true
      type: external

启用 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 实例中这些凭据的配置片段:

spec:
  helmValues:
    database:
      external:
        host: <postgresql access address>
        port: <postgresql port>
        sslmode: <whether to enable ssl>
        username: <postgresql username>
        coreDatabase: <database name>
        existingSecret: <secret storing postgresql password>
      type: external

管理员账号配置

这是在配置账号凭据 secret 资源后,Harbor 实例中这些凭据的配置片段:

spec:
  helmValues:
    existingSecretAdminPassword: <secret storing harbor admin password>
    existingSecretAdminPasswordKey: password

完整 YAML 示例:单实例、节点存储、NodePort 网络访问


spec:
  helmValues:
    existingSecretAdminPassword: harbor-password # 存储 Harbor 管理员账号密码的 Secret
    existingSecretAdminPasswordKey: password # 存储 Harbor 管理员账号密码的 Secret 键
    externalURL: http://192.168.142.11:32001 # Harbor 访问地址
    expose:
      nodePort:
        name: harbor
        ports:
          http:
            nodePort: 32001 # Harbor node port 端口号
            port: 80
      type: nodePort
    persistence:
      enabled: true
      hostPath:
        jobservice:
          path: /data/harbor/jobservice # Jobservice 组件节点存储路径
        registry:
          path: /data/harbor/registry # Registry 组件节点存储路径
        trivy:
          path: /data/harbor/trivy # Trivy 组件节点存储路径
    portal:
      resources:
        request:
          cpu: 100m
          memory: 128Mi
        limit:
          cpu: 200m
          memory: 256Mi
    nginx:
      resources:
        request:
          cpu: 100m
          memory: 128Mi
        limit:
          cpu: 200m
          memory: 256Mi
    core:
      resources:
        request:
          cpu: 200m
          memory: 256Mi
        limit:
          cpu: 400m
          memory: 512Mi
    registry:
      nodeSelector:
        kubernetes.io/hostname: 192.168.142.11 # Registry 组件节点选择器
      resources:
        request:
          cpu: 200m
          memory: 512Mi
        limit:
          cpu: 400m
          memory: 1Gi
    jobservice:
      nodeSelector:
        kubernetes.io/hostname: 192.168.142.11 # Jobservice 组件节点选择器
      resources:
        request:
          cpu: 200m
          memory: 256Mi
        limit:
          cpu: 400m
          memory: 512Mi
    trivy:
      skipUpdate: true
      offlineScan: true
      nodeSelector:
        kubernetes.io/hostname: 192.168.142.11 # Trivy 组件节点选择器
      resources:
        request:
          cpu: 200m
          memory: 512Mi
        limit:
          cpu: 400m
          memory: 1Gi
    database:
      external:
        host: harbor-database # 数据库访问地址
        port: 5432 # 数据库端口号
        sslmode: require # 是否启用 SSL
        username: harbor # 数据库用户名
        coreDatabase: registry # 数据库名称
        existingSecret: harbor-database # 存储数据库密码的 Secret
        existingSecretKey: password # 存储数据库密码的 Secret 键
      type: external
    redis:
      external:
        addr: harbor-redis:6379 # Redis 访问地址和端口号
        existingSecret: harbor-redis # 存储 Redis 密码的 Secret
        existingSecretKey: password # 存储 Redis 密码的 Secret 键
      type: external

完整 YAML 示例:高可用、StorageClass、Ingress 网络访问

spec:
  helmValues:
    existingSecretAdminPassword: harbor-password # 存储 Harbor 管理员账号密码的 Secret
    existingSecretAdminPasswordKey: password # 存储 Harbor 管理员账号密码的 Secret 键
    externalURL: http://harbor.example.com # Harbor 访问地址
    expose:
      type: ingress
      tls:
        enabled: false
      ingress:
        hosts:
          core: harbor.example.com # Harbor 域名
    persistence:
      enabled: true
      persistentVolumeClaim:
        registry:
          storageClass: ceph # Registry 组件 storage class
          accessMode: ReadWriteMany
          size: 10Gi # Registry 组件存储大小
        jobservice:
          jobLog:
            storageClass: ceph # Jobservice 组件 storage class
            accessMode: ReadWriteMany
            size: 1Gi # Jobservice 组件存储大小
        trivy:
          storageClass: ceph # Trivy 组件 storage class
          accessMode: ReadWriteMany
          size: 5Gi # Trivy 组件存储大小
    portal:
      replicas: 2 # Portal 组件副本数
      resources:
        request:
          cpu: 200m
          memory: 256Mi
        limit:
          cpu: 400m
          memory: 512Mi
    core:
      replicas: 2 # Core 组件副本数
      resources:
        request:
          cpu: 200m
          memory: 256Mi
        limit:
          cpu: 400m
          memory: 512Mi
    registry:
      replicas: 2 # Registry 组件副本数
      resources:
        request:
          cpu: 400m
          memory: 1Gi
        limit:
          cpu: 800m
          memory: 2Gi
    jobservice:
      replicas: 2 # Jobservice 组件副本数
      resources:
        request:
          cpu: 200m
          memory: 256Mi
        limit:
          cpu: 400m
          memory: 512Mi
    trivy:
      skipUpdate: true
      offlineScan: true
      resources:
        request:
          cpu: 400m
          memory: 1Gi
        limit:
          cpu: 800m
          memory: 2Gi
    database:
      external:
        host: harbor-database # 数据库访问地址
        port: 5432 # 数据库端口号
        sslmode: require # 是否启用 SSL
        username: harbor # 数据库用户名
        coreDatabase: registry # 数据库名称
        existingSecret: harbor-database # 存储数据库密码的 Secret
        existingSecretKey: password # 存储数据库密码的 Secret 键
      type: external
    redis:
      external:
        addr: harbor-redis:6379 # Redis 访问地址和端口号
        existingSecret: harbor-redis # 存储 Redis 密码的 Secret
        existingSecretKey: password # 存储 Redis 密码的 Secret 键
      type: external

后续操作

配置单点登录(SSO)

WARNING

仅当数据库中尚未添加本地用户时,才可以将认证模式从 database 更改为 OIDC。如果 Harbor 数据库中存在除 admin 之外的任何用户,则无法更改认证模式。

详情参见:配置 OIDC Provider 认证

配置 SSO 包括以下步骤:

  1. 在全局集群中注册一个 SSO 认证客户端
  2. 准备 SSO 认证配置
  3. 配置 Harbor 实例使用 SSO 认证

在全局集群中创建以下 OAuth2Client 资源,以注册 SSO 认证客户端:

apiVersion: dex.coreos.com/v1
kind: OAuth2Client
name: OIDC
metadata:
  name: nbqxeytpoiwwizlyzpzjzzeeeirsk # 该值根据 id 字段的哈希计算得出,可使用在线计算器:https://go.dev/play/p/QsoqUohsKok
  namespace: cpaas-system
alignPasswordDB: true
id: harbor-dex # 客户端 ID
public: false
redirectURIs:
  - <harbor access address>/c/oidc/callback
secret: Z2l0bGFiLW9mZmljaWFsLTAK # 客户端密钥
spec: {}
FieldDescriptionExample
name资源显示名称。OIDC
id用于 SSO 认证的客户端 ID,可设置为任意值。
id 不能设置为 alauda-dex,这是保留值,可能导致冲突。
harbor-dex
secret用于 SSO 认证的客户端密钥,可设置为任意值。Z2l0bGFiLW9mZmljaWFsLTAK
metadata.name资源名称,必须根据 id 字段的哈希值计算得出。你可以使用在线哈希计算器,例如 https://go.dev/play/p/QsoqUohsKok 来生成。nbqxeytpoiwwizlyzpzjzzeeeirsk
redirectURIs第三方产品 URL。Harbor 要求格式为:<harbor access address>/c/oidc/callbackhttps://harbor.com/c/oidc/callback
metadata.namespace平台系统命名空间。默认为 cpaas-systemcpaas-system

编辑 Harbor 实例,添加以下配置:

spec:
  helmValues:
    oidc:
      enable: true
      clientID: "harbor-dex"
      clientSecret: "Z2l0bGFiLW9mZmljaWFsLTAK"
      issuer: "<platform access address>/dex"

配置 HTTPS

部署 Harbor 实例后,可根据需要配置 HTTPS。

首先,在实例所在的命名空间中创建一个 TLS 证书 Secret:

apiVersion: v1
kind: Secret
metadata:
  name: harbor-tls-cert
  namespace: harbor
type: kubernetes.io/tls
data:
  tls.crt: <base64 encoded cert>
  tls.key: <base64 encoded key>

然后编辑 Harbor 实例的 YAML 配置,以启用 HTTPS 访问:

expose:
  type: ingress
  tls:
    enabled: true
    certSource: secret
    secret:
      secretName: harbor-tls-cert
  ingress:
    hosts:
      core: <domain name>

externalURL: https://<domain name>

配置镜像扫描漏洞数据库策略

Harbor 的镜像扫描功能由 Trivy 组件实现。考虑到用户的网络环境,该组件默认使用内置的离线漏洞数据库。由于漏洞数据库不会更新,因此无法及时发现新漏洞。

如果你希望保持漏洞数据库的最新状态,可以编辑 Harbor 实例的 YAML 配置,启用在线更新策略(该策略需要访问 GitHub):

trivy:
  skipUpdate: false
  offlineScan: false

启用在线更新策略后,Trivy 会在扫描前根据上次更新时间判断是否更新漏洞数据库。由于下载漏洞数据库需要一定时间,如果你不需要 Java 漏洞扫描,也可以编辑 Harbor 实例的 YAML 配置,禁用 Java 漏洞数据库更新:

trivy:
  skipJavaDBUpdate: true

如果你保留离线数据库工作流,并且 init-offline-db init 容器在解压数据库时发生 OOM,可以单独提高 init 阶段资源,而不影响主 Trivy 运行时资源:

trivy:
  offlineScan: true
  offlineDBInitResources:
    requests:
      cpu: 200m
      memory: 512Mi
    limits:
      cpu: 1
      memory: 2Gi

该设置仅影响 Pod 初始化期间的 init 容器,不会提升主 Trivy 容器的稳态资源上限。

其他信息

在 IPv6 环境中部署 Harbor

Harbor 支持在 IPv6 环境中部署,但你需要确保客户端工具版本支持 IPv6。如果遇到 invalid reference format 错误,请检查你的客户端工具版本是否支持 IPv6。

相关社区问题: