第 4 章:Istio 网关 - 把流量导入集群
本文系统梳理了 Istio 网关的原理、配置与实践,涵盖 HTTP、HTTPS、mTLS 及 TCP/SNI 等多种流量场景,帮助读者掌握服务网格入口流量治理的核心能力。
流量入口与虚拟 IP 概念
在云原生环境中,服务间通信前,首先要解决外部流量如何安全、可靠地进入集群。入口点(Entry Point)作为网络的守门人,负责流量的接入、路由和安全策略。
通过将域名映射到虚拟 IP(VIP),结合反向代理实现高可用和灵活的服务访问。虚拟主机(Virtual Host)机制允许多个服务共用同一入口,通过 Host/SNI 等头部实现流量分发。
Istio 入口网关原理与架构
Istio 入口网关(Ingress Gateway)基于 Envoy 代理,承担集群边界的流量接入、协议转换、负载均衡和安全控制等职责。它通过 Gateway 和 VirtualService 两类 CRD 资源实现灵活的流量管理。
入口网关进程验证
可通过如下命令验证 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 路由等高级场景,适应企业级多租户和安全需求。
- 建议结合实际业务拆分网关、精细化配置和监控,提升整体可用性和可观测性。
参考文献
- Istio 官方文档 - istio.io
- Kubernetes Gateway API - gateway-api.sigs.k8s.io
- cert-manager 官方文档 - cert-manager.io
- Gloo Edge API 网关 - solo.io