Istio Proxy【Envoy扩展】详解

源码工程和基本介绍

istio proxy工程概要

istio官方源码中有说明,istio项目的仓库除了istio本身外,还有istio proxy这个仓库,istio proxy官方源码和Envoy一样,采用C++编写,注意,这里的编译方式,不再是Makefile,也不是CMake,是Google出品的bazel。bazel可以直接在编译中引入第三方库,加载第三方源码,而不是和以前一样采用加载动态库、静态库或者干脆直接引入第三方源码到项目中的方式;这个方式有点类似golang的import和包管理机制,只需要引用并且制定第三方库的位置和版本即可。更多关于Bazel的介绍可以参考Bazel官网。

istio proxy和Envoy的关系

istio proxy这个项目工程既包含引用了Envoy的源码,还在此基础上自己做了扩展,这个扩展是通过Envoy  filter(过滤器)的形式来提供,这样的话就可以使得proxy代理将策略执行决策委托给Mixer,这样就解释了为什么Mixer可以被设计为提供策略和遥测的组件,Mixer->istio  proxy->Envoy这种形式来控制。这样通过这个方式就能:

  • 使用到Envoy的全部功能
  • 基于Envoy做扩展,结合istio本身做处理

核心原理和功能说明

在istio-proxy项目中的Envoy BUILD中可以知道,这里会编译出name = "Envoy"的二进制程序,然后start_Envoy会启动Envoy,同时会根据一些默认参数和配置文件模板生成一个全新的配置文件,然后运行。一些关键参数如Envoy二进制的路径和配置路径、监听的端口、mixer的地址如下:

    -a ... backend address         -c ... Envoy config file path         -e ... Envoy binary path         -l ... debug level         -m ... mixer server address         -p ... listening port         -t ... Envoy config template file path 复制代码

也即是istio proxy 提供两大块:

  • Envoy

    • Envoy 流量相关
  • mixer client

    • 测量和遥测相关,正因为集成了mixer client,所以才能在Envoy流量请求的时候可以进行前置检查和后置上报

Envoy 相关

istio-proxy源码中提供了envoy.conf.template 通用配置模板,这个模板文件最终会生成一个envoy的配置文件,然后envoy启动的时候指定运行。模板配置文件中已经配置好了Mixer相关的参数如mixer_server,这个Mixer对于Envoy来说就是一个cluster,因此是在cluster_manager里面进行管理配置。

然后Envoy的官方文档Listener discovery service (LDS)一文中有说明静态的Listener文件配置是无法通过LDS API进行修改或删除的,因此静态配置会一直生效,istio-proxy源码中则提供了Envoy的静态配置文件envoy_lds.conf 静态listeners配置

Envoy Filters

根据Envoy的官方文档中的网络过滤器Network (L3/L4) filters的介绍,有三种 network filters,而在istio-proxy源码中刚好有实现Network::ReadFilter  和  Network::WriteFilter 过滤器,这样就可以通过filter API  绑定到Listener,然后当有数据读or写的时候调用到对应的filter了,这样数据流就从Envoy本身转到了filter中。

然后network filter再转到Envoy 的 http filter,根据官方文档HTTP filters的介绍也有两种Filters,为Decoder和Encoder,然后在istio-proxy源码中实现了 Http::StreamDecoderFilter和Http::StreamEncoderFilter这两个Filter,这样的话整个流程就串起来了。

在具体实现中, Filter还对应有Controller进行管理,这个只是代码设计上的优雅风格,和流程无关,但是这个设计风格是可以借鉴参考的。

Mixer client

原有mixer client仓库是独立的,现在已经整合到了istio-proxy的代码仓库中,这样就可以很方便的在Sidecar Envoy代理中实现:

  • 和mixer server交互
  • 添加一级缓存
  • 前置检查
  • 后置批量上报
  • 策略控制
  • 属性、字段转换和传递

Envoy调用Mixer流程



Pilot和istio-proxy的关系

istio/istio项目中的pilot会提供Envoy所需的一切接口,istio/proxy项目则是真正Envoy的项目,会访问Pilot提供的接口。

官方pilot-agent-proxy命令中有详细说明,pilot-agent启动的时候,需要指定envoy的配置和二进制路径,然后镜像中的proxyv2的镜像的Dockerfile则参考这里。pilot-agent是容器中PID为 1 的启动进程,它启动时又创建了一个 Envoy 进程。

小结

istio-proxy,这个Envoy的扩展,就是在Envoy基础上,增加了一些Filter,然后通过这些个Filter在利用Mixer Client和 Mixer Server进行通信,这样就可以在proxy代理中:

  • 流量代理
  • 策略控制
  • 遥测代理
    • 缓存


©著作权归作者所有:来自51CTO博客作者mob604756e7db9c的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Solr7.3 Cloud On HDFS搭建
  2. Apache Kafka 2.0.0 正式发布,多项重要功能更新
  3. 计算机网络中这些高频考题,你还在死记硬背吗?(二)
  4. 华为核心交换机配置mac地址白名单接入
  5. SpringBoot + Mybatis + Druid + PageHelper在多数据源下如何配
  6. Linux下编译Qt 5版本源码
  7. 听说你还没读过 Bert 源码?
  8. 源码编译搭建LAMP架构
  9. Centos7配置DR模式的LVS

随机推荐

  1. 第八章 Android(安卓)开发常见的UI布局
  2. android 小知识
  3. Windows下Android平台搭建_2
  4. 控件的android:layout_alignParentTop属
  5. android 资源
  6. android XMl 解析神奇xstream 六: 把集合l
  7. Android Drawable Resources系列9:
  8. android的SDK----google中的翻译
  9. Android(安卓)- Android(安卓)Architectu
  10. [Android]解决EditText设置成密码模式改