1. 配置文件结构

侦听器Listener
监听进网关inbound的流量,listener只接受来自绑定端口的请求。任何通过其他端口进来的请求都不会被envoy看到或者处理,发送该请求的用户只会获得错误响应。
一旦请求被listener接受,他就会经过一条过滤链(filter chain),这个过滤链描述请求一旦进入到envoy之后会被如何处理。

filterchain 由一些列的filter组成。
filter决定请求是否继续传递到下一条filter,还是返回给用户404错误。
如果通过了所有的filter之后,route(filter chain的扩展)将httpd请求转发到正确的集群或者服务(k8s里的svc的概念)。

listen–监听器
 1.监听的地址
 2.过滤链
  filter1
  filter2
  filter3

这里filter是用于限制过来的流量的
比如限速
比如修改报头信息等

cluster
 转发规则
 endpoints
 --指定后端地址

2. 自定义envoy

2.1 创建2个后端容器

1
2
docker run -d --name web1 --restart=always nginx
docker run -d --name web2 --restart=always nginx

2.2 创建enovy配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
admin:
access_log_path: /tmp/admin_access.log
address:
socket_address: { address: 127.0.0.1, port_value: 9901 }

static_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 10000 }
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
codec_type: AUTO
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match: { prefix: "/" }
route: { cluster: some_service }
http_filters:
- name: envoy.filters.http.lua
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
#inline_code: |
inlineCode: |
function envoy_on_response(response_handle)
response_handle:headers():add("X-User-Header", "===XXX==")
end
- name: envoy.router
clusters:
- name: some_service
connect_timeout: 0.25s
type: STATIC
#type: LOGICAL_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: some_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 172.17.0.7
port_value: 80
- endpoint:
address:
socket_address:
address: 172.17.0.3
port_value: 80

2.3 创建envoy

1
docker run -d -p 10000:10000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml --name myenvoy envoyproxy/envoy:latest

获取结果

3. envoyFilter

EnvoyFilter用来自定义 Istio Pilot 生成的 Envoy 配置。使用 EnvoyFilter 可以修改某些envoy的字段,添加特定的过滤器,甚至添加全新的监听器、集群等。必须谨慎使用此功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: lua-filter
namespace: istio-system
spec:
workloadSelector:
labels:
istio: ingressgateway
configPatches:
- applyTo: HTTP_FILTER
match:
context: GATEWAY
listener:
filterChain:
filter:
name: "envoy.filters.network.http_connection_manager"
subFilter:
name: "envoy.filters.http.router"
patch:
operation: INSERT_BEFORE
value:
name: envoy.lua
typed_config:
"@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua"
inlineCode: |
function envoy_on_response(response_handle)
response_handle:headers():add("X-User-Header", "===XXX==")
end

workloadSelector: 用于指定作用在谁
configPatches:用于配置补丁,下面的属性包括3个大类

  • apply_To: 应用到谁
    match:指定匹配规则
    patch:新的规则

applyTo: 给哪个位置打补丁,可用的值包括
 INVALID
 LISTENER 将补丁应用到监听器
 FILTER_CHAIN 将补丁应用到过滤器链
 NETWORK_FILTER 将补丁应用到网络过滤器链
 HTTP_FILTER 将补丁应用到HTTP过滤器链
 ROUTE_CONFIGURATION
 VIRTUAL_HOST
 HTTP_ROUTE
 CLUSTER