第 4 章:Istio 网关 - 把流量导入集群

本文系统梳理了 Istio 网关的原理、配置与实践,涵盖 HTTP、HTTPS、mTLS 及 TCP/SNI 等多种流量场景,帮助读者掌握服务网格入口流量治理的核心能力。

流量入口与虚拟 IP 概念

在云原生环境中,服务间通信前,首先要解决外部流量如何安全、可靠地进入集群。入口点(Entry Point)作为网络的守门人,负责流量的接入、路由和安全策略。

通过将域名映射到虚拟 IP(VIP),结合反向代理实现高可用和灵活的服务访问。虚拟主机(Virtual Host)机制允许多个服务共用同一入口,通过 Host/SNI 等头部实现流量分发。

图 1: 流量如何进入集群
图 1: 流量如何进入集群
图 4.1 外部客户端如何访问集群内服务

Istio 入口网关原理与架构

Istio 入口网关(Ingress Gateway)基于 Envoy 代理,承担集群边界的流量接入、协议转换、负载均衡和安全控制等职责。它通过 Gateway 和 VirtualService 两类 CRD 资源实现灵活的流量管理。

图 2: Istio 入口网关架构
图 2: Istio 入口网关架构
图 4.5 Istio 入口网关作为反向代理,统一接入流量

入口网关进程验证

可通过如下命令验证 Envoy 代理在网关 Pod 内运行:

kubectl -n istio-system exec deploy/istio-ingressgateway -- ps

Gateway 与 VirtualService 配置实践

配置 Gateway 资源

Gateway 资源定义了入口网关监听的端口、协议和主机。例如,开放 80 端口接收 webapp 流量:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: coolstore-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - "webapp.istioinaction.io"

应用配置后,可通过 istioctl proxy-config listener 检查监听端口。

配置 VirtualService 路由

VirtualService 资源定义了如何将入口流量路由到集群内服务。例如,将 webapp 流量转发到 8080 端口:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: webapp-vs-from-gw
spec:
  hosts:
    - "webapp.istioinaction.io"
  gateways:
    - coolstore-gateway
  http:
    - route:
        - destination:
            host: webapp
            port:
              number: 8080

通过 istioctl proxy-config route 可验证路由生效。

入口流量调用示例

调用入口服务时需确保 Host 头与 VirtualService 匹配:

curl http://localhost/api/catalog -H "Host: webapp.istioinaction.io"

HTTPS 与 TLS 终止

为提升安全性,Istio 支持在网关终止 TLS,实现 HTTPS 接入。需先将证书与私钥以 Kubernetes Secret 形式存储:

kubectl create -n istio-system secret tls webapp-credential \
  --key path/to/webapp.key.pem \
  --cert path/to/webapp.cert.pem

Gateway 配置示例:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: coolstore-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 443
        name: https
        protocol: HTTPS
      tls:
        mode: SIMPLE
        credentialName: webapp-credential
      hosts:
        - "webapp.istioinaction.io"

调用时需指定 CA 证书和 Host:

curl -H "Host: webapp.istioinaction.io" \
  https://webapp.istioinaction.io:443/api/catalog \
  --cacert path/to/ca-chain.cert.pem \
  --resolve webapp.istioinaction.io:443:127.0.0.1

强制 HTTP 跳转到 HTTPS

可通过 Gateway 配置 httpsRedirect: true 实现自动跳转:

tls:
  httpsRedirect: true

mTLS 双向认证

Istio 支持在入口网关启用 mTLS,实现客户端与服务端双向身份验证。需为 Secret 增加 CA 证书,并配置 Gateway 的 mode: MUTUAL

tls:
  mode: MUTUAL
  credentialName: webapp-credential-mtls

调用时需同时传递客户端证书和私钥:

curl -H "Host: webapp.istioinaction.io" \
  https://webapp.istioinaction.io:443/api/catalog \
  --cacert path/to/ca-chain.cert.pem \
  --cert path/to/client.cert.pem \
  --key path/to/client.key.pem \
  --resolve webapp.istioinaction.io:443:127.0.0.1

多虚拟主机与 SNI 路由

Istio 网关可为多个虚拟主机配置不同证书,基于 SNI 实现多租户安全隔离。只需在 Gateway servers 下增加多个 hosts 和 credentialName 条目。

TCP 与 SNI Passthrough 流量

Istio 网关不仅支持 HTTP/HTTPS,还可转发任意 TCP 流量。通过 Gateway 配置 protocol: TCP/TLS,并结合 VirtualService 的 tcp/tls 路由实现。例如:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: echo-tcp-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 31400
        name: tcp-echo
        protocol: TCP
      hosts:
        - "*"

SNI Passthrough 场景下,mode 设为 PASSTHROUGH,流量不在网关终止 TLS,而是直接转发到后端服务。

网关运维与优化建议

  • 多网关部署:可按团队、业务或合规需求拆分多个入口网关,提升隔离性和可维护性。
  • 网关注入:通过注解和模板实现自助式网关部署,便于团队独立管理。
  • 访问日志与遥测:合理开启访问日志,结合 Telemetry API 精细化采集,避免日志泛滥。
  • 配置精简:通过 PILOT_FILTER_GATEWAY_CLUSTER_CONFIG 等参数,减少网关代理无关配置,提升性能。

总结

  • Istio 网关为服务网格提供了灵活、安全的入口流量管理能力,支持 HTTP、HTTPS、mTLS、TCP/SNI 等多种协议。
  • Gateway 与 VirtualService 资源解耦了 L4/L7 配置,提升了流量治理的灵活性和可维护性。
  • 支持多虚拟主机、多证书、SNI 路由等高级场景,适应企业级多租户和安全需求。
  • 建议结合实际业务拆分网关、精细化配置和监控,提升整体可用性和可观测性。

参考文献

  1. Istio 官方文档 - istio.io
  2. Kubernetes Gateway API - gateway-api.sigs.k8s.io
  3. cert-manager 官方文档 - cert-manager.io
  4. Gloo Edge API 网关 - solo.io

文章导航

独立页面

这是书籍中的独立页面。

书籍首页

评论区