前面我们在Kubernetes上部署了Istio 1.0并实际操作了一下官方示例应用及流量管理的基本功能。本篇将总结一下Istio的基本概念,加深理解。

1.0 Istio的定义

istio的官网https://istio.io/首页上用一句话描述了istio的定义:Istio Connect, secure, control, and observe services.,即Istio用来连接、保护、控制、观测服务。

  • 连接(connect):智能控制服务之间的流量和API调用,进行一系列测试,并通过红/黑部署逐步的升级
  • 保护(secure):通过托管认证、授权和服务之间的通信加密自动保护服务
  • 控制(control):应用策略,确保策略得以执行,并使资源在消费者之间平均分配
  • 观测(Observe):通过丰富的自动跟踪、监控、日志观测服务,了解正在发生的事情

根据istio这4个基本功能的解释,已经对istio有了基本了解,后边准备继续分别以实操的形式学习这些功能。

2.0 Istio的架构

Istio中的官方文档中对Istio的架构做了介绍。下图是文档中的Istio架构示意图:

istio-arch.jpg

Istio在逻辑上分为数据平面(data plane)和控制平面(control plane)两部分:

  • 数据平面:由一系列以sidecar形式部署的智能代理(Envoy)组成。这些代理可以调节和控制微服务及混合器(Mixer)之间的所有网络通信
  • 控制平面:负责管理和配置代理来路由流量,除此之外控制平面还配置混合器(Mixer)以执行策略和收集遥测数据

2.1 数据平面(Envoy)

Envoy是Istio的数据平面。Envoy早已经是CNCF的ServiceMesh项目之一,功能强大和稳定。

Istio使用Envoy的扩展版本。Envoy是以C++开发的高性能代理,用于接管服务网格中所有服务的所有inbound和outbound流量。 Istio实际上利用了很多Envoy已有的特性,例如:服务的动态发现、负载均衡、TSL终止、HTTP/2和gRPC代理、断路器、健康检查、基于百分比流量拆分的灰度发布(Staged rollouts with %-based traffic split)、故障注入以及丰富的度量指标。

Envoy以sidecar部署,与对应的服务在同一个Kubernetes Pod中。这样的部署方式使得Istio可以将大量了关于流量行为的信号作为属性(Attribute)提取出来。这些属性可以被用来在混合器(Mixer)中执行策略决策,并发送给监控系统,以提供整个Service Mesh的行为信息。

Sidecar模式允许我们将istio的功能添加到现有的部署中,而无需重构或重写现有的代码。

2.2 控制平面

控制平面对Service Mesh具有强大的控制力。Istio的控制平面由包括以下组件:

  • Pilot(领航员):为 Envoy sidecar 提供服务发现功能,为智能路由(例如 A/B 测试、金丝雀部署等)和弹性(超时、重试、熔断器等)提供流量管理功能。 将控制流量行为的高级路由规则转换为Envoy的相关配置,并在运行时将它们传播到sidecar。Pilot将平台特定的服务发现机制抽象化并将其合成为符合Envoy data plane APIs的sidecar都可以使用的标准格式。这种松耦合的设计使得Istio能够在多种环境下运行,如Kubernetes、Consul、Nomad,为流量管理提供了统一的管理接口。

  • Mixer(混合器):Mixer是一个平台独立的组件,它的职责是在ServiceMesh上实施访问控制和使用策略(usage policies),并从envoy代理和其它服务中收集遥测数据。 代理提取请求级别的属性(Attribute),发送给Mixer进行评估。有关属性提取和策略评估的更多信息,请参见Mixer Configuration documentation。Mixer包含一个灵活的插件模型,确保其可以接入各种主机环境和基础设施的后端。因此,istio从这些细节中抽象出 Envoy代理和Istio管理的服务。

  • Citadel(城堡?):通过内置身份和凭证管理提供强大的服务之间和终端用户间的认证。可以使用Citadel将ServiceMesh中未加密的流量升级,并为运维人员提供基于服务标识而非网络控制的策略管理能力。Istio 0.5 版本开始支持授权特性Istio’s authorization feature,以控制谁可以访问您的服务。

  • Galley:是Istio 1.0中新引入的组件,在Istio中,承担配置的导入、处理和分发任务,为Istio提供了配置管理服务,提供在k8s服务端验证Istio的CRD 资源的合法性的方法。

2.3 个人理解

前面根据istio文档What is Istio?中的内容理解一下Istio架构中各个组件。下面都是个人的简单理解:

Istio有数据平面和控制平面组成:

  • 数据平面是以sidecar运行的Envoy代理,Envoy接收来自控制平面中Pilot的配置信息。Envoy作为代理接管了服务网格中所有服务的所有inbound和outbound流量。
  • 控制平面:
    • Pilot:负责与Kubernetes API Server交互。Pilot管理Envoy代理,提供了服务发现、流量管理等功能。 —– 连接(connect)
    • Citadel:主要关注安全,为服务之间以及与终端用户提供认证、授权、凭据管理等功能。 —– 保护(secure)
    • Mixer:用来接收来自Envoy代理的指标数据(遥测数据),可以实施访问控制和使用策略。—- 控制(control) 和 观测(Observe)
    • Galley:为Istio提供配置管理服务

最后,看一下我们前面部署istio时,在istio-system命名空间下创建了下面的的deployment:

 1kubectl get deploy -n istio-system
 2NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
 3grafana                    1         1         1            1           25d
 4istio-citadel              1         1         1            1           25d
 5istio-egressgateway        1         1         1            1           25d
 6istio-galley               1         1         1            1           25d
 7istio-ingressgateway       1         1         1            1           25d
 8istio-pilot                1         1         1            1           25d
 9istio-policy               1         1         1            1           25d
10istio-sidecar-injector     1         1         1            1           25d
11istio-statsd-prom-bridge   1         1         1            1           25d
12istio-telemetry            1         1         1            1           25d
13istio-tracing              1         1         1            1           25d
14prometheus                 1         1         1            1           25d
15servicegraph               1         1         1            1           25d

其中包含了istio-pilotistio-citadelistio-policyistio-telemetry组成的控制平面。

参考