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