13.6 mTLS迁移

上一章

13.8 添加请求头

下一章

更多图书

13.7 EnvoyFilter

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