合作机构:阿里云 / 腾讯云 / 亚马逊云 / DreamHost / NameSilo / INWX / GODADDY / 百度统计
Higress 是基于阿里内部的 Envoy Gateway 实践沉淀、以开源 Istio + Envoy 为核心构建的云原生 API 网关,实现了流量网关 + 微服务网关 + 安全网关三合一的高集成能力,深度集成 Dubbo、Nacos、Sentinel 等微服务技术栈,能够帮助用户极大的降低网关的部署及运维成本;在标准上全面支持 Ingress 与 Gateway API,积极拥抱云原生下的标准 API 规范;同时,Higress Controller 也支持 Nginx Ingress 平滑迁移,帮助用户零成本快速迁移到 Higress。
行业中通常把网关分为两个大类:流量网关与业务网关,流量网关主要提供全局性的、与后端业务无关的策略配置,例如阿里内部的的统一接入网关 Tengine 就是典型的流量网关;业务网关顾名思义主要提供独立业务域级别的、与后端业务紧耦合策略配置,随着应用架构模式从单体演进到现在的分布式微服务,业务网关也有了新的叫法 - 微服务网关。
在虚拟化时期的微服务架构下,业务通常采用流量网关 + 微服务网关的两层架构,流量网关负责南北向流量调度和安全防护,微服务网关负责东西向流量调度和服务治理,而在容器和 K8s 主导的云原生时代,Ingress 成为 K8s 生态的网关标准,赋予了网关新的使命,使得流量网关 + 微服务网关合二为一成为可能。
作为面向南北向的公网网关,使用 Waf 防护异常流量是很常规的需求,而且随着互联网环境变得越来越复杂,用户对防护的诉求是持续增强的,常规做法是将流量先接入 Waf 安全网关,过滤后再将流量转发给流量网关,最后到达微服务网关;Higress 希望通过内置 Waf 模块,使得用户的请求链接只经过 Higress 就可以同时完成 Waf 防护、流量分发、微服务治理,既可以降低链路 RT,也可以降低网关的运维复杂度。因此 Higress 实现了流量网关 + 微服务网关 + 安全网关三合一的高集成能力。
Higress 支持多种功能特性,适用于多种场景:
整体上 Higress 网关由控制面组件 higress-controller 和数据面组件 higress-gateway 组成。higress-gateway 负责承载数据流量,higress-controller 负责管理配置下发。
Higress
数据面组件 higress-gateway 是基于 Envoy 开发的网关组件,负责接收和处理流量,支持 HTTP/1.1、HTTP/2、gRPC 等协议,支持 TLS、mTLS、WAF、限流、熔断、重试、负载均衡、路由、转发、重定向、跨域等功能,也就是说真正的流量处理都是在 higress-gateway 中完成的。
控制面组件 higress-controller 负责管理配置下发,支持 Ingress API、Gateway API、Istio API,支持多种注册中心,支持多种认证鉴权策略,支持多种插件扩展机制,支持多种 CRD 实现流量精细化管理,也就是说所有的配置都是通过 higress-controller 下发到 higress-gateway 中的。
Higress 的安装非常简单,只需要通过 Helm 安装即可,如果想要根据自己的需求进行定制,可以通过修改 Helm 的参数来实现,完整参数介绍可以查看运维参数说明,常用的一些可定制参数如下所示:
参数名 | 参数说明 | 默认值 |
全局参数 | ||
global.local | 如果要安装至本地 K8s 集群(如 Kind、Rancher Desktop 等),请设置为 true | false |
global.ingressClass | 用于过滤被 Higress Controller 监听的 Ingress 资源的 IngressClass。 在集群内部署了多个网关时,可以使用这一参数来区分每个网关的职责范围。 IngressClass 有一些特殊的取值: 1. 如果设置为“nginx”,Higress Controller 将监听 Ingress 为 nginx 或为空的 Ingress 资源。 2. 如果设为空,Higress Controller 将监听 K8s 集群内的全部 Ingress 资源。 | higress |
global.watchNamespace | 如果值不为空,Higress Controller 将只会监听指定命名空间下的资源。 当基于 K8s 命名空间进行业务系统隔离时,若需要对每个命名空间部署一套独立的网关,可以通过这一参数来限制 Higress 监听指定命名空间内的 Ingress。 | "" |
global.disableAlpnH2 | 是否在 ALPN 中禁用 HTTP/2 协议 | true |
global.enableStatus | 若为true, Higress Controller 将会更新 Ingress 资源的 status 字段。 为避免从 Nginx Ingress 迁移过程中,覆盖 Ingress 对象的 status 字段,可以将这一参数设置为false,这样 Higress 默认就不会将入口 IP 写入 Ingress 的 status 字段。 | true |
global.enableIstioAPI | 若为true,Higress Controller 将同时监听 istio 资源 | false |
global.enableGatewayAPI | 若为true,Higress Controller 将同时监听 Gateway API 资源 | false |
global.onlyPushRouteCluster | 若为true,Higress Controller 将会只推送被路由关联的服务 | true |
核心组件参数 | ||
higress-core.gateway.replicas | Higress Gateway 的 pod 数量 | 2 |
higress-core.controller.replicas | Higress Controller 的 pod 数量 | 1 |
控制台参数 | ||
higress-console.replicaCount | Higress Console 的 pod 数量 | 1 |
higress-console.service.type | Higress Console 所使用的 K8s Service 类型 | ClusterIP |
higress-console.web.login.prompt | 登录页面上显示的提示信息 | "" |
higress-console.o11y.enabled | 若为 true,将同时安装可观测性套件(Grafana + Promethues) | false |
higress-console.pvc.rwxSupported | 标识目标 K8s 集群是否支持 PersistentVolumeClaim 的 ReadWriteMany 操作方式。 | true |
默认情况下 ingress-gateway 会通过一个 LoadBalancer Service 暴露出来,如果你的集群不支持 LoadBalancer 类型的 Service,可以通过修改 higress-core.gateway.service.type 参数来修改 Service 类型,或者通过修改 higress-core.gateway.hostNetwork 参数来直接使用宿主机网络,比如我们这里就使用 hostNetwork 来直接使用宿主机网络:
helm repo add higress.io https://higress.io/helm-charts
helm upgrade --install higress -n higress-system higress.io/higress --set higress-core.gateway.hostNetwork=true,higress-core.gateway.service.type=ClusterIP --create-namespace
TOP