一、可观测性

服务网格架构下,数据面Sidecar代理应用完成各种通用的非业务功能,包括可观测性数据的采集。

服务网格数据面拦截流量,识别协议中的访问细节,代理业务生成各种可观测性数据,比如生成请求的访问日志,调用链,访问指标等,上报给配置的监控后端。整个过程对业务代码没有侵入。

Istio可以允许用户定义不同的监控数据和监控采集方式,可以动态定义监控数据的格式、对接的后端服务等信息。

Istio1.5之后的版本,原有Mixer中实现的可观测性和策略控制的扩展都直接通过服务网格数据面Envoy自身的扩展机制实现,基于服务网格数据面构建若干可观测性和控制的能力。直接对接指标,日志,调用链和控制的后端,省去一个对中心侧服务的调用。

有些是Istio基于Envoy的过滤器扩展机制实现了新的过滤器,并插到Envoy的过滤器链上;有些则是Envoy原生能力的配置和开放。这些新过滤器添加到Envoy的TCP或HTTP过滤器链上,并根据配置在处理流量的适当阶段实现服务网格的指标数据的生成和元数据交换。

二、访问指标Metrics

Istio采用非侵入式采集方式使得业务开发人员无须关注这些指标的生成,除了TCP四层的基础指标,更多的是提供了对于HTTP HTTP2和gRPC等七层协议的指标,这也是istio提供的丰富七层能力的一部分。

三、调用链

调用链提供的链路追踪可以观察到每个阶段的调用关系,以及每个阶段的耗时和调用的详细情况。

Istio中,服务网格数据面拦截应用的请求,并代替应用业务进行调用链埋点。在应对每个请求时都生成调用链的数据结构Span,包括为每次调用都生成的traceId和spanId,一些重要的时间信息,以及其他调用链相关的请求和应答的重要信息。

应用程序能分发和传递这些携带调用链信息的固定头域。

四、访问日志

基于服务网格的非侵入性特点,开发人员无须修改业务代码,服务网格数据面在拦截到流量并解析到访问信息后,可以非常方便地输出业务访问日志。

五、限流

Istio中的限流模型

(1) 滑动窗口限流模型

(2) 令牌桶的限流模型:控制令牌桶内的令牌的总数和令牌注入的速率来控制服务的流量。可以将所有请求均匀地分到一个时间段内,可接收一定范围内的突发流量。

Istio限流直接基于数据面Envoy开发,本地限流是给每个数据面代理都配置限流规则,只限制该代理上通过的流量。

Envoy的全局限流基于一个实现了标准限流接口的gRPC限流后端服务,一般依赖redis管理全局限流配额。

六、指标采集

基于数据面的指标采集,接口和后端大多基于Prometheus

不同于常见的数据生成方主动向后端上报数据的push方式,Prometheus在设计上基于Pull方式向目标Exporter发送HTTP请求获取数据。

Istio基于数据面的采集,则在每个数据面代理都开放了标准的Exporter来发布当前代理上的指标数据。

Istio中的数据面代理Envoy通过metadata_exchange交换源负载或目标负载的元数据信息,形成完整的访问指标数据,再通过Prometheus Exporter发布本代理上的指标数据。

七、调用链采集

基于服务网格控制面下发的配置,数据面Envoy直接将生成的调用链数据向后端上报,不同的调用链后端对应的调用链格式和上报方式各不相同。

除了通过Istio进行配置,也可以直接给Envoy配置调用链。

在Istio1.12之后的版本中,可以通过Telemetry API中的tracing配置调用链的采集,既可以配置采用率,调用链采集器,也可以向生成的Span中添加自定义的字段,还支持常量,环境变量或者请求头域。

八、访问日志采集

访问日志直接在服务网格数据面Envoy上生成并上报给日志后端,根据后端采集方式的不同,会有不同的通道和方式。Envoy可以通过文件输出,由各种日志代理采集,也可以通过gRPC协议直接上报日志给标准的访问日志服务ALS,然后由ALS写给后端日志存储。

九、元数据交换

Envoy上报数据时,上报的访问源和目标信息中一般只包含IP地址等基础内容,但监控后端需要命名空间,集群等基础信息。于是服务网格可观测性不可或缺的功能就是向后端系统提供这些服务元数据。

在客户端上代理生成数据时就包含完整的元数据信息,当Istio数据面代理Istio-proxy中的Pilot-agent启动Envoy时,会从运行平台如Kubernetes获取服务自身的元数据信息,并且将这些信息写入Envoy的boostrap配置中。当Proxy代理业务处理流量时,Istio-proxy会使用一个metadata_exchange的过滤器进行元数据交换。