技术交流28群

服务热线

135-6963-3175

微信服务号

istio是什么 更新时间 2022-2-25 浏览1370次

istio

什么是istio呢,这里就要引入服务网格的概念(service mesh),istio就是服务网格概念的一种落地和实现。服务网格就是传统代理的升级版(可以理解为分布式的微服务代理),变为了每个pod常驻一个代理。负责流量的相关工作,这样所有的流量被代理接管,用户的业务和控制面板彻底解耦。而控制中心就是负责汇聚整个集群的信息,管理员可通过控制面板的api来对集群做管理。

但是其集成kubernetes方便的同时也可能会存在一些问题:

例如:

1、作为插件强依赖容器(若有一天容器淘汰了?)

2、做为go语言开发的组件若要按业务需求进行扩展需要门槛

3、istio作为一pod多容器(envoy)注入模式,若服务pod数量过多后可能存在性能问题(官方方案:只能加缓存)

istio的其他替代方案:可通过spring cloud gateway集成sentinel、skywalking等组件扩展自研。

                              入口流量可通过gateway+sentinel控制,出口流量(服务间调用)可通过封装sdk强制转发路由到gateway。

                             (springcloud gateway3.0.1开始支持grpc,参考spring.io/blog/2021/12/08/spring-cloud-gateway-and-grpc;

                                springcloud提供了异构sidecar)


1645874593186.png

当服务1访问服务2时:

服务1必须通过两次sidecar拦截,而服务1和服务2不会进行直接通信,而是需要各自的sidecar。

istio能做什么?

1.自动通过服务发现获取server服务实例的列表,并根据负载均衡策略选择一个服务实例。

2.对服务双方启用双向认证和通道加密。

3.如果某个服务实例连续访问出错,则可以自动将该实例隔离一段时间,以提高访问质量。

4.设置最大连接数、最大请求数、访问超时等对服务进行保护。

5.限流。

6.对请求进行重试。

7.修改请求中的内容。

8.将一定特征的服务重定向。

9.灰度发布

10.自动记录服务访问信息。

11记录调用链,进行分布式追踪。

根据访问数据形成完整的应用访问拓扑。


istio弥补了k8s所欠缺的那部分(动态路由,链路追踪,熔断限流等)大大降低了微服务运维的复杂性。istio又包含了连接、服务保护、控制和观察服务几大特性,为微服务减轻了很多的负担,开发者不用关心服务调用的超时、重试的实现,服务之间的安全,授权也得到了保证。

连接:控制调用流量、灰度升级、ab测试、蓝绿部署等。

安全:为服务间调用提供认证、授权和加密

观察:查看服务运行期间的各种数据,比如(日志、监控和tracing,了解服务的运行情况)。

1645874593770.png

大致分为数据面和控制面两部分:

数据平面

由一组代理组成,接收并实施mixer的策略。

proxy(sidecar代理)

负责高效转发和策略实现(envoy 类型nginx)

envoy部署在每一个需要管理k8s的pod中会拦截所有的流量,经过规则校验

会经过本Pod的Enovy代理,Enovy完成规则校验、数据采集、日志等操作后,再转发出去;值得注意的是,请求方Enovy转发出去的流量会发送给接收方的Enovy,之后才有可能到达真正的接收方data-product容器。当然这些操作是Istio的活,我们要做的仅仅是通过配置的形式告诉Istio我们要对哪些流量做什么动作。

Istio sidecar 的工作原理是捕获入站流量和出站流量,并通过 sidecar 代理引导它们。
然而,并不是所有的流量都被捕获:
•重定向只处理基于TCP的流量。任何 UDP 或 ICMP 数据包都不会被捕获或修改。
•Sidecar 使用的许多端口[27]以及 22 号端口的入站捕获被禁用。这个列表可以通过 traffic.sidecar.istio.io/excludeInboundPorts等选项来扩展。
•出站捕获同样可以通过traffic.sidecar.istio.io/excludeOutboundPorts 等设置或其他方式减少。
一般来说,应用程序和其sidecar 代理之间的安全边界最小。对 sidecar 的配置是以每个模块为基础的,并且两者都在同一个网络/进程命名空间中运行。
因此,应用程序可能有能力删除重定向规则,并删除、改变、终止或替换 sidecar 代理。这允许一个 pod 故意绕过它的 sidecar 
的出站流量或故意让入站流量绕过它的sidecar。
因此,依靠Istio无条件地捕获所有流量是不安全的。相反,安全边界是客户端不能绕过另一个pod的sidecar。


控制平面

mixer(上报数据)

是控制面的核心,主要职责是获取注册中心的用户配置信息,在根据用户配置信息来处理envoy端的请求

适配组件,数据平面和控制平面通信,是通过Mixer来完成的,为proxy提供策略和数据上报

telemertry组件:

policy组件:

机制流程和telemetry类似,数据面在转发服务的请求前调用policy的check接口,检查是否允许访问,Mixer会根据配置将请求转发到Adapter做对应检查,给代理返回是否允许访问。

pilot(服务发现、配置下发、流量管理)

      配置策略组件,为Proxy提供服务发现,智能路由,错误处理等,主要是做流量管理操作,类似于C/S架构中的master服务。

而且还有一个向数据面下发规则的功能,如VirtualService、DestinationRule、Gateway、ServiceEntry等流量治理规则、安全规则等,pilot负责将各种规则转换为Envoy可识别的格式,通过标准的xDs协议发送给Envoy,指导Envoy完成动作。在通信上,Envoy通过gRPC流式订阅pilot的配置资源,Envoy根据该路由规则进行流量转发。

citadel(证书、密钥校验)

      核心安全组件,提供加密通信,撤销秘钥和证书等功能,Citadel一直监听Kube-apiservicr,以serect的形式为每个服务都生成证书和秘钥,并在pod在创建时挂载在pod上代理容器使用这些文件进行服务认证,进而代理两端服务实现双向TLS认证,通道加密、访问授权等安全功能。这样就省去了用户在代码里维护证书秘钥。

galley(配置管理)

      配置管理,验证,分发,负责配置管理的组件,验证配置信息的格式和内容的正确性

gateway(入口,网格外访问网格内的唯一入口)


Istio有4个配置资源,落地所有流量管理需求。

VirtualService:实现服务请求路由规则的功能

DestinationRule:实现目标服务的负载均衡、服务发现、故障处理和故障注入等功能

Gateway:让服务网格内的服务可以被全世界看到

ServiceEntry:让服务网格内的服务可以看到外边的世界


参考:www.jianshu.com/p/5a31bfc142d5