Istio网关容量水位与OPA安全基线巡检 - 第2节
2.1 Gateway:入口流量的边界守卫
在 Istio 服务网格中,Gateway 负责管理网格边缘的南北向流量。它充当集群入口的负载均衡器,决定哪些外部流量可以进入网格,以及应该将流量转发给哪个内部服务。
Gateway 资源定义了一个逻辑端点,通常对应一个 Envoy 代理实例。它通过 selector 字段绑定到特定的工作负载(如 istio-ingressgateway Pod),并配置监听端口、协议和 TLS 证书。
Gateway 核心字段
| 字段 | 说明 | 示例值 |
|---|---|---|
servers.port |
监听端口与协议(HTTP、HTTPS、GRPC、TCP) | number: 443, protocol: HTTPS |
servers.hosts |
允许通过的域名列表,支持通配符 | ["*.example.com", "api.example.com"] |
servers.tls |
TLS 终止模式(SIMPLE/MUTUAL/PASSTHROUGH)及证书来源 | mode: SIMPLE, credentialName: ingress-cert |
selector |
将 Gateway 绑定到特定 ingress gateway Pod 的标签 | istio: ingressgateway |
关键原则:Gateway 只负责“暴露端口和域名”,不负责“路由规则”。路由逻辑由 VirtualService 定义。
2.2 VirtualService:流量路由的指挥中心
VirtualService 是 Istio 流量管理的核心资源。它定义了一组流量路由规则,控制请求如何从 Gateway 或 Sidecar 到达目标服务。VirtualService 可以执行以下操作:
- 根据请求的 URI、Header、Method 等条件进行匹配。
- 将流量分发到服务的不同 子集(Subset),实现灰度发布、A/B 测试。
- 设置 超时、重试、故障注入 等流量策略。
- 改写请求的 Host、URI 或添加/删除 Header。
VirtualService 核心字段
| 字段 | 说明 | 典型配置 |
|---|---|---|
hosts |
匹配的域名,与 Gateway 的 hosts 对应 | ["api.example.com"] |
gateways |
关联的 Gateway 名称列表,mesh 表示网格内部 |
["my-gateway"] |
http.match |
HTTP 路由匹配条件(URI、Header、Method、QueryParams) | uri.prefix: "/v1/" |
http.route |
匹配后的流量转发目标(destination + weight) | destination.host: "svc.default.svc.cluster.local" |
2.3 流量路由原理:从外部请求到 Pod
当外部请求到达 Istio 入口网关时,完整的流量路径遵循以下步骤:
- DNS 解析:客户端将域名(如
api.example.com)解析为 Ingress Gateway 的外部 IP 或负载均衡器地址。 - Gateway 接收:Envoy 代理(istio-ingressgateway)在指定端口(如 443)接收请求,根据
servers.hosts判断是否允许该域名。 - VirtualService 匹配:Gateway 将请求转交给匹配的 VirtualService。VirtualService 根据
http.match规则(URI、Header 等)选择对应的路由。 - DestinationRule 解析:路由目标指向一个 Service Host,Istio 结合 DestinationRule 确定可用的 Pod 子集(如 version: v1)和负载均衡策略。
- Envoy 转发:Envoy 根据服务发现信息,将请求转发到目标 Pod 的 Sidecar Proxy,最终到达应用容器。
运维要点:Gateway 和 VirtualService 是解耦的。一个 Gateway 可以关联多个 VirtualService,一个 VirtualService 也可以被多个 Gateway 引用。这种设计使得安全策略(Gateway)与路由策略(VirtualService)可以独立变更。
2.4 典型配置示例:Gateway + VirtualService 联动
以下是一个完整的入口网关配置,展示如何将 api.example.com 的请求路由到 api-service 的 v1 版本:
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: api-gateway
namespace: istio-system
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 443
name: https
protocol: HTTPS
hosts:
- "api.example.com"
tls:
mode: SIMPLE
credentialName: api-tls-cert
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: api-vs
namespace: default
spec:
hosts:
- "api.example.com"
gateways:
- istio-system/api-gateway
http:
- match:
- uri:
prefix: "/v1/"
route:
- destination:
host: api-service.default.svc.cluster.local
subset: v1
port:
number: 8080
weight: 100
- match:
- uri:
prefix: "/v2/"
route:
- destination:
host: api-service.default.svc.cluster.local
subset: v2
port:
number: 8080
weight: 100
常见陷阱:Gateway 和 VirtualService 的
hosts 字段必须匹配,否则请求会被 Gateway 拒绝。另外,VirtualService 中的 gateways 字段必须引用正确的 Gateway 名称(格式:namespace/gateway-name),否则路由规则不会生效。
2.5 Gateway 与 VirtualService 的职责边界
理解两者的职责分离,对于后续配置 OPA 安全策略至关重要:
| 维度 | Gateway | VirtualService |
|---|---|---|
| 关注点 | 网络边界安全、TLS 终止、端口暴露 | 流量路由、灰度发布、请求改写 |
| 变更频率 | 低(证书更新、端口变更) | 高(新功能上线、A/B 测试) |
| 安全影响 | 直接决定哪些流量可以进入网格 | 决定流量如何分发,影响内部服务暴露面 |
| OPA 审计重点 | 检查 hosts 白名单、TLS 配置合规性 | 检查路由目标是否越权、权重是否合理 |
2.6 本章小结
- Gateway 是网格的“大门”,负责端口暴露、TLS 终止和域名过滤,不参与路由决策。
- VirtualService 是“交通警察”,根据请求特征将流量路由到指定服务版本,支持丰富的流量治理策略。
- 两者通过
hosts和gateways字段建立关联,形成从外部请求到内部 Pod 的完整路由链。 - 理解这一基础架构,是后续实现 OPA 安全基线巡检的前提——OPA 策略将分别审计 Gateway 的暴露面合规性和 VirtualService 的路由安全性。