[TODO] Istio简介第4部分 - 从基础回顾

来源: Istio入門 その4 -基礎から振り返る-

我还在2017年的Z Lab Advent Calendar上写了关于Istio入门系列的文章。从那一年或一年。Istio的版本 v0.2 卡拉 v1.0.4 可达11版也已经发布。该Istio在使用特使是,Kubernetes同你的毕业相,如1现在。

当然这个概念没有改变,但是组件名称和设置方法等已经从v 0.8到v1大幅改变。让我们从基础知识中看待Istio,关注这些变化。2

微服务及其问题

微服务 的系统,该系统的设计模式是从2012年左右说,世界是2014年津市巴兹詹姆斯 Lewis & Martin Fowler 由于微服务被触发博客文章有关。
微服务表示,该系统的设计模式,以创建每个用途或目的的小型应用程序,如图中下图。为了便于理解,将其与常规系统中常见的 单片 (日语 一枚板 意思)系统进行比较。

image.png

那么与传统的单片系统相比,微服务更好吗?从广义上讲,以下三点是有利的。

  1. スケールアウト 容易做到
  2. 変更 容易做到
  3. 大人数 易于开发

因为第一个向外扩展的容易,因为系统的部件按功能和用途划分,可被称为“希望增加的唯一功能,以增加访问他们走红”, 单片 亚日相比系统这意味着简单3。如果你想要做同样的事情在一个单一系统,1个功能或者甚至复制整个系统中,有一个与或扩大规模浪费的缺点是容易出现资源。

image.png

出于类似的原因,微服务使其易于更改。由于微服务设计 为每个 组件 独立部署 ,因此只有实际更改部署流的组件才会成为目标。变化范围越小,变化越短,因此更容易改进频繁的应用。
在另一方面,在一个单片系统中,即使通过使用在模块的源代码的水平,在部署时进行功能分解 部署绑定整个系统之后 将流这一点。因此,存在整个系统的重新部署花费时间并且不能频繁执行的问题。

image.png

第三点是大规模开发很容易。当然,当你在一个小团队采用微服务,管理需要一分钟的时间来开发多个组件没有一个保健和口感。然而,在团队中,成人数的情况下,如数百个不同的故事。 沟通成本 与这种差异密切相关。
如果您在大量的人的团队开发单片系统,因为这影响到整个系统的功能变化之一,这意味着覆盖,并采取部署的协议,更高的通信费用之前的一次会议。
在微服务,来划分每个功能和用途的组件,建立一个小团队来开发它。在每个组件中, 应用程序接口(API) ,它定义的依赖只能在API被保持。因此,内部组件的变化是独立进行的,通过采取要改变API的时间只有团队之间的协议,可以降低通信成本。

image.png

虽然我已经谈到了好处,但微服务也有缺点。必须对系统进行功能更改和添加。因此,每年系统规模变得更大,更复杂。

image.png

大型复杂微服务带来的问题如下。(这是一个问题,我觉得它实际上是微服务,而不是“有。”)

1.我无法控制系统组件之间的通信 我不知道在失败的情况下会发生什么 我无法管理密钥和证书 我无法掌握系统的整体情况

介绍已经变得更长,但它有助于解决这些问题 Istio 。在下一章中,我将解释Istio如何解决这些问题。

什么是解决大规模微服务问题的Istio?

在进入问题解决部分之前,让我们先来看一下Istio的概述。

サービスメッシュ 是一种在应用程序之间以网状形式通信的网络。虽然前一章指出大型复杂的微服务出现问题,但微服务变得庞大和复杂的事实与这种 服务网格 变得 庞大和复杂 的事实同义。 。

Istio 是一个由Lyft,IBM和Google等公司开发的开源软件,用于解决“复杂服务网络管理无法赶上”的问题。

image.png

那么,Istio如何管理服务网格呢?点位于每个应用程序的代理服务器集中。Istio被分为具有命令塔角色的 控制平面 和执行 数据平面 ,执行 数据平面 基于该命令执行通信控制等。此外,控制平面的组件通过API控制数据平面中代理服务器的设置。

控制平面的作用

控制平面的主要特征如下。

  • Pilot :管理代理服务器流量的组件,根据基础设施(Kubernetes等)负责服务发现。
  • Mixer :这是一个基于收集的数据执行访问控制的组件。由于它采用插件模型,因此可以与Prometheus等公制服务相关联,并且可以灵活定制。
  • Citadel 4:该组件负责服务网格的安全性,例如最终用户和应用程序之间的身份验证以及组件之间的相互身份验证。

image.png

服务网格·本地代理特使

