EnvoyFilter用于自定义Envoy代理的配置,使用时必须小心,如果出现错误,可能导致整个服务网格出现问题。
修改访问httpbin服务的请求信息示例如下:
1 apiVersion: networking.istio.io/v1alpha3
2 kind: EnvoyFilter
3 metadata:
4 name: httpbin
5 spec:
6 workloadLabels:
7 app: httpbin
8 filters:
9 - listenerMatch:
10 portNumber: 8000
11 listenerType: SIDECAR_INBOUND
12 filterName: envoy.lua
13 filterType: HTTP
14 filterConfig:
15 inlineCode: |
16 function envoy_on_request(request_handle)
17 request_handle:headers():add("X-Foo", "bar")
18 end
19 function envoy_on_response(response_handle)
20 body_size = response_handle:body():length()
21 response_handle:headers():add("X-Response-Body-Size", tostring
(body_size))
22 end
第1~22行定义了名为httpbin的EnvoyFilter。
第6~7行的定义表明此规则只对包含app标签值为httpbin的pod生效。
第9~11行的定义表明只处理端口地址为8000的进入pod的请求。
第12~13行定义所使用过滤器的类型和名称。
第14~22行表明,对于符合上述条件的请求,在请求后端服务时添加字段名为X-Foo、值为bar的请求头,在得到后端服务实例的响应后,添加X-Response-Body-Size响应头,并且值为服务响应内容的字节大小。
【实验】
1)创建测试Pod:
$ kubectl apply -f kubernetes/dns-test.yaml
2)部署httpbin服务:
$ kubectl apply -f kubernetes/httpbin.yaml $ kubectl get pod -l app=httpbin NAME READY STATUS RESTARTS AGE httpbin-b67975b8f-c7jp7 2/2 Running 0 61s
3)创建httpbin服务的EnvoyFilter:
$ kubectl apply -f istio/miscellaneous/envoy-filter.yaml
4)服务访问测试:
$ kubectl exec dns-test -c dns-test -- curl -sv http://httpbin:8000/headers
> GET /headers HTTP/1.1
> User-Agent: curl/7.35.0
> Host: httpbin:8000
> Accept: */*
>
{
"headers": {
"Accept": "*/*",
"Content-Length": "0",
"Host": "httpbin:8000",
"User-Agent": "curl/7.35.0",
"X-B3-Sampled": "0",
"X-B3-Spanid": "bbaccdc8c132ea85",
"X-B3-Traceid": "bbaccdc8c132ea85",
"X-Foo": "bar",
"X-Request-Id": "337f2180-6ec4-4ff9-a0e3-0cf11c3da91c"
}
}
< HTTP/1.1 200 OK
< server: envoy
< date: Sat, 19 Jan 2019 06:37:19 GMT
< content-type: application/json
< access-control-allow-origin: *
< access-control-allow-credentials: true
< content-length: 323
< x-envoy-upstream-service-time: 19
< x-response-body-size: 323
<
{ [data not shown]
从上面的服务访问测试可以看出,所有进入httpbin服务的请求都添加了值为bar的X-Foo请求头字段,请求的响应中包含了字段名为x-response-body-size、值为响应内容字节数的响应头。
5)清理:
$ kubectl delete -f kubernetes/dns-test.yaml $ kubectl delete -f kubernetes/httpbin.yaml $ kubectl delete -f istio/miscellaneous/envoy-filter.yaml