通过 Helm 部署 Harbor 实现高可用性

您可以经由 helm 在 Kubernetes 上部署 Harbor,以实现高可用性。这样,如果运行 Harbor 的某个节点变得不可用,用户也不会遇到服务中断。

先决条件

  • Kubernetes 集群 1.10+
  • Helm 2.8.0+
  • 高可用性 Ingress 控制器(Harbor 不管理外部端点)
  • 高可用性 PostgreSQL 9.6+(Harbor 不处理数据库 HA 的部署)
  • 高可用性 Redis(Harbor 不处理 Redis HA 的部署)
    • 请注意,Harbor 目前不支持 Redis 集群或基于 TLS 的连接。尽管目前正在进行启用基于 TLS 身份验证的工作。
  • 可以在节点之间共享的 PVC 或外部对象存储
    • 请参阅 架构,但为了允许 Harbor 扩展,每个功能/组件需要能够读取/写入共享持久卷。

架构

Harbor 的大多数组件现在都是无状态的。因此,我们可以简单地增加 Pod 的副本数,以确保组件分布到多个工作节点,并利用 K8S 的 “Service” 机制来确保跨 Pod 的连通性。

至于存储层,预计用户将为应用程序数据提供高可用性的 PostgreSQL 和 Redis 集群,以及用于存储镜像和 Chart 的 PVC 或对象存储。

Harbor High Availability with Helm

下载 Chart

下载 Harbor helm chart

helm repo add harbor https://helm.goharbor.io
helm fetch harbor/harbor --untar

配置

values.yaml 中配置以下项目,或者可以在运行 helm install 期间通过 --set 标志设置它们

  • Ingress 规则

    • 配置 Ingress URL expose.ingress.hosts.core
  • 外部 URL

    • 配置 URL externalURL,这用于填充门户上显示的 docker/helm 命令以及返回给 docker 客户端的令牌服务 URL。
  • 外部 PostgreSQL

    • database.type 设置为 external,并在 database.external 部分填写信息。
    • 需要创建一个空数据库,默认情况下数据库设置为 registry,但这可以通过设置 coreDatabase 来更改。
  • 外部 Redis

    • redis.type 设置为 external,并在 redis.external 部分填写信息。
    • Harbor 在 2.1.0 中引入了 Redis Sentinel 模式支持。要启用,请使用以下模式设置 sentinelMasterSethost <host_sentinel1>:<port_sentinel1>,<host_sentinel2>:<port_sentinel2>,<host_sentinel3>:<port_sentinel3>。您还可以参考此指南,在 Redis 前面设置 HAProxy 以暴露单个入口点。
    • 如先决条件中所述,Harbor 目前不支持 TLS 或 Redis 集群。
  • 存储

    • 建议使用支持跨节点以 ReadWriteMany 方式共享的 StorageClass 来为存储镜像、Chart 和作业日志的卷提供配置,这允许扩展组件以满足需求。如果这种卷类型不是您的默认 storageClass,则需要在以下位置进行设置
      • persistence.persistentVolumeClaim.registry.storageClass
      • persistence.persistentVolumeClaim.chartmuseum.storageClass
      • persistence.persistentVolumeClaim.jobservice.storageClass.
    • 如果使用这样的 StorageClass,则需要为以下字段将关联的 accessMode 设置为 ReadWriteMany
      • persistence.persistentVolumeClaim.registry.accessMode
      • persistence.persistentVolumeClaim.chartmuseum.accessMode
      • persistence.persistentVolumeClaim.jobservice.accessMode
    • 或者,通过设置以下内容使用现有的 PVC 来存储数据
      • persistence.persistentVolumeClaim.registry.existingClaim
      • persistence.persistentVolumeClaim.chartmuseum.existingClaim
      • persistence.persistentVolumeClaim.jobservice.existingClaim
    • 最后,如果您没有支持 ReadWriteMany 的 StorageClass,或者不想使用,则可以使用外部对象存储来存储镜像和 Chart,并将作业日志存储在数据库中。要启用外部对象存储,请将 persistence.imageChartStorage.type 设置为您想要使用的值,并填写相应的部分,并将 jobservice.jobLogger 设置为 database
      • 注意:对于那些希望使用 S3 的用户,IRSA 支持正在上游进行中。
      • AWS IAM 策略示例可在 上游 获得
  • 副本数

    • portal.replicascore.replicasjobservice.replicasregistry.replicaschartmuseum.replicas 设置为 n(n>=2)。

安装

使用发布名称 my-release 安装 Harbor helm chart

Helm 2

helm install --name my-release harbor/

Helm 3

helm install my-release harbor/