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 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 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