目标规则(DestinationRule)
可以将虚拟服务视为将流量如何路由到目标地址,然后目标规则来配置该目标的流量。虚拟服务路由规则之后,目标规则将应用于流量的“真实”目标地址。
简单来说:虚拟服务通过目标规则后,到达目标地址(服务)
应用场景:整个目的地服务或特定服务子集时定制 Envoy 的流量策略,负载均衡模型、TLS 安全模式或熔断器设置。
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
每个子集都是基于一个或多个 labels
定义的,标签应用于kubernetes集群中deployment控制器metadata字段来识别不同版本。
负载均衡选项
Istio 默认使用轮询的负载均衡策略,Istio 同时支持如下的负载均衡模型,可以在 DestinationRule
中为指定:
- 随机:请求以随机的方式转到池中的实例。
- 权重:请求根据指定的百分比转到实例。
- 最少请求:请求被转到最少被访问的实例。
网关(Gateway)
- 管理入站和出站流量,网关配置网格边界的独立 Envoy 代理,而不是服务工作负载的 sidecar 代理。
- Istio 网关可以配置 4-6 层的负载均衡属性,如对外暴露的端口、TLS 设置等
- 网关主要用于管理进入的流量
- Istio 提供了预先配置的网关代理(
istio-ingressgateway
和istio-egressgateway
)
栗子
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: ext-host-gwy spec: selector: istio: ingressgateway # use istio default 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
这个网关配置让 HTTPS 流量从 ext-host.example.com
通过 443 端口流入网格,但没有为请求指定任何路由规则。为想要工作的网关指定路由,您必须把网关绑定到虚拟服务上。
如下面的示例所示,使用虚拟服务的 gateways
字段进行设置:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: virtual-svc spec: hosts: - ext-host.example.com gateways: - ext-host-gwy
然后就可以为出口流量配置带有路由规则的虚拟服务。
Sidecar
默认情况下,Istio 让每个 Envoy 代理都可以访问和它关联工作负载的所有端口的请求,然后转发到对应的工作负载。
可以使用 sidecar配置做:
微调
Envoy 代理接受的端口和协议集
。限制
Envoy 代理可以访问的服务集合
。
在较庞大的应用程序中限制 sidecar 可达性
,配置每个代理能访问网格中的任意服务,可能会因为高内存使用量
而影响网格的性能。
可以指定将 sidecar 配置应用于特定命名空间中的所有工作负载,或者使用 workloadSelector
选择特定的工作负载
例如,下面的 sidecar 配置将 bookinfo
命名空间中的所有服务配置为,仅能访问运行在相同命名空间和 Istio 控制平面中的服务:
apiVersion: networking.istio.io/v1alpha3 kind: Sidecar metadata: name: default namespace: bookinfo spec: egress: - hosts: - "./*" - "istio-system/*"
网络弹性和测试
除了网格导流外,Istio 还提供了故障恢复和故障注入
功能,您可以在运行时动态配置这些功能。使用这些特性可以让您的应用程序运行稳定
,确保服务网格能够容忍故障节点
,并防止局部故障级联影响到其他节点。
超时
超时是 Envoy 代理
等待来自给服务答复
的时间,确保服务不会因为等待答复而无限期的挂起
。HTTP 请求的默认超时时间
是 15 秒
,这意味着如果服务在 15 秒内没有响应,调用将失败。
为了找到最佳超时设置
,Istio 允许使用虚拟服务,按服务轻松地动态调整超时,而不必修改您的业务代码。
栗子:
一个虚拟服务,对 ratings 服务的 v1 子集的调用,指定 10 秒超时
时间
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings spec: hosts: - ratings http: - route: - destination: host: ratings subset: v1 timeout: 10s
重试
服务为初始调用失败
,Envoy 代理
尝试连接服务的最大次数
。确保调用不会因为临时过载
的服务或网络等问题而永久失败。
重试之间的间隔(25ms+)
是可变的,HTTP 请求的默认重试行为是在返回错误之前重试两次
。
应用场景:与超时一样,Istio 默认的重试行为在延迟方面可能不适合您的应用程序需求(对失败的服务进行过多的重试会降低速度)或可用性。
栗子
配置了在初始调用失败
后,最多重试 3 次
来连接到服务子集,每个重试都有 2 秒的超时。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings spec: hosts: - ratings http: - route: - destination: host: ratings subset: v1 retries: attempts: 3 perTryTimeout: 2s
熔断器
熔断器中,设置一个对服务中单个主机调用的限制
,例如并发连接的数量或对该主机调用失败的次数
。一旦限制被触发,熔断器就会“跳闸”
并停止连接到该主机。
作用:使用熔断模式
可以快速失败而不必让客户端尝试连接到过载或有故障
的主机。
熔断适用于在负载均衡池
中的“真实”网格目标地址,可以在目标规则中配置熔断器阈值,让配置适用于服务中的每个主机。
栗子:
将 v1 子集的reviews
服务工作负载的并发连接数限制为 100:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: reviews spec: host: reviews subsets: - name: v1 labels: version: v1 trafficPolicy: connectionPool: tcp: maxConnections: 100
故障注入
是什么:可以使用 Istio 的故障注入
机制来为整个应用程序测试故障恢复能力
。
为什么使用:故障注入是一种将错误引入系统以确保系统能够承受并从错误条件
中恢复的测试方法。
作用:使用故障注入特别有用,能确保故障恢复策略
不至于不兼容或者太严格,这会导致关键服务不可用。
可以注入两种故障,都使用虚拟服务配置:
延迟
:延迟是时间故障。它们模拟增加的网络延迟或一个超载的上游服务。终止
:终止是崩溃失败。他们模仿上游服务的失败。终止通常以 HTTP 错误码或 TCP 连接失败的形式出现。
栗子:
千分之一访问ratings
服务的请求,配置了一个 5 秒的延迟:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings spec: hosts: - ratings http: - fault: delay: percentage: value: 0.1 fixedDelay: 5s route: - destination: host: ratings subset: v1
和您的应用程序一起运行
Istio 故障恢复
功能对应用程序来说是完全透明
的。在返回响应之前,应用程序不知道 Envoy sidecar 代理是否正在处理被调用服务的故障
。这意味着,如果在应用程序代码中设置了故障恢复策略,那么您需要记住这两个策略都是独立工作的,否则会发生冲突。
例如,假设您设置了两个超时,一个在虚拟服务中配置,另一个在应用程序中配置。应用程序为服务
的 API 调用设置了 2 秒超时。而您在虚拟服务
中配置了一个 3 秒超时和重试。在这种情况下,应用程序的超时会先生效,因此 Envoy 的超时和重试尝试会失效。
虽然 Istio 故障恢复特性提高了网格中服务的可靠性和可用性
,但应用程序必须处理故障或错误并采取适当的回退操作。例如,当负载均衡中的所有实例都失败时,Envoy 返回一个HTTP 503
代码。应用程序必须实现回退逻辑来处理HTTP 503
错误代码。
总结
这篇花费了不少精力,还望博友们支持支持新人!!!
后期会发布一篇实际操作,期待大家持续关注!!!