使用 Envoy Gateway 进行 Ingress 和负载均衡

概述

Envoy Gateway 为 Kubernetes 集群提供第 7 层(L7)Ingress 和负载均衡。 它基于 Kubernetes Gateway API 构建,并建立在 Envoy Proxy 之上,支持高级的 HTTP、HTTPS、gRPC 和 TCP 路由,同时具备完整的可观测性和策略控制能力。

Envoy Gateway 通过定义 GatewayClass、Gateway 和 Route 资源,统一了 Ingress 流量管理模型, 提供了一种标准、可移植的替代方案,以取代传统的 Ingress 对象。

网络流量架构

External Client (Browser / curl) https://www.example.com


DNS Resolution (https://www.example.com) → External IP (e.g. 34.23.88.11)


External Load Balancer [L4]


Envoy Gateway (Gateway API) [L7]


Kubernetes Service (ClusterIP) [L4]


Pod (Application)
  • 外部负载均衡器提供一个外部 IP,并将流量映射到集群中。

  • Envoy Gateway 终止 TLS、应用路由规则,并将流量转发到后端服务。

  • Service(虚拟 IP)在各节点上的 Pod 之间分发流量。

该架构以完全符合 Gateway API 的数据平面取代了“Ingress Controller”。

配置路由

定义 GatewayClass

apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: envoy
spec:
  controllerName: gateway.envoyproxy.io/gatewayclass-controller

创建 Gateway

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: public-gateway
  namespace: gateway-system
spec:
  gatewayClassName: envoy
  listeners:
    - name: http
      protocol: HTTP
      port: 80
      allowedRoutes:
        namespaces:
          from: Same
    - name: https
      protocol: HTTPS
      port: 443
      tls:
        mode: Terminate
        certificateRefs:
          - kind: Secret
            name: site-cert

了解更多 配置 Gateway API Gateway

创建 HTTP 路由

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: web-route
  namespace: default
spec:
  parentRefs:
    - name: public-gateway
      namespace: gateway-system
  hostnames:
    - 'app.example.com'
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /
      backendRefs:
        - name: web-service
          port: 8080

了解更多 配置 Gateway API Route

说明

  • Gateway 为 HTTP/S 流量暴露 80 和 443 端口。

  • HTTPRoute 基于主机名和路径定义路由规则。

  • 多个 HTTPRoute 对象可以共享同一个 Gateway。

配置 Ingress 集群流量

Envoy Gateway 会根据你的基础设施支持多种外部流量入口模式。

环境入口类型示例
云环境Service type=LoadBalancer云提供商分配公共 IP
裸金属MetalLB + Service type=LoadBalancerMetalLB 分配外部 IP
边缘 / 内部NodePort 或 hostNetwork用于本地或私有访问

暴露 Envoy Gateway 的示例 Service:

apiVersion: v1
kind: Service
metadata:
  name: envoy-gateway
  namespace: gateway-system
spec:
  type: LoadBalancer
  selector:
    app: envoy
  ports:
    - name: http
      port: 80
      targetPort: 8080
    - name: https
      port: 443
      targetPort: 8443

你可以通过运行以下命令验证分配到的外部 IP:

kubectl get svc envoy-gateway -n gateway-system

负载均衡策略

Envoy Gateway 通过其后端引用提供灵活的负载均衡方法。

默认轮询

backendRefs:
  - name: app-v1
    port: 8080
  - name: app-v2
    port: 8080

加权负载均衡

backendRefs:
  - name: app-v1
    port: 8080
    weight: 80
  - name: app-v2
    port: 8080
    weight: 20

会话亲和性(Sticky Sessions)

Envoy 通过策略配置支持基于 cookie 或源 IP 的会话亲和性:

apiVersion: gateway.envoyproxy.io/v1alpha1
kind: BackendTrafficPolicy
metadata:
  name: web-policy
  namespace: default
spec:
  targetRef:
    group: gateway.networking.k8s.io
    kind: HTTPRoute
    name: web-route
  sessionAffinity:
    type: Cookie
    cookie:
      name: session_id
      ttl: 3600s

了解更多关于 BackendTrafficPolicy

TLS 和安全性

TLS 终止

在 Gateway 监听器级别处理:

tls:
  mode: Terminate
  certificateRefs:
    - kind: Secret
      name: site-cert

TLS 透传

用于端到端加密场景,此时 Envoy 会转发加密流量:

tls:
  mode: Passthrough

Gateway 与 Service 之间的 mTLS

高级策略 CRD 可启用 mTLS 或客户端证书验证。

与 MetalLB 集成

在没有云负载均衡器的裸金属集群中:

  1. 配置 MetalLB IPAddressPool 和 L2Advertisement。

  2. 确保 Envoy Gateway 的 Service 类型为 LoadBalancer。

  3. MetalLB 会自动分配一个外部 IP。

  4. 然后可以通过 DNS 记录将域名(例如 app.example.com)映射到该 IP。

故障排查

问题可能原因解决方案
Gateway 没有外部 IPMetalLB 配置错误检查 Service 类型和 MetalLB 控制器
HTTPRoute 被忽略parentRefs 不匹配确保 Gateway 和命名空间正确
TLS 无法工作找不到 Secret验证 certificateRefs 路径
Gateway 返回 404没有匹配的主机名/路径确认 HTTPRoute 规则
延迟尖峰代理过载扩展 Envoy Gateway 副本数