Ingress 与 Egress
1. 什么是 Ingress 与 Egress?
- Ingress
- 概念:Ingress 指的是外部流量进入服务网格的过程或路径。
- Kubernetes 中的 Ingress:在 Kubernetes 原生中,Ingress 是一种 API 资源,用于定义如何把外部 HTTP/HTTPS 流量路由到集群内的 Service。
- Istio 中的 Ingress Gateway:相比 Kubernetes 原生 Ingress,Istio 提供了更强大的配置能力。它通过 [Gateway + VirtualService] 的组合,允许对进来的请求做更灵活的路由、负载均衡、流量控制和安全策略(例如 TLS 终止、灰度发布、熔断重试等)。
- 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. 具体使用方式
- Ingress Gateway
- 在 Istio 安装时往往会自动部署一个或多个默认的 Ingress Gateway(istio-ingressgateway)。
- 配置时,需要创建:
- Gateway:定义监听端口、协议、域名等。
- 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
的服务。
- Egress Gateway
- 如果需要统一管理外部访问,需配置一个 Egress Gateway 部署(istio-egressgateway),然后为要访问的外部服务进行 ServiceEntry,最后在 VirtualService 中让流量先路由到 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 提供的 VirtualService、DestinationRule、ServiceEntry 等 CRD 结合起来,就可以实现端到端的流量治理,包括入口、出口、服务内部路由、安全策略和可观测性等。这样在实际生产环境里就能更好地实现完整的“零信任网络 + 流量控制 + 全面可观测”方案。
本文作者:许怀安
创作时间:2025-04-09
版权声明:本博客所有文章除特别声明外,均采用BY-NC-SA许可协议。转载请禀明出处!