定义
是一个完全开源的服务网格,作为透明的一层接入到现有的分布式应用程序里。它也是一个平台,拥有可以集成任何日志、遥测和策略系统的 API 接口。Istio 多样化的特
原理
通过在整个环境中部署一个特殊的 sidecar 代理为服务添加 Istio 的支持,而代理会拦截微服务之间的所有网络通信,然后使用其控制平面的功能来配置和管理 Istio
提供能力
- 流量管理 (如熔断器、超时和重试)
- 安全通信
- 观察性 (追踪、监控和日志)
- 平台支持
流量管理
- 虚拟服务(VirtualService)
定义
拟服务让您配置如何在服务网格内将请求路由到服务
组成
虚拟服务包含一组路由规则,istio 按顺序匹配到实际目标地址
功能
映射单一服务到多个真实服务,将单体应用转为微服务构建复合应用系统
网关整合并配置流量规则来控制出入流量
超时/重试
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- fault:
delay:
percentage:
value: 0.1 #故障注入下面的虚拟服务为千分之一的访问 ratings 服务的请求配置了一个 5 秒的延迟
- match:
- headers:
end-user:
exact: jason
uri:
prefix: /reviews
route:
- destination:
host: reviews 与 detinationrul中的spec.host相批配
subset: v2
weight: 75
- route:
- destination:
host: reviews
subset: v3
weight: 25
timeout: 10s
retries:
attempts: 3
preTryTimeOut: 2s #初始调用失败后最多重试 3 次来连接到服务子集,每个重试都有 2 秒的超时
host:reviews[0]
虚拟主机名:可以是 IP 地址、DNS 名称,或者依赖于平台的一个简称
- 路由规则 (不同服务间路由规则控制)
路由规则是将特定流量子集路由到指定目标地址的强大工具
http
http 字段包含了虚拟服务的路由规则,用来描述匹配条件和路由行为
Destination route 部分的 destination 字段指定了符合此条件的流量的实际目标地址。与虚拟服务的 hosts 不同,destination 的 host 必须是存在于 Istio 服务注册中心的实际目标地址,否则 Envoy 不知道该将请求发送到哪里。可以是一个有代理的服务网格,或者是一个通过服务入口被添加进来的非网格服务。本示例运行在 Kubernetes 环境中,host 名为一个 Kubernetes 服务名
服务子集 ?????(目标规则中有定义)
路由优先级
从上到下有顺序选择,不满足规则的均流向默认目标
- 目标规则(DeistiationRule集群中流量分配)
- 目标规则是 Istio 流量路由功能的关键部分,您可以将虚拟服务视为将流量如何路由到给定目标地址,然后使用目标规则来配置该目标的流量。在评估虚拟服务路由规则之后,目标规则将应用于流量的“真实”目标地址。
- 使用目标规则来指定命名的服务子集
- 定制Envoy的流量策略:负载均衡,熔断,TLS
- 每个子集都是基于一个或多个 labels 定义的,在 Kubernetes 中它是附加到像 Pod 这种对象上的键/值对。这些标签应用于 Kubernetes 服务的 Deployment 并作为 metadata 来识别不同的版本。(对应deployment mettadata.labels)
- 熔断
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: my-destination-rule
spec:
host: my-svc
trafficPolicy:
loadBalancer:
simple: RANDOM
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
- name: v3
labels:
version: v3
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100 #示例将 v1 子集的reviews服务工作负载的并发连接数限制为 100
- 网关(gateWay)
定义
使用网关为网格来管理入站和出站流量,可以让您指定要进入或离开网格的流量。
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: ext-host-gwy
spec:
selector:
app: my-gateway-controller
servers:
- port:
number: 443
name: https
protocol: HTTPS
hosts:
- ext-host.example.com
tls:
mode: SIMPLE
serverCertificate: /tmp/tls.crt
privateKey: /tmp/tls.key
spec.servers.hosts 与virtualservice中 spec.gateways 绑定
- 服务入口ServiceEntry
服务入口(Service Entry) 来添加一个入口到 Istio 内部维护的服务注册中心,(把外部服务添加到istio中)
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: svc-entry
spec:
hosts:
- ext-svc.example.com
ports:
- number: 443
name: https
protocol: HTTPS
location: MESH_EXTERNAL
resolution: DNS
您可以配置虚拟服务和目标规则,以更细粒度的方式控制到服务入口的流量,这与网格中的任何其他服务配置流量的方式相同。例如,下面的目标规则配置流量路由以使用双向 TLS 来保护到 ext-svc.example.com 外部服务的连接,我们使用服务入口配置了该外部服务
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: ext-res-dr
spec:
host: ext-svc.example.com
trafficPolicy:
tls:
mode: MUTUAL
clientCertificate: /etc/certs/myclientcert.pem
privateKey: /etc/certs/client_private_key.pem
caCertificates: /etc/certs/rootcacerts.pem
- Sidecar
默认情况下,Istio 让每个 Envoy 代理都可以访问来自和它关联的工作负载的所有端口的请求,然后转发到对应的工作负载。您可以使用 sidecar 配置去做下面的事情
- 微调 Envoy 代理接受的端口和协议集。
- 限制 Envoy 代理可以访问的服务集合。
apiVersion: networking.istio.io/v1alpha3
kind: Sidecar
metadata:
name: default
namespace: bookinfo
spec:
egress:
- hosts:
- "./*"
- "istio-system/*"