Gateway和VirtualService
在 Istio 服务网格中,Gateway
和 VirtualService
是两个关键的配置对象,它们分别用于定义入站流量的接入点和路由规则。下面详细介绍这两个配置对象的功能及其相互关系。
Gateway
Gateway
是 Istio 中用于定义入站流量接入点的配置对象。它描述了外部流量如何进入服务网格,通常与边缘路由器或负载均衡器关联。Gateway
配置定义了监听的端口、协议(如 HTTP 或 TLS)以及与之关联的 IP 地址或主机名。
Gateway 的作用
- 定义入站端口:指定哪些端口应该监听入站流量。
- 定义协议类型:指定支持的协议类型,如 HTTP、HTTPS 或 TCP。
- 关联边缘设备:与边缘路由器或负载均衡器关联,以便管理入站流量。
Gateway 示例
以下是一个简单的 Gateway
配置示例:
Yaml
深色版本
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: example-gateway
spec:
selector:
istio: ingressgateway # 使用 Istio Ingress Gateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "example.com"
- port:
number: 443
name: https
protocol: HTTPS
tls:
mode: SIMPLE # 简单的 TLS 模式
credentialName: example-tls-secret # 使用的 TLS 秘钥名称
hosts:
- "example.com"
在这个示例中,example-gateway
监听端口 80 和 443,支持 HTTP 和 HTTPS 协议,并且与主机名 example.com
关联。
VirtualService
VirtualService
是 Istio 中用于定义服务间路由规则的配置对象。它允许你根据不同的条件(如 HTTP 方法、URL 路径、请求头等)来定义如何将请求路由到不同的目标服务或服务实例。
VirtualService 的作用
- 请求匹配:根据请求的特征(如 HTTP 方法、URL、头部等)匹配请求。
- 请求路由:定义匹配请求后应如何路由。
- 流量管理:实现金丝雀发布、AB 测试等流量管理策略。
- 重试和超时:定义重试逻辑和超时策略。
VirtualService 示例
以下是一个简单的 VirtualService
配置示例,用于将请求路由到不同的服务版本:
Yaml
深色版本
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: example-vs
spec:
hosts:
- "example.com"
gateways:
- example-gateway # 与上面定义的 Gateway 关联
http:
- match:
- uri:
exact: "/v1/api"
route:
- destination:
host: "v1-service"
port:
number: 8080
weight: 80
- destination:
host: "v2-service"
port:
number: 8080
weight: 20
在这个示例中,所有针对 example.com
的 HTTP 请求将被路由到 v1-service
和 v2-service
,其中 v1-service
占 80% 的流量,v2-service
占 20% 的流量。
Gateway 和 VirtualService 的组合使用
Gateway
和 VirtualService
通常配合使用,以实现对外部流量的精细控制。Gateway
定义了流量如何进入服务网格,而 VirtualService
则定义了进入网格后的流量如何被路由。
综合示例
以下是结合 Gateway
和 VirtualService
的综合示例:
Yaml
深色版本
# example-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: example-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "example.com"
# example-vs.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: example-vs
spec:
hosts:
- "example.com"
gateways:
- example-gateway
http:
- match:
- uri:
exact: "/v1/api"
route:
- destination:
host: "v1-service"
port:
number: 8080
weight: 80
- destination:
host: "v2-service"
port:
number: 8080
weight: 20
在这个综合示例中,example-gateway
定义了如何监听来自 example.com
的 HTTP 流量,而 example-vs
则定义了如何将这些请求路由到 v1-service
和 v2-service
。