Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactoring and writing feature part #293

Merged
merged 11 commits into from
Jul 27, 2020
Prev Previous commit
Next Next commit
Update traffic-control.md
  • Loading branch information
rootsongjc authored Jul 27, 2020
commit 7184650c1934e91723a7154fb43663985e5bf13e
16 changes: 8 additions & 8 deletions concepts/traffic-control.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
authors: ["malphi"]
reviewers: [""]
reviewers: ["rootsongjc"]
---

# 流量控制
Expand All @@ -9,7 +9,7 @@ reviewers: [""]

而使用 Istio 就可以轻松的实现各种维度的流量控制。下图是典型的金丝雀发布策略:根据权重把 5% 的流量路由给新版本,如果服务正常,再逐渐转移更多的流量到新版本。

![金丝雀发布示意图(图片来自Istio官方网站)](../images/concept-trafficcontrol-canary.png)
![金丝雀发布示意图(图片来自 Istio 官方网站)](../images/concept-trafficcontrol-canary.png)

Istio 中的流量控制功能主要分为三个方面:

Expand All @@ -25,19 +25,19 @@ Istio 为了控制服务请求,引入了服务版本(version)的概念,

下图展示了使用服务版本实现路由分配的例子。服务版本定义了版本号(v1.5、v2.0-alpha)和环境(us-prod、us-staging)两种信息。服务 B 包含了 4 个 Pod,其中 3 个是部署在生产环境的 v1.5 版本,而 Pod4 是部署在预生产环境的 v2.0-alpha 版本。运维人员可以根据服务版本来指定路由规则,使 99% 的流量流向 v1.5 版本,而 1% 的流量进入 v2.0-alpha 版本。

<img src="../images/concept-feature-routing.png" alt="路由示意图(图片来自Istio官方网站)" style="zoom:33%;" />
<img src="../images/concept-feature-routing.png" alt="路由示意图(图片来自 Istio 官方网站)" style="zoom:33%;" />

除了上面介绍的服务间流量控制外,还能控制与网格边界交互的流量。可以在系统的入口和出口处部署 Sidecar 代理,让所有流入和流出的流量都由代理进行转发。负责入和出的代理就叫做入口网关和出口网关,它们把守着进入和流出网格的流量。下图展示了 Ingress 和 Egress 在请求流中的位置,有了他们俩,也就可以控制出入网格的流量了。

<img src="../images/concept-feature-gateway.png" alt="入口和出口网关(图片来自Istio官方网站)" style="zoom:33%;" />
<img src="../images/concept-feature-gateway.png" alt="入口和出口网关(图片来自 Istio 官方网站)" style="zoom:33%;" />

Istio 还能设置流量策略。比如可以对连接池相关的属性进行设置,通过修改最大连接等参数,实现对请求负载的控制。还可以对负载均衡策略进行设置,在轮询、随机、最少访问等方式之间进行切换。还能设置异常探测策略,将满足异常条件的实例从负载均衡池中摘除,以保证服务的稳定性。

## 弹性功能

除了最核心的路由和流量转移功能外,Istio 还提供了一定的弹性功能,目前支持超时、重试和熔断。简单来说,超时就是设置一个等待时间,当上游服务的响应时间超过这个时间上限,就不再等待直接返回,就是所谓的快速失败。超时主要的目的是控制故障的范围,避免故障进行扩散。重试一般是用来解决网络抖动时通信失败的问题。因为网络的原因,或者上游服务临时出现问题时,可以通过重试来提高系统的可用性。在 Istio 里添加超时和重试都非常简单,只需要在路由配置里添加`timeout``retry`这两个关键字就可以实现。
除了最核心的路由和流量转移功能外,Istio 还提供了一定的弹性功能,目前支持超时、重试和熔断。简单来说,超时就是设置一个等待时间,当上游服务的响应时间超过这个时间上限,就不再等待直接返回,就是所谓的快速失败。超时主要的目的是控制故障的范围,避免故障进行扩散。重试一般是用来解决网络抖动时通信失败的问题。因为网络的原因,或者上游服务临时出现问题时,可以通过重试来提高系统的可用性。在 Istio 里添加超时和重试都非常简单,只需要在路由配置里添加 `timeout``retry` 这两个关键字就可以实现。

另外一个重要的弹性功能是熔断,它是一种非常有用的过载保护手段,可以避免服务的级联失败。熔断一共有三个状态,当上游服务可以返回正常时,熔断开关处于关闭状态;一旦失败的请求数超过了失败计数器设定的上限,就切换到打开状态,让服务快速失败;熔断还有一个半开状态,通过一个超时时钟,在一定时间后切换到半开状态,让请求尝试去访问上游服务,看看服务是否已经恢复正常。如果服务恢复就关闭熔断,否则再次切换为打开状态。Istio 里面的熔断需要在自定义资源 `DestinationRule` 的 `TrafficPolicy`里进行设置。
另外一个重要的弹性功能是熔断,它是一种非常有用的过载保护手段,可以避免服务的级联失败。熔断一共有三个状态,当上游服务可以返回正常时,熔断开关处于关闭状态;一旦失败的请求数超过了失败计数器设定的上限,就切换到打开状态,让服务快速失败;熔断还有一个半开状态,通过一个超时时钟,在一定时间后切换到半开状态,让请求尝试去访问上游服务,看看服务是否已经恢复正常。如果服务恢复就关闭熔断,否则再次切换为打开状态。Istio 里面的熔断需要在自定义资源 `DestinationRule` 的 `TrafficPolicy` 里进行设置。

## 调试能力

Expand All @@ -55,7 +55,7 @@ Isito 支持注入两种类型的故障:延迟和中断。延迟是模拟网

## 实现流量控制的自定义资源

Istio 里用于实现流量控制的 CRDs 主要有以下几个:
Istio 里用于实现流量控制的 CRD 主要有以下几个:

- VirtualService:用于网格内路由的设置;
- DestinationRule:定义路由的目标服务和流量策略;
Expand All @@ -65,7 +65,7 @@ Istio 里用于实现流量控制的 CRDs 主要有以下几个:

Istio 通过这些自定义资源,实现了对网格内部、网格外部、进出网格边界的流量的全面的控制。也就是说所有和网格产生交互的流量都可以被 Istio 所控制,其设计思路堪称完美。下图是这几种资源的示意图。

<img src="../images/concept-trafficcontrol-crd.png" alt="流量crd" style="zoom:50%;" />
<img src="../images/concept-trafficcontrol-crd.png" alt="流量 CRD" style="zoom:50%;" />

## 小结

Expand Down