You are on page 1of 23

初识 istio envoyfilter

研发三部 温作超

密级:内部
目录

01 基 本 介 绍

02 原 理 分 析

03 E n vo yF i lter 介 绍

3.1 Wa s m f i l t e r 详 解

3.2 Lua filter 详解


密级:内部
01
基本介绍

密级:内部
istio 是什么

istio是一个完全开
源的服务网格,作为透
明的一层接入到现有的
分布式应用程序里。

密级:内部
Envoy 是什么

Envoy 是专为大型现代
SOA(面向服务架构)架
构设计的 L7 代理和通信
总线,在 Istio 中,envoy
作为数据面,负责流量管
理。

密级:内部
EnvoyFilter 是什么
EnvoyFilter 是 istio 提供的一种 k8s 资源,支持从多个粒度修改 envoy 的配置。

LISTENER VIRTUAL_HOST HTTP_ROUTE

FILTER_CHAIN EnvoyFilter ROUTE_CONFIGURATION

NETWORK_FILTER HTTP_FILTER CLUSTER

配置EnvoyFilter

密级:内部
02
原理分析

密级:内部
原理分析

1. Pilot-agent根据启动参数和K8S API Server中的


配置信息生成Envoy的初始配置文件envoy-
生成
Pilot-agent envoy-rev0.json rev0.json。
2. Pilot-agent 使用 envoy-rev0.json 启动 Envoy
进程。
3. Envoy 根据初始配置获得 Pilot 地址,采用xDS
启动 静态配置(文件)
接口从 Pilot 获取动态配置信息。
4. Envoy 根据获取到的动态配置启动 Listener,并

Envoy Pilot 根据 Listener 的配置,结合 Route和Cluster 对


动态配置
(xDS接口) 拦截到的流量进行处理。

密级:内部
03
EnvoyFilter 介绍

密级:内部
EnvoyFilter 介绍

EnvoyFilter

EnvoyFilter 支持配置 listener,RouterConfiguration,


cluster。当你配置了 EnvoyFilter 资源之后,Pilot 会感知到配置
变动,然后将配置变更动态下发到 Envoy,Envoy 根据最新的配
Pilot
置进行流量管理。

Envoy Envoy 配置文件 官方文档

密级:内部
配置 listener
listener 是 envoy 最重要的配置之一,envoy 通过 listener 实现对流量的管理。Istio 会为接
入网格内的服务自动配置 listener,当然你也可以 EnvoyFilter 去修改默认的配置。

示例
LISTENER

FILTER_CHAIN
Envoy listener 文档
NETWORK_FILTER

HTTP_FILTER

密级:内部
配置 RouteConfiguration
RouteConfiguration 配置位于 listener 中,不过由于层级太深,所以 istio 把该配置拎出来单独
处理。这样用户配置的时候会更加方便。 RouteConfiguration 用于配置路由规则,该
RouteConfiguration 专指 HttpConnectionManager 下的 route_config。

删除返回头 Envoy RouteConfiguration 文档


添加请求头

示例
RouteConfiguration
添加返回头

删除请求头
配置路由

密级:内部
匹配 cluster
在Envoy中,Cluster是一个服务集群,Cluster中包含一个到多个endpoint,每个endpoint都可
以提供服务,Envoy根据负载均衡算法将请求发送到这些endpoint中。

v1
Envoy Cluster 文档

示例

cluster v2

v3

密级:内部
Filter 是什么

Filter 是流量管理的重
要组成部分,能够控制流量
的处理流。有些 Filter(例如
lua filter, wasm filter)是
允许用户自定义,用户能够
操控他们实现定制化的需求

密级:内部
3.1
Wasm filter 详解

密级:内部
Wasm filter 详解

wasm 可以作为一种沙盒技术,用于扩展 Istio 代理(Envoy)的能力。不同于 envoy 自带的 filter,


使用 wasm 编译成 filter 可以动态加载到 envoy 配置中。目前可以使用 wasme 快速构建 filter,然后通
过 Envoyfilter 加载到 envoy。wasme 编译的 filter 不支持网络请求。参考示例

初始化项目 修改代码逻辑 编译 通过EnvoyFilter加载

密级:内部
Wasm filter 构建
// 安装 wasme
$ curl -sL https://run.solo.io/wasme/install | sh
$ export PATH=$HOME/.wasme/bin:$PATH

// 验证 wasme
$ wasme --version
wasme version 0.0.33

// 初始化项目
$ wasme init ./new-filter
? What language do you wish to use for the filter:
cpp
rust
assemblyscript
▸ tinygo
? With which platforms do you wish to use the filter?:
▸ istio:1.7.x, gloo:1.6.x, istio:1.8.x, istio:1.9.x

密级:内部
Wasm filter 构建
// 按照需求修改代码
// 构建镜像
$ cd new-filter
$ wasme build <languge> -t webassemblyhub.io/<YOUR_USERNAME>/<PROJECT_NAME>:v0.1 .

// 查看镜像列表
$ wasme list -d
NAME TAG SIZE SHA UPDATED DIRECTORY
webassemblyhub.io/ilackarms/assemblyscript-test istio-1.5 12.6 kB a515a5d2 29 Apr 21 14:41 CST
/root/.wasme/store/50873deb75ceeb7b584501aac92aacf7

// 查看 wasm 文件,将 filter.wasm 文件拷出放到集群所在机器的 /var/local/lib/wasm-filters/ 目录下


// 查看 runtime-config.json 中的 rootIds,后续在配置 envoyfilter 的时候需要用到
$ ls /root/.wasme/store/50873deb75ceeb7b584501aac92aacf7
descriptor.json filter.wasm image_ref runtime-config.json

密级:内部
Wasm filter 验证
// 部署测试用例
$ kubectl create ns sample
$ kubectl label namespace sample istio-injection=enabled
$ kubectl apply –f service.yaml –n sample

// 查询 filter.wasm 是否挂载成功
$ kubectl exec deploy/helloworld-v1 –n sample -c istio-proxy -- ls /var/local/lib/wasm-filters

// 部署 filter,需要用构建 wasm 镜像时查到的 rootid 替换 yaml 中的 root_id 配置


$ kubectl apply –f envoyfilter.yaml –n sample

// 查看服务 cluster-ip
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
helloworld ClusterIP 10.109.99.84 <none> 5000/TCP 19h

密级:内部
Wasm filter 验证
// 使用服务的 cluster-ip 调用服务
$ curl -v http://10.109.99.84:5000/hello
> GET /hello HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 10.109.99.84:5000
> Accept: */*
>
< HTTP/1.1 200 OK
< newheader: my-config // 代码里配置的 header,说明 filter 配置生效
< location: envoy-wasm
< x-envoy-decorator-operation: helloworld.default.svc.cluster.local:5000/*
<
Hello version: v1, instance: helloworld-v1-6b8955fc4-2kmrl
* Connection #0 to host 10.109.99.84 left intact

密级:内部
3.2
Lua filter 详解

密级:内部
Lua filter 详解
Lua filter 是 envoy 原生支持的 filter,用户可以在 filter 中使用自定义的 lua 脚本。具体的使用可以参考
文档:https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/lua_filter

增加/删除请求头 请求其他服务

示例

修改请求Body 增加/删除返回头
Lua Filter

中断请求
打印日志

修改返回Body

密级:内部
谢谢!

密级:内部

You might also like