什么是 service mesh
在业务规模化和研发效能提升等因素的驱动下,从单块应用向微服务架构的转型已经成为很多企业(尤其是互联网企业)数字化转型的趋势。
在微服务模式下,企业内部服务少则几个到几十个,多则上百个,每个服务一般都以集群方式部署,这时自然产生两个问题(如下图所示):
一、服务发现:服务的消费方(Consumer)如何发现服务的提供方(Provider)?
二、负载均衡:服务的消费方如何以某种负载均衡策略访问集群中的服务提供方实例?
服务发现和负载均衡并不是新问题,业界其实已经探索和总结出一些常用的模式,这些模式的核心其实是代理(Proxy),以及代理在架构中所处的位置。在服务消费方和服务提供方之间增加一层代理,由代理负责服务发现和负载均衡功能,消费方通过代理间接访问目标服务。
所谓的ServiceMesh,也被形象称为边车(Sidecar)模式。早期有一些摩托车,除了主驾驶位,还带一个边车位,可以额外坐一个人。在Sidecar模式中,业务代码进程(相当于主驾驶)共享一个代理(相当于边车),代理除了负责服务发现和负载均衡,还负责动态路由、容错限流、监控度量和安全日志等功能,这些功能是具体业务无关的,属于跨横切面关注点(Cross-Cutting Concerns)范畴。
在新一代的ServiceMesh架构中(下图上方),服务的消费方和提供方主机(或者容器)两边都会部署代理SideCar。ServiceMesh比较正式的术语也叫数据面板(DataPlane),与数据面板对应的还有一个独立部署的控制面板(ControlPlane),用来集中配置和管理数据面板,也可以对接各种服务发现机制(如K8S服务发现)。
istio介绍
首先来看 istio 官方给出的架构图
可以看到,istio 就是我们上述提到的 service mesh 架构的一种实现,服务之间的通信(比如这里的 Service A 访问 Service B)会通过代理(默认是 envoy)来进行,而且中间的网络协议支持 HTTP/1.1,HTTP/2,gRPC 或者 TCP,可以说覆盖了主流的通信协议。
istio核心组件整体分为数据面(data plane)和控制面(control plane),其中控制面做了进一步的细分,分成了 Pilot、Mixer、和 Citadel,它们的各自功能如下:
- Pilot:为 envoy 提供了服务发现,流量管理和智能路由(AB测试、金丝雀发布等),以及错误处理(超时、重试、熔断)功能。用户通过 pilot 的 API 管理网络相关的资源对象,pilot 会根据用户的配置和服务的信息把网络流量管理变成 envoy 能识别的格式分发到各个 sidecar 代理中。
- Mixer:为整个集群执行访问控制(哪些用户可以访问哪些服务)和 policy 管理(rate limit,quota 等),并且收集代理观察到的服务之间的流量统计数据
- Citadel:为服务之间提供认证和证书管理,可以让服务自动升级成 TLS 协议
数据面组件如下:
- Sidecar(Envoy):负责控制面对网格控制的实际执行。istio中的默认sidecar是由Envoy派生出来的,在理论上,只要支持Envoy的xDs协议,其它类似的反向代理软件都可以代替Envoy。在istio的默认实现中,istio利用istio-init初始化容器中的iptables命令,对所在Pod的流量进行劫持,从而接管Pod中应用的通信过程,如此一来,就获得了通信的控制权,控制面的控制目的最终得以实现。
istio的核心配置对象
istio在安装过程中会进行CRD的初始化,在Kubernetes集群中注册一系列的CRD。CRD在注册成功之后,会建立一些基础对象,完成istio的初始设置。
用户利用istio控制微服务通信,是通过向Kubernetes提交CRD资源的方式完成的。istio中的资源分为三组进行管理,分别是
networking.istio.io
istio使用频率最高的核心资源,主要包括以下五种类型:
Gateway:网格内部服务互访或者网格外部流量进入网格,都要首先经过Gateway
VirtualService:主要由以下部分组成:
(1)Host:该对象所负责的主机名称,如果在Kubernetes内部,则这个主机名可以是服务名。
(2)Gateway:流量的来源网关,如果这一字段被省略,则代表使用的网关名为“mesh”,也就是默认的网格内部服务互联所用的网关。
(3)路由对象:网格中的流量,如果符合前面的Host和Gateway的条件,就需要根据实际协议对流量的处理方式进行甄别。
TCP/TLS/HTTP Route:路由对象
DestinationWeight:流量权重(金丝雀发布会用到)
Destination:由Subset和Port两个元素组成
config.istio.io
config.istio.io中的对象用于为Mixer组件提供配置,包含以下组件:Rule、Action、Instance、Adaptor、Template、Handler
authentication.istio.io
这一组API用于定义认证策略
rbac.istio.io
在istio中实现了一个和Kubernetes颇为相似的RBAC访问控制系统