基于Envoy与Istio的云原生API网关,兼容Ingress、Gateway API与Istio生态
Higress 是由阿里巴巴开源、捐赠给 CNCF 的云原生 API 网关。它和前面几个组件的最大区别是:控制平面直接复用了 Istio。
具体来说:
higress-controller 控制平面,基于 Istio 的 xDS 能力改造而来
higress-gateway 数据平面,就是 Envoy
higress-console Web 控制台,提供图形化的路由与插件管理
因为控制平面就是 Istio,所以 Higress 天然同时支持三套 API:
Ingress 标准的 Kubernetes Ingress,通过 ingressClassName: higress 使用
Gateway API 标准的 Gateway / HTTPRoute,需要额外开启
Istio API VirtualService / DestinationRule 等 Istio 自有资源
这意味着已有的 Istio 配置可以平移到 Higress,反之亦然,这是它与其他网关相比最独特的地方。
它在 API 网关层面的能力也明显强于纯 Ingress Controller:
McpBridge 资源把 Nacos、Consul、Eureka、ZooKeeper、DNS 里的服务直接接入,不要求服务必须跑在 Kubernetes 里。选型时记住这个差异:如果你已经在用 Istio 且需要一个更完整的入口网关能力,Higress 是平移成本最低的选择;如果完全是 Kubernetes 原生技术栈,Envoy Gateway 或 Contour 更简单。
要求 Helm 3.10 及以上:
helm repo add higress.io https://higress.io/helm-charts
helm repo update
helm install higress -n higress-system higress.io/higress \
--create-namespace --render-subchart-notes
国内环境可以用加速仓库(镜像本身也有独立镜像源,不受 Docker Hub 限制影响):
helm repo add higress.cn https://higress.cn/helm-charts
helm upgrade --install higress -n higress-system higress.cn/higress \
--create-namespace --render-subchart-notes
本地集群(Kind、Rancher Desktop 等)需要加上本地模式参数:
helm install higress -n higress-system higress.io/higress \
--create-namespace --render-subchart-notes \
--set global.local=true \
--set global.o11y.enabled=false
验证部署:
kubectl get pods -n higress-system
kubectl get svc -n higress-system
主要组件:higress-gateway 是数据平面,默认 2 副本并监听 80 与 443;higress-controller 是控制平面;higress-console 是控制台,后两者默认各 1 副本。
kubectl get svc -n higress-system higress-gateway \
-o jsonpath='{.status.loadBalancer.ingress[0].ip}'
如果拿不到 LoadBalancer IP(裸机或本地集群),可以用本地模式加端口转发,或开启 hostNetwork 交由外部负载均衡转发:
kubectl port-forward service/higress-gateway -n higress-system 80:80 443:443
# 或者安装时加 --set higress-core.gateway.hostNetwork=true
kubectl port-forward service/higress-console -n higress-system 8080:8080
浏览器打开后首次访问会要求初始化管理员账号。控制台里可以完成路由配置、插件开关、证书管理、服务来源管理等操作,也可以直接看到下发的配置。
如果装了 hgctl 命令行工具,可以直接拉起控制台:
hgctl dashboard console
最简单的方式,和普通 Ingress Controller 用法一致,只需指定 ingressClassName: higress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: foo
namespace: default
spec:
ingressClassName: higress
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
pathType: Prefix
backend:
service:
name: foo-svc
port:
number: 8080
验证:
curl http://<GatewayIP>/foo -H 'host: foo.bar.com'
因为控制平面就是 Istio,可以直接写 VirtualService:
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: reviews
namespace: default
spec:
hosts:
- reviews.example.com
gateways:
- higress-system/higress-gateway
http:
- route:
- destination:
host: reviews-v1
port:
number: 8080
weight: 90
- destination:
host: reviews-v2
port:
number: 8080
weight: 10
# 1. 先装 Gateway API 的 CRD
kubectl apply -f \
https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.6.0/experimental-install.yaml
# 2. 升级 Higress 打开 Gateway API 支持
helm upgrade higress -n higress-system \
--set global.enableGatewayAPI=true \
higress.io/higress --reuse-values
版本兼容关系需要留意:Higress 2.2.4 及以上对应 Gateway API 1.6.0,2.2.0 至 2.2.4 之间对应 1.4.0,2.1.x 及以下对应 1.0.0。
这是 Higress 相比其他网关的独有优势。用 McpBridge 把 Nacos、Consul、Eureka、DNS 里的服务接进来:
apiVersion: networking.higress.io/v1
kind: McpBridge
metadata:
name: default
namespace: higress-system
spec:
registries:
- name: my-nacos
type: nacos2
domain: nacos-server.default.svc.cluster.local
port: 8848
nacosGroups:
- DEFAULT_GROUP
- name: my-dns
type: dns
domain: api.example.com
port: 80
之后就可以像引用普通 Service 一样引用这些外部服务,网关会自动感知实例变化。
插件通过 WasmPlugin 资源挂载,也可以在控制台里直接开启:
apiVersion: extensions.higress.io/v1alpha1
kind: WasmPlugin
metadata:
name: key-rate-limit
namespace: higress-system
spec:
url: oci://higress-registry.cn-hangzhou.cr.aliyuncs.com/plugins/key-rate-limit:1.0.0
defaultConfig:
rate_limit_by_header: X-Real-IP
常用插件类别:认证类(key-auth、basic-auth、jwt-auth、oidc)、限流类(key-rate-limit、cluster-key-rate-limit)、安全类(ip-restriction、waf、bot-detect)、流量类(canary、redirect、cors)、可观测类(prometheus、zipkin、skywalking)。
# 控制器日志:配置为什么没下发
kubectl -n higress-system logs deploy/higress-controller --tail=100 -f
# 数据平面日志:请求为什么不通
kubectl -n higress-system logs deploy/higress-gateway --tail=100 -f
# 查看网关容器内的 Envoy 实际配置
kubectl -n higress-system exec deploy/higress-gateway -- \
curl -s localhost:15000/config_dump | head
# 查看控制器版本
kubectl -n higress-system get deploy higress-controller \
-o jsonpath='{.spec.template.spec.containers[0].image}'
helm delete higress -n higress-system
istio/base chart 提供 CRD,不要装 istiod。global.local=true 只适合本地集群。它会把网关的 Service 类型改成 NodePort 之类便于本地访问的形态,生产环境使用会失去负载均衡能力。本地调试完记得改回。McpBridge 是命名空间级的单例。官方约定在 higress-system 下创建一个名为 default 的 McpBridge,重复创建同名或同命名空间多个实例会造成服务来源混乱。higress.cn 提供 chart 与镜像的加速,用 higress.io 在受限网络下可能拉取超时。两者可以混合使用,但要以其中一个为准,避免版本不一致。higress-core.gateway.replicas,数据平面是无状态的水平扩展。gateways 字段要写对引用。用 VirtualService 时,spec.gateways 需要写成 <命名空间>/<网关名>,漏掉命名空间前缀会导致路由绑不上网关,且不会有明显报错。kubectl — Kubernetes集群管理工具istio — Higress控制平面所基于的服务网格envoy — Higress的数据平面gateway-api — Higress可选支持的标准路由APIingress — Higress同时兼容的标准路由对象helm — Kubernetes包管理器