使用 Envoy Gateway 暴露 Harbor
目录
概述架构前提条件步骤 1:创建 Gateway步骤 2:部署 Harbor选项 A:使用Harbor High Availability (Envoy Gateway) 模板选项 B:从 YAML 部署步骤 3:验证TLS 配置跨命名空间 Gateway故障排除无 LoadBalancer 访问概述
Envoy Gateway 是一个基于 Gateway API 的 L7 入口和负载均衡器,构建于 Envoy Proxy 之上。在不提供 IngressClass 的环境中,或外部流量路由优先使用 Gateway API 的环境中(例如,在配备 Envoy Gateway Operator 的 Alauda Container Platform 4.3+ 上),Harbor 无法依赖 Ingress 资源,因为 Envoy Gateway 不处理 Kubernetes Ingress API。
此时,Harbor 通过 HTTPRoute(Gateway API)暴露。Harbor Helm Chart 在 expose.type 设置为 route 时,会原生渲染 HTTPRoute,并将其附加到由 Envoy Gateway 管理的用户创建的 Gateway。
架构
- TLS 在 Gateway 监听器处终止,而不是由 Harbor 的 Nginx 终止。
- Harbor Registry API(
/v2/)路由到harbor-core,因此docker login/push/pull可通过 Gateway 正常工作。
前提条件
- 集群中已安装 Envoy Gateway。
- 在 Alauda Container Platform 4.3+ 上,通过平台的 Envoy Gateway Operator 安装。创建默认的
EnvoyGatewayCtl实例(位于envoy-gateway-operator命名空间中的cpaas-default)会自动生成GatewayClassenvoy-gateway-operator-cpaas-default。 - 在其他集群中,安装上游 Envoy Gateway,并自行创建
GatewayClass。
- 在 Alauda Container Platform 4.3+ 上,通过平台的 Envoy Gateway Operator 安装。创建默认的
- 存在
Gateway资源(请参阅步骤 1:创建 Gateway)。 - 域名解析到 Envoy Gateway 的外部地址。
- 对于高可用部署,需要与标准 HA 模式相同的外部依赖(HA Redis/PostgreSQL、HA 负载均衡器、超过 2 个节点)。请参阅 Harbor 实例部署。
步骤 1:创建 Gateway
在 与 Harbor 实例相同的命名空间中创建 Gateway,以简化部署(无需 ReferenceGrant)。如需跨命名空间 Gateway,请参阅跨命名空间 Gateway。
注意:
- 将
gatewayClassName替换为EnvoyGatewayCtl实例生成的GatewayClass。ACP 4.3 上的默认值为envoy-gateway-operator-cpaas-default;GatewayClass 名称遵循EnvoyGatewayCtl的<namespace>-<name>模式。 HTTPS监听器要求在 与 Gateway 相同的命名空间中存在 TLS 证书Secret(请参阅 TLS 配置)。- 也可以从 Web Console 创建 Gateway:Networking → Gateway API Gateway,此操作会自动创建配套的
EnvoyProxy资源。 - 如果还需要普通 HTTP 访问(例如,为不使用 TLS 的 Registry 提供访问),请在端口
80上添加HTTP监听器。
步骤 2:部署 Harbor
选项 A:使用 Harbor High Availability (Envoy Gateway) 模板
在 Harbor 部署向导中选择 Harbor High Availability (Envoy Gateway) 模板,并填写以下内容:
选项 B:从 YAML 部署
对应的 Harbor 实例配置如下:
实例部署完成后,Operator 会渲染一个 HTTPRoute(默认命名为 harbor-route),并将其附加到所引用的 Gateway。
步骤 3:验证
-
检查
HTTPRoute是否已被 Gateway 接受:
路由条件应显示 Accepted: True 和 ResolvedRefs: True。
-
访问 Harbor UI:
https://harbor.example.com -
使用 Docker 客户端验证 Registry API(在没有 DNS 的测试环境中,使用
--add-host映射域名):
TLS 配置
在 route 模式下,TLS 在 Gateway 处终止,因此证书应配置在 Gateway 监听器上,而不是 Harbor 实例上:
-
在 Gateway 的命名空间中创建 TLS 证书
Secret: -
在 Gateway 的
HTTPS监听器中引用该证书(请参阅步骤 1)。 -
保持 Harbor 自身的
expose.tls.enabled为false,并将externalURL设置为https://<domain>。
证书续期时,更新 Secret;Gateway 监听器会获取新证书,无需重新部署 Harbor。
跨命名空间 Gateway
如果 Gateway 与 Harbor 实例位于不同命名空间中:
-
Gateway 监听器必须允许来自 Harbor 命名空间的路由,例如:
-
在 Gateway 的命名空间中创建
ReferenceGrant,允许 Harbor 命名空间访问:
故障排除
无 LoadBalancer 访问
在没有 MetalLB 或云 LoadBalancer 的裸机或气隙集群中,Envoy proxy Service 默认为 type: LoadBalancer 并保持为 Pending,因此 Gateway 永远无法获得外部地址。创建 EnvoyProxy(通过 infrastructure.parametersRef 从 Gateway 引用),并将其 envoyService.type 设置为 NodePort,然后通过 https://<nodeIP>:<nodePort> 访问 Harbor。
这是 Envoy Gateway 的通用能力;完整的 EnvoyProxy 配置参考请参阅 Envoy Gateway 文档:
- 自定义 EnvoyProxy — 运维指南
- EnvoyProxy API 参考 —
envoyService.type(有效选项:ClusterIP、LoadBalancer、NodePort)