对于数据平面代理服务器,使用由Lyft开发的名为Envoy的L4 / L7代理。在CNCF的产品C ++中,开发语言有点罕见。
虽然Nginx 5作为代理服务器而闻名,但Envoy 通过API 支持 配置更改, 因此您无需在更改设置时重新启动服务器。因此,易于用作频繁改变设置的微服务的服务网格管理的代理服务器。
image.png

有一个有趣的故事,如热启动方案,所以如果你对更多的细节感兴趣,推荐使用Envoy博客。

:灯泡: 信息
顺便提一下,我们将在应用程序中作为集合部署的组件称为应用程序的sidecars,因为它的外观类似于sidecar。

问题1我无法控制系统组件之间的通信

问题解决最终是 当服务网格设置嵌入应用程序代码时 ,您无法完全控制系统的组件间通信(服务网格)的问题。说什么,并有系统的运行,渐欲金丝雀版本,手机要在PC分拣连接目的地的部件,等等要下沉到分段环境反映生产的要求,各种将提出通信控制请求。在这种情况下,如果服务网格的设置嵌入在应用程序的代码中, 修正ごとに再デプロイが必要 则会变为负载,因此会给操作和开发团队带来负担。

image.png

为了解决这个问题,Istio 設定をコードから分離 采取了做法。因为这不依赖于代码,所以有一个优点是开发人员和操作人员更容易进行分工。此外,由于特使,这是在Istio使用可加载L7的平衡,而事实上,只显示与测试用户ID的测试环境XXX分组以查看请求报头,用户-代理就是Android的不同仅请求可以灵活地进行流量管理,例如对组件进行排序。

交通管制示例:金丝雀·释放

有几种类型的服务部署方法,但它在云中很受欢迎 Blue/Greenデプロイメント 。这意味着如果您有两个Blue(当前正在运行的版本)和Green(新版本)环境,您可以更改负载均衡器的方向,升级到新版本并以最小的停机时间回滚它可以实现。

还有一种方法可以简单地将所有访问权限切换为绿色,但如果新版本中存在错误,则会对用户产生很大影响。出于这个原因,不是一次切换到新版本,而是考虑了逐渐增加新版本比例的方法,除非通过仅切换前面的一部分没有问题。这样 缩小用户影响由于中的错误 的方法 カナリア・リリース 6被调用。

image.png

让我们看看如何实际控制流量。下面的示例代码是Kubernetes的配置文件,用于控制Istio的流量。
VirtualService 7是用于定义流量的路由规则的资源, spec.hosts 根据相应协议的规则将请求作为目的地路由。在这个例子中,规范 http 已指定,也给其他 tlstcp 的支持。8此外,它 DestinationRule 是一种用于在路由之后定义流量目的地的资源,顾名思义。虽然这里没有使用,但也可以选择负载均衡算法。9

金丝雀酒吧all.yaml

ApiVersion : Networking.Istio.Io/v1alpha3 类: VirtualService 元数据: 名称: 棒 规格: 指定#请求的目的 主机: - Bar.Default.Svc.Cluster.Local #OK,即使没有写完整的路径栏 的Http : # http请求路由规则,适用于主机- 路线:- 目标:主持人:Bar.Default.Svc.Cluster.Local 子集:当前权重:95 - 目标:主机: Bar.Default.Svc.Cluster.Local 子集: 加纳利 重量: 5 — ApiVersion : Networking.Istio.Io/v1alpha3 类: DestinationRule 元数据: 名称: 酒吧目的地 规格: 主持人: Bar.Default.Svc.Cluster.Local #对应VirtualSerivce对destination.subset 亚群: - 名称: 当前 标签: 版本: V1 - 名称: 加纳利 标签: 版本: v2

因此, spec.http.route.destination.weight 由于在容易地设定的流量百分比,95%:如果问题不会在5%发生至90%:实现金丝雀释放等10%简单地通过施加重写的设置你可以。

说到金丝雀释放真正的刺激的,与度量服务器到新版本一起的一个问题是自动检查是否有问题,就是会自动更改通信量的百分比,如果没有问题的地方。10 OSS在三角帆内置于卡岩塔是有名的,但你必须继续提高自己,因为它是不达自动化在这里是Istio的能力。

:警告: 注意
在实施金丝雀释放的情况下Kubernetes,而不是控制流量为Istio,还有,该方法被称为“要逐步改变,在新老版本吊舱的副本数”使用。但是,请注意,在这种情况下, 副本号将确定可变百分比
在交通管制的情况下,但你可以控制的只有1%的流量到新版本的流量,老版本的副本数3,数字的新版本的副本时,1只是,新版本的流量突然25%会流动。

