docker. k8sK8s专题Istio

Istio是什么?

2019-10-02  本文已影响0人  王勇1024

本文源自《云原生服务网关Istio——原理、实践、架构与源码分析》

1. Istio是什么?

Istio 是一个与Kubernetes紧密结合适用于云原生场景Service Mesh形态的用于服务治理的开放平台。

根据Istio官方的介绍,服务治理涉及连接(Connect)、安全(Secure)、策略执行(Control)和可观察性(Observe)。

2. Istio的重要能力

3. Istio与服务治理

Istio是一个服务治理平台,治理的是服务间的访问,只要有访问就可以治理,不在乎这个服务是不是所谓的微服务,也不要求跑在其上的代码是否是微服务化的。

3.1 关于微服务

微服务是以一组小型服务来开发单个应用程序的方法,每个服务都运行在自己的进程中,服务间采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并可通过全自动部署机制独立部署,还共用一个最小型的集中式管理,可用不同的语言开发,并使用不同的数据存储技术.
——————————Martin Fowler

微服务本质上是分而治之、化繁为简的哲学智慧在计算机领域的体现。

3.1.1 微服务带来的好处:

3.1.2 微服务的缺点:

总之,简单的事情突然变得复杂了。

3.2 服务治理的三种形态

服务治理的演变至少经过了以下三种形态。

3.2.1 第一种形态:在应用程序中包含治理逻辑

自己写代码去实现服务发现和治理的逻辑。
缺点

  1. 功能简单;
  2. 实现成本高,存在大量重复代码;
  3. 维护和升级困难;

3.2.1 第二种形态:治理逻辑独立的代码

典型代表:Spring Cloud Eureka
优点

  1. 在代码上解耦了业务和治理逻辑

缺点
业务代码和SDK还是要一起编译,业务代码和治理逻辑孩子同一个进程内,这就导致几个问题:

  1. 业务代码必须和SDK基于同一种语言,即语言绑定;
  2. 治理逻辑升级时,还需要用户的整个服务升级;
  3. SDK对开发人员来说有较高的学习门槛。

3.2.3 第三种形态:治理逻辑独立的进程

把治理逻辑彻底从用户的业务代码中剥离出来,即Sidecar模式。
优点

  1. 用户的代码和治理逻辑都以独立的进程存在,两者的代码和运行都无耦合,这样可以做到与开发语言无关,升级也相互独立;
  2. 在对已存在的系统进行微服务治理时,只需搭配Sidecar即可,对原服务无需做任何修改;
  3. 可以对老系统渐进式升级改造,先对部分服务进行微服务化。

3.2.3 三种服务治理形态的比较

形态 业务逻辑侵入 业务代码侵入 业务进程侵入
在应用程序中包含治理逻辑 Y Y Y
治理逻辑独立的代码 N N Y
治理逻辑独立的进程 N N N

4. Istio与服务网格

业界比较认同的是William Morgan关于服务网关(Service Mesh)的一段定义,这里提取和解释该定义中的几个关键字来讲解服务网格的特点:

经典的服务网格示意图如下图所示:

经典的服务网格示意图

4.1 时代选择服务网格

在云原生时代,随着采用各种语言开发的服务剧增,应用间的访问拓扑更加复杂,治理需求也越来越多。原来的那种嵌入在应用中的治理功能无论是从形态、动态性还是可扩展性来说都不能满足需求,迫切需要一种具备云原生动态、弹性特定的应用治理基础设施。

首先,从单个应用来看,Sidecar与应用程序的解耦带来的应用完全无侵入开发语言无关等特点解除了开发语言的约束,从而极大降低了应用开发者的开发成本。

然后,从全局来看,在多个服务间有复杂的互相访问时才有服务治理的需求。即我们关注的这些Sidecar组成的网格,对网格内的服务间访问进行管理,引用还是按照本来的方式进行互相访问,每个应用程序的Inbound流量和Outbound流量都要经过Sidecar代理,并在Sidecar上执行治理动作

最后,Sidecar是网格动作的执行体,全局的管理规则和网格内的元数据维护通过一个统一的控制面实现,如下图所示,只有数据面的Sidecar和控制面有联系,应用感知不到Sidecar,更不会和控制面有任何联系,用户的业务和控制面彻底解耦。

服务网格的统一控制面

4.2 服务网格带来的新问题

服务网格确实有很多优势,正所谓没有免费的午餐,这种形态在服务的访问链路上多引入的两跳也是不容回避的问题。

针对性能和资源损耗,网格提供商提供的方案一般是这样解决的:

  1. 通过保证转发代理的轻量和高性能降低时延影响,尤其是考虑到后端实际使用的应用程序一般比代理更重,叠加代理并不会明显影响应用的访问性能;
  2. 另外,对于这些高性能的代理,只有消耗足够的资源总能达到期望的性能,特殊是云原生场景下服务的弹性特点使得服务实例的弹性扩展变得非常方便,通过扩展实例数量总是能得到期望的访问性能。

4.3 服务网格选择Istio

4.4 Istio与Kubernetes

Kubernetes的Service基于每个节点的kube-proxy从kube-apiserver上获取Service和Endpoint的信息,并将对Service的请求经过负载均衡转发到对应的Endpoint上。

但Kubernetes只提供了4层负载均衡能力,无法基于应用层的信息进行负载均衡,更不能提供应用层的流量管理,在服务运行管理上也只提供了基本的探针机制,并不能提供服务访问的指标和调用链追踪这种应用的服务运行诊断能力。

Istio复用了Kubernetes Service的定义,在实现上进行了更细粒度的控制。

Istio的服务发现就是从kube-apiserver中获取Service和Endpoint,然后将其转换成Istio服务模型的Service和ServiceInstance,但是其数据面组件不再是kube-proxy,而是在每个Pod里部署的Sidecar,也可以将其看作每个服务实例的Proxy。

通过拦截Pod的Inbound流量和Outbound流量,并在Sidecar上解析各种应用层协议,Istio可以提供真正的应用层治理、监控和安全等能力。

总之,Istio和Kubernetes从设计理念、使用体验、系统架构甚至代码风格等小细节来看,关系都非常紧密,甚至有人认为Istio就是Kubernetes团队开发的Kubernetes可插拔的增强特性。

更细粒度的Proxy提供更多更细粒度的能力
上一篇 下一篇

猜你喜欢

热点阅读