Istio 1.0版本于8月1号凌晨准点发布,核心特性已支持上生产环境,各大微信公众号、博客纷纷发文转载。那么 Istio 究竟是什么?能解决问题什么?windows
Kubernetes 提供了部署、升级和有限的运行流量管理能力,利用 service 的机制来作服务注册和发现,转发,经过 kubeproxy 有必定的转发和负载均衡能力。但并不具有上层如熔断、限流降级、调用链治理等能力。 Istio 则很好的补齐了 k8s 在微服务治理上的这部分能力,同时是基于 k8s 构建的,但不是像 SpringCloud Netflix 等彻底从新作一套。Istio 是谷歌微服务治理上的很是关键的一环。api
Istio,用于链接、保护、控制和观测服务。今天,咱们就来谈谈 Istio 第一主打功能——链接服务。那么,便引出3个问题:浏览器
从服务间的流量管理角度而言,Istio能够实现这4项功能:请求路由、服务发现和负载均衡、故障处理和故障注入。安全
一般 kubernetes,mesos 等容器管理平台已经提供了服务注册表,以跟踪服务的负载实例,因此 Pilot 能垂手可得地获知服务网格内的全部服务注册信息,并将这些信息告知全部服务里的 Proxy,Proxy 根据这些信息执行服务发现,并相应地动态更新其负载均衡池。一个服务一般有多个负载实例,Service A 请求 ServiceB 时,能够配置不一样的负载均衡模式:轮询、随机和带权重的最少请求。假设此时Service B的某个负载实例出现故障,由于 Service A 中的 Proxy 会按期地执行服务发现,从而能及时将故障实例从其负载均衡池里排出。bash
Envoy 提供了一套开箱即用,可选的故障处理功能,对应用中的服务大有裨益。这些功能包括:微信
以 Service A 请求调用 Service B 为例。网络
对于功能1。若 Service B 明确地知道10s之后的超时,一定会带来失败,那将超时时长缩短,使得 Service A 能够更快得知结果并做出应对,不失为一个明智之举。架构
对于功能2。对超载的 Service B 来讲,重试之间的抖动极大的下降了重试形成的影响,而超时预算确保 Service A在可预测的时间范围内得到响应(成功/失败)。并发
对于功能3。限制 Service A 或其余服务对 Service B的链接数和请求数,可使得 Service B免于遭遇 DDOS 攻击,或承受太重的流量负担而崩溃。负载均衡
对于功能4和5。主动和被动健康检查的组合最大限度地减小了在负载平衡池中访问不健康实例的机会。当与平台级健康检查(例如由 Kubernetes 或 Mesos 支持的检查)相结合时,应用程序能够确保将不健康的负载实例快速地从服务网格中去除,从而最小化请求失败和延迟产生影响。
总之,这些功能使得服务网格可以耐受故障节点,并防止本地故障致使的其余节点的稳定性降低。
虽然 Proxy 为在 Istio 上运行的服务提供了上节所言的大量故障处理机制,但测试整个服务网格所组成应用的端到端的故障恢复能力依然是必须的。错误配置的故障恢复策略(例如,跨服务调用的不兼容/限制性超时)可能致使应用程序中的关键服务持续不可用,从而破坏用户体验。
Istio 能在不杀死负载实例的状况下,将协议特定的故障注入到网络中,在 TCP 层制造数据包的延迟或损坏。咱们的理由是,不管网络级别的故障如何,应用层观察到的故障都是同样的,而且能够在应用层注入更有意义的故障(例如,HTTP 经典的4xx和5xx错误代码),以检验和改善应用的韧性。
运维人员能够为符合特定条件的请求配置故障,还能够进一步限制遭受故障的请求的百分比。能够注入两种类型的故障:延迟和中断。延迟是计时故障,模拟网络延迟上升或上游服务超载的状况。中断是模拟上游服务的崩溃故障。中断一般以 HTTP 错误代码或 TCP 链接失败的形式表现。
依旧以 Service A 请求调用 Service B 为例。
若给 Service B设定了10s的延时或503中断,则 Service A将至少10s后才能获得请求的响应或请求的响应为503错误,经过多种场景覆盖测试,能够获得 Service A 面对这些场景时的综合表现状况,从而作出针对性的改良,增长其韧性。
Istio有4个配置文件,帮咱们全方位地定制以上全部流量管理需求: VirtualService, DestinationRule, ServiceEntry和 Gateway:
有了以上4大法宝,咱们对服务网格进行流量管理的全部需求,均可以被知足了。
假设咱们的服务网格存在1个服务 explorer,只有1个v1版本;存在另1个服务 helloworld,有v1,v2两个版本。
①若要使得 explorer 发起的全部请求,以75%的几率走向 helloworld 的v1版本,以25%走向v2版本,只要配置以下两个文件 VirtualService 和 DestinationRule,即可实现:
apiVersion:networking.Istio.io/v1alpha3
kind:VirtualService
metadata:
name:helloworld
spec:
hosts:
- helloworld
http:
- route:
- destination:
host:helloworld
subset:v1
weight:75
- destination:
host: helloworld
subset: v2
weight: 25
apiVersion:networking.Istio.io/v1alpha3
kind:DestinationRule
metadata:
name: helloworld
spec:
host: helloworld
subsets:
- name:v1
labels:
version: v1
- name: v2
labels:
version: v2
复制代码
②若是 helloworld 内部须要经过访问www.google.com 来获取一些信息,才能告诉 explorer 这个世界是怎么样的,须要配置以下2个文件 ServiceEntry 和 DestinationRule:
apiVersion:networking.Istio.io/v1alpha3
kind:ServiceEntry
metadata:
name: googleapis
spec:
hosts:
- "*.google.com"
ports:
- number:443
name:https
protocol:http
apiVersion:networking.Istio.io/v1alpha3
kind:DestinationRule
metadata:
name: googleapis
spec:
host: "*.google.com"
复制代码
③若是 helloworld 须要被服务网格外,而不只仅是 explorer 服务访问到,则须要配置以下2个文件 Gateway 和 VirtualService:
apiVersion:networking.Istio.io/v1alpha3
kind:Gateway
metadata:
name: helloworld-gateway
spec:
selector:
Istio:ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- 'helloworld.com'
apiVersion:networking.Istio.io/v1alpha3
kind:VirtualService
metadata:
name: bookinfo
spec:
hosts:
- 'helloworld.com'
gateways:
- helloworld-gateway
http:
- route:
- destination:
host: helloworld
port:
number: 9080
复制代码
至此,咱们作一个简单的总结:Istio 提供的 Pilot 和 Proxy,将成百上千个服务组成了一个服务网格。基于此,咱们能够实现请求路由、服务发现和负载均衡、故障处理以及故障注入等流量管理能力,这一切,咱们只须要经过对 VirtualService, DestinationRule, ServiceEntry 和 Gateway 这4个资源作简单的配置,便可实现。