Istio 使用随记

Istio 是一种开源服务网格,使用代理拦截所有网络流量,可根据配置提供广泛的应用程序感知功能。

常见的 CRD:

  1. VirtualService:定义服务间或服务至外部流量的路由规则,支持请求匹配、路由选择、流量分割、重试、超时等策略。
  2. DestinationRule:定义目标服务的流量策略,比如负载均衡、连接池、TLS 配置等。每个目标服务的流量策略通过 DestinationRule 配置后,对所有请求生效。
  3. Gateway:配置边缘网关的入口流量规则,例如定义外部流量如何进入服务网格。它可以用于 HTTP、HTTPS、TLS 和 TCP 流量。
  4. ServiceEntry:将外部服务引入到 Istio 网格中,允许 Istio 管理和监控这些服务的流量。例如,可以使用 ServiceEntry 来引入外部 API,使网格中的服务可以透明地与外部服务交互。

创建一个 Nginx,用于测试:

1
2
kubectl create deployment nginx --image=nginx:mainline
kubectl expose deployment nginx --port=80

创建 Gateway:

selector 匹配 istio-ingressgateway 部署的 Pod,通过该网关来接收外部流量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: http-gateway
namespace: istio-system
spec:
selector:
# select the istio ingressgateway
istio: ingressgateway
servers:
- hosts:
- test.nginx.com
port:
name: http
number: 80
protocol: HTTP

创建 VirtualService:

hosts 字段指定了可以通过 test.nginx.com 主机名访问该服务的外部请求,流量通过定义的 Gateway 进入。VirtualService 的 route 字段将流量路由到 nginx.default.svc.cluster.local。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: nginx-virtualservice
namespace: default
spec:
gateways:
# select the gateway created above
- http-gateway.istio-system.svc.cluster.local
hosts:
- test.nginx.com
http:
- route:
- destination:
host: nginx.default.svc.cluster.local
port:
number: 80

创建 DestinationRule:

trafficPolicy 中定义了负载均衡策略为 LEAST_CONN,即最小连接数策略。DestinationRule 的 host 必须匹配 VirtualService 中的 destination。

1
2
3
4
5
6
7
8
9
10
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: nginx-destination-rule
namespace: default
spec:
host: nginx.default.svc.cluster.local
trafficPolicy:
loadBalancer:
simple: LEAST_CONN

通过 Istio Ingress Gateway 访问 Nginx:

1
curl -H "Host: test.nginx.com" http://<istio-ingressgateway-cluster-ip>/
Author

Warner Chen

Posted on

2024-11-08

Updated on

2024-11-11

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.