Skip to content

Ingress 与 Egress

1. 什么是 Ingress 与 Egress?

  1. Ingress
    • 概念:Ingress 指的是外部流量进入服务网格的过程或路径。
    • Kubernetes 中的 Ingress:在 Kubernetes 原生中,Ingress 是一种 API 资源,用于定义如何把外部 HTTP/HTTPS 流量路由到集群内的 Service。
    • Istio 中的 Ingress Gateway:相比 Kubernetes 原生 Ingress,Istio 提供了更强大的配置能力。它通过 [Gateway + VirtualService] 的组合,允许对进来的请求做更灵活的路由、负载均衡、流量控制和安全策略(例如 TLS 终止、灰度发布、熔断重试等)。
  2. Egress
    • 概念:Egress 指的是从服务网格内部流向外部目标(如公共 API、第三方 SaaS 服务)的过程或路径。
    • Istio 中的 Egress Gateway:如果需要对外部流量进行统一管理和控制(例如安全策略、流量监控、统一出口 IP 等),可以在网格边缘部署 Egress Gateway。这样网格内服务访问外部时,会先经过 Egress Gateway,再离开网格。

2. 为什么需要 Ingress Gateway 和 Egress Gateway?

2.1 Ingress Gateway

  • 统一入口:将网格内部多服务(微服务集群)对外暴露的入口进行统一管理,把外部请求先引导到 Ingress Gateway。
  • 灵活路由与策略:通过与 VirtualService 配合,可以实现:
    • 基于域名/路径/请求头/版本号等多维度的路由
    • 灰度发布/蓝绿部署(将请求按比例或规则分配给不同版本)
    • 超时、重试、熔断等流量控制策略
    • TLS 终止或双向 TLS 验证
  • 可观测性:统一进入口能更好地收集监控、日志和指标,便于运维和排错。

2.2 Egress Gateway

  • 统一出口:在默认情况下,服务直接访问网格外部服务会绕过 Istio 的很多控制能力;如果需要对外流量进行统一策略或监控,就可以启用 Egress Gateway。
  • 安全与审计:将外部流量统一从 Egress Gateway 出口,对访问外部资源进行安全策略与审计(比如只能访问特定域名或特定 IP,或要进行流量加解密等)。
  • 服务发现与访问控制:结合 ServiceEntry 可以将外部服务“登记”到 Istio 中,进而对其流量实施路由或安全控制,如果需要让外部流量必经指定出口,也可以用 Egress Gateway 做严格管控。
  • 统一 NAT 出口:在某些网络环境中需要统一出口 IP(NAT 网关);Egress Gateway 可以帮助你将所有外部请求集中出去。

3. 具体使用方式

  1. Ingress Gateway
    • 在 Istio 安装时往往会自动部署一个或多个默认的 Ingress Gateway(istio-ingressgateway)。
    • 配置时,需要创建:
      1. Gateway:定义监听端口、协议、域名等。
      2. VirtualService:匹配到该 Gateway 的流量,执行具体的路由规则。

示例(简化 YAML,展示核心概念):

yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: my-ingress-gateway
spec:
  selector:
    istio: ingressgateway     # 使用特定网关 pod 上的标签
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - app.example.com

---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-app-vs
spec:
  hosts:
  - app.example.com
  gateways:
  - my-ingress-gateway
  http:
  - route:
    - destination:
        host: my-app-svc.default.svc.cluster.local
        port:
          number: 8080

通过这样配置,就可以把对 app.example.com 域名(80端口)的请求转发到网格内名为 my-app-svc 的服务。

  1. Egress Gateway
    • 如果需要统一管理外部访问,需配置一个 Egress Gateway 部署(istio-egressgateway),然后为要访问的外部服务进行 ServiceEntry,最后在 VirtualService 中让流量先路由到 Egress Gateway,再离开网格。
      示例
plain
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: external-api
spec:
  hosts:
  - api.external.com
  ports:
  - number: 443
    name: https
    protocol: TLS
  resolution: DNS
  location: MESH_EXTERNAL
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: external-api-through-egress
spec:
  hosts:
  - api.external.com
  gateways:
  - istio-egressgateway
  tls:
  - match:
    - port: 443
      sniHosts:
      - api.external.com
    route:
    - destination:
        host: api.external.com
        port:
          number: 443
      weight: 100

这里的思路是:

- 先通过 ServiceEntry 声明 “有个外部服务 `api.external.com`”。
- 配置一个或多个规则,让内部请求发送到 istio-egressgateway,然后由 Egress Gateway 代理访问该外部地址。
- 可以在 Egress Gateway 中应用网络策略、监控、TLS 加密等。

4. 与 Kubernetes 原生 Ingress 的对比

  • Kubernetes Ingress:主要聚焦在“根据域名和路径将外部请求路由到集群内的 Service”,相对功能简单。
  • Istio Ingress Gateway:不仅可以完成上述功能,还能在层 7 上做更多的流量控制(路由、负载均衡、熔断、故障注入等)、安全策略(mTLS、JWT 验证等),也能配合 Istio 的可观测性收集各种指标和日志。

如果不想引入 Istio 的全部流量管理能力,可以继续使用 Kubernetes 原生 Ingress;如果想统一使用 Istio 进行更丰富的网格治理,则通常将入口流量放到 Istio Ingress Gateway 下。


5. 总结

  • Ingress:让外部流量进入到网格/集群。
    • 在 Istio 中通过部署一个或多个 Ingress Gateway 实现,能更灵活地进行七层路由、熔断、流量管控和安全策略。
  • Egress:让网格内的流量访问外部(第三方服务或公共 API)。
    • 默认直接访问外部可能无法经过 Istio 的策略控制,若需要更严格的监控或策略,可部署一个 Egress Gateway,把所有外部请求统一流经此处。

将 Ingress Gateway、Egress Gateway 与 Istio 提供的 VirtualServiceDestinationRuleServiceEntry 等 CRD 结合起来,就可以实现端到端的流量治理,包括入口、出口、服务内部路由、安全策略和可观测性等。这样在实际生产环境里就能更好地实现完整的“零信任网络 + 流量控制 + 全面可观测”方案。

本文作者:许怀安
创作时间:2025-04-09
版权声明:本博客所有文章除特别声明外,均采用BY-NC-SA许可协议。转载请禀明出处!

许怀安 | MIT License