Istio 是一种开源服务网格,使用代理拦截所有网络流量,可根据配置提供广泛的应用程序感知功能。
常见的 CRD:
VirtualService:定义服务间或服务至外部流量的路由规则,支持请求匹配、路由选择、流量分割、重试、超时等策略。
DestinationRule:定义目标服务的流量策略,比如负载均衡、连接池、TLS 配置等。每个目标服务的流量策略通过 DestinationRule 配置后,对所有请求生效。
Gateway:配置边缘网关的入口流量规则,例如定义外部流量如何进入服务网格。它可以用于 HTTP、HTTPS、TLS 和 TCP 流量。
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: 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: - 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>/