Pod对特使的交通流动机制

你在哪里知道如何使用配置文件控制流量,是不是想知道它内部如何运行?因此,当我们首次部署应用程序时,我们将解释对应用程序的请求将如何通过Envoy。

image.png

首先,当你像往常一样使用创建的Kubernetes的API Kubernetes,应用MutatingAdmissionWebhook按功能调用,网络挂接将被重写的一套Istio应用程序执行。由于11 istio-sidecar-injector 是这个钩子目的地, 我们为Istio添加一个设置,例如sidecar的代理 ,并返回对Kubernetes API服务器的响应。通过这种方式,Istio在内部设置,因此用户可以获得与创建普通应用程序相同的体验。
以下代码是实际部署应用程序后的配置文件的摘录。到Spec.Containers istio-proxy ,以spec.initContainers istio-init 你可以看到已经添加。

istio注入,pod.yaml

spec : containers : #原始应用程序容器的配置 - image : istio / examples - bookinfo - details - v1:1.8.0 name : details ports : - containerPort : 9080 … #Added proxy container configuration - image : docker.io/istio/proxyv 2 :1.0.4 名称: istio-proxy ports : - containerPort : 15090 名称: http - envoy - prom 协议: TCP … securityContext : readOnlyRootFilesystem: 真 RunAsUser : 1337 … #增加了设置初始化容器的 InitContainers : 图片: Docker.Io/istio/proxy_init:1.0.4 名称: Istio-初始化 - 参数数量: 指定脚本的参数改写#iptables的而且 - -P - “ 15001” 听的特使#端口 - -U - “ 1337” Isitio代理#UID的 - -M - REDIRECT - -I - ’ *’ - -X - “ ” - - B - “ 9080” #应用程序端口 - - d - “ ” …

当检查设置文件完成时,在Kubernetes 中执行12个进程并创建容器。所创建这是创建应用程序定义时,不仅容器,容器已被添加由istio-三轮式喷射器 istio-init 与, istio-proxy 将在两还额外产生。istio-init是一个按名称暗示进行预处理的容器,重写iptables规则 并将入站和出站流量重定向到istio-proxy
通过以这种方式重写iptables规则,应用程序的所有流量都通过位于Istio控制下的代理传递。

问题2:我不知道发生故障会发生什么

我转向了一条小街,但我解决了问题解决第二部分。随后的问题是我不知道在失败的情况下会发生什么。作为人类,在实施系统时不可能创建没有错误。因此,有必要对系统进行测试。

考虑到诸如硬件故障或网络故障之类的异常系统测试,由于在单片系统的情况下仅存在一个系统,因此可以全面测试其是否工作困难。但微服务怎么样?即使它只有4个组件,当Foo的硬盘出现故障时,Bar / Baz / Qux的行为是否正常?比如,在一次 将继续在测试模式增加 。因此,在现代大规模和复杂的微服务中测试所有模式实际上是不可能的。

image.png

在这种情况下,近年来 ケイオス・エンジニアリング 变得流行的方法变得流行,因为仅通过测试不可能保持系统的可用性。这是一个硬件故障或网络中断,从用户的大型进入实际模拟可能出现的故障这样的情况下突然来到,那就是错误是要解决一旦你已经发现了一种技术。虽然测试是一种验证输出到输入规格的基础上是正确的,混沌工程通过实际事业新局面,不遵守的推移,将相应的另一种方法。

如果你开始谈论细节,它将会结束,所以请在这里停一下,所以请阅读它,因为Netflix的混沌工程书被推荐用于详细的故事。

通过预先模拟故障来准备大规模故障

这是经常发生的,也只有当你不想把它,因为事业失败刻意出奇麻烦的失败。它不走,导致故障不真正纳入应用,物理,但有效的,因为拉出电缆,代码 连续运行自动化 繁琐。有时,如频带限制在网络系统的故障一定和tc命令被执行,但 以最小化在影响范围 是在容器级别来限制,而不是在节点级别所花费的时间来准备。

image.png

这种麻烦的计划病症还,使用Istio的 每个服务塞维利亚恢复和应用L7负载平衡器 可以以相对简单的和可控的由趁着实现。此外,如果相应的函数将请求延迟了任意长度的时间 delay ,它将返回相应的状态代码而无需通过应用程序 abort

故障injection.yaml

ApiVersion : Networking.Istio.Io/v1alpha3 类: VirtualService 元数据: 名称: 富 规格: 主持人: - 美孚 的Http : - 故障: 延迟5秒请求#10% 延时: 百分比: 10 FIXEDDELAY : 5S 比赛: - 头: #Cookie仅针对用户= tester在 cookie中的请求: user : tester … - fault : ##30%请求 中止返回400错误: 百分比: 30 httpStatus : 400 …

上面的代码是 VirtualService 一个使用资源来设置失败发生的文件。通过这种方式,您可以通过简单地定义请求的故障发生率和要生成的故障内容来进行控制。此外,以这种方式导致系统故障称为故障注入。

使用断路器最小化故障的影响范围

如果任一组件发生故障,但你要等到响应时间时,你会想等到组件也超时等待在这种情况下的响应。这样,在微服务中,一个组件的 故障 可能导致 其所依赖的组件的故障 。这是一种防止这种情况的机制 サーキット・ブレーカ 。之所以这样说,机制是否是如何发挥作用, 如果连续发生故障的回报,而无需等待超时错误 发生的方法。

image.png

在为了实现电路断路器的实施是令人惊讶的麻烦。Netflix公司的还有开源的,比如图书馆,但费用仍然会为了实现多微服务的组件来用多种语言书写的更高,因为实现也需要为每种语言。
在Istio,以及先前的故障注入,利用三轮代理 没有在应用程序代码的实施 将能够实现断路器。下面的代码中,为了进行这个设置 DestinationRule 显示。

电路breaker.yaml

ApiVersion : Networking.Istio.Io/v1alpha3 种类: DestinationRule … TrafficPolicy : 定义了#连接的限制 连接池: 的Tcp : MaxConnections最大: 100 的Http : Http2MaxRequests : 千 MaxRequestPerConnection : 10 #阈值和行为异常处的值的时间定义 OutlinerDetection : HTTP : ConsecutiveErrors : 7 #阈确定继续,它病症 间隔: 5米 #间隔分析 BaseEjectionTime : 10 #超出连续错误限制时主机返回立即错误的最小持续时间

有关算法的详细信息,请参阅Envoy的异常值检测

以下省略

我累了,所以我会把它留到这个水平。如果您有兴趣,请提供原始材料。
(如果您有需求,可以写一个续篇。)

摘要

我已经介绍了Istio如何解决大型复杂微服务的问题。最后,我将回顾每个问题采取的方法。

1.它无法控制系统组件之间的通信。 “单独的服务网格设置和应用程序代码” 我不知道在失败的情况下会发生什么 “准备故障注入和断路器的障碍” 我无法管理密钥和证书 “Citadel自动化密钥和证书管理” 我无法掌握系统的整体情况 “使用Mixer的功能介绍可视化工具,以掌握系统的整体情况”

如上所述,此条目是在工作时间内写成的,作为Z Lab的成员Z实验室出现日历2018年的第二天。第三天负责@ tkusumi

  1. 该项目的CNCF成熟度分为三种, ご卒業 顶部的水平 Https://Www.Cncf.Io/projects/ :leftwards_arrow_with_hook:
  2. 谢谢你认为我见过的东西!我在日本容器日版本18.04写了一个公告,并根据最新版本的Istio进行了更新。 :leftwards_arrow_with_hook:
  3. 只是容易做到并不总是可行的。毕竟你没有从单片系统改变因为你与其他函数增加了依赖关系的错误通常是一个倾听的问题。 :leftwards_arrow_with_hook:
  4. 请注意,Istio v0.8已更改为Istio-Auth,Istio-CA Citadel 意为日语)。 :leftwards_arrow_with_hook:
  5. 与Nginx不同,我没有Web服务器的功能 :leftwards_arrow_with_hook:
  6. 由于我们把金丝雀带到矿井检测一氧化碳,我们称金丝雀为事先操作以检测异常。 :leftwards_arrow_with_hook:
  7. 虽然推出使用金丝雀发布的去年引进RouteRule的方法,请注意v1alpha1的这个资源是已经被废除。 :leftwards_arrow_with_hook:
  8. 欲了解更多信息,在这里,请参阅文件。 :leftwards_arrow_with_hook:
  9. 欲了解更多信息请点击这里 :leftwards_arrow_with_hook:
  10. 因为当人做金丝雀的释放也有错过的bug,检测指标的变化较小的故事,你还是应该使其在良好的机器来完成。这里的故事是推荐的,因为它在有关发布Google和Netflix工程的书籍和文档中有详细介绍。 :leftwards_arrow_with_hook:
  11. 事实上,Istio边门喷油器工作,这部分部署,相应的命名空间 istio-injection=enabled ,但我需要变得,略细的东西。 :leftwards_arrow_with_hook:
  12. 各种内容都写在Z Lab的Qiita文章中,请参考。 :leftwards_arrow_with_hook: