为了验证上述Envoy过滤器生效,类似于前面章节,按照以下步骤部署示例应用。首先部署一个用于返回HTTP请求响应的应用示例(可以参考本书源码文件envoyf ilter文件夹中的httpecho.yaml),对应的资源定义如下所示:
apiVersion: v1
kind: Service
metadata:
name: httpecho
labels:
app: httpecho
spec:
ports:
- name: http
port: 5678
selector:
app: httpecho
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: httpecho-v1
spec:
replicas: 1
template:
metadata:
labels:
app: httpecho
version: v1
spec:
containers:
- image: solsson/http-echo
imagePullPolicy: IfNotPresent
name: httpecho
env:
- name: PORT
value: "5678"
ports:
- containerPort: 5678
为了调用上述httpecho服务,需要部署一个请求客户端,即前面章节中用到的sleep应用,执行如下命令:
kubectl apply -f sleep.yaml
等待应用容器完全启动之后,选择其中的sleep容器例如sleep-xxxx,通过执行如下类似命令登录到容器中:
$ kubectl exec -it sleep-7ffd5cc988-8j8z4 sh Defaulting container name to sleep. Use 'kubectl describe pod/sleep-7ffd5cc988-8j8z4 -n default' to see all of the containers in this pod.
此时,可以通过curl命令访问httpecho服务,并检查返回的结果中是否包含了上述Envoy过滤器定义的请求响应头信息,如下所示:
$ curl -v httpecho:5678
* Rebuilt URL to: httpecho:5678/
* Trying 172.21.3.204...
* TCP_NODELAY set
* Connected to httpecho (172.21.3.204) port 5678 (#0)
> GET / HTTP/1.1
> Host: httpecho:5678
> User-Agent: curl/7.60.0
> Accept: */*
>
< HTTP/1.1 200 OK
< content-type: application/json; charset=utf-8
< content-length: 619
< etag: W/"26b-vEElEBBPjhJ4OwB0VpbnNz6mf74"
< date: Tue, 19 Feb 2019 05:47:48 GMT
< x-envoy-upstream-service-time: 3
< server: envoy
< response-body-size: 619 //添加的一个请求头和正文的大小
<
{
"path": "/",
"headers": {
"host": "httpecho:5678",
"user-agent": "curl/7.60.0",
"accept": "*/*",
"x-forwarded-proto": "http",
"x-request-id": "d42eb93f-f0ee-9892-9bd6-8e1eb15f60dd",
"x-b3-traceid": "8f9b0ff4daa8aa15",
"x-b3-spanid": "8f9b0ff4daa8aa15",
"x-b3-sampled": "1",
"mykey": "myvalue", //添加的一个自定义的请求头
"content-length": "0"
},
"method": "GET",
"body": "",
"fresh": false,
"hostname": "httpecho",
"ip": "::ffff:127.0.0.1",
"ips": [],
"protocol": "http",
"query": {},
"subdomains": [],
"xhr": false,
"os": {
"hostname": "httpecho-v1-d8f665dc5-vm7pv"
}
由此可见,Envoy过滤器配置文件定义了HTTP过滤器,而HTTP过滤器会在Envoy监听器上执行。Lua脚本定义了过滤器的行为,Lua脚本将自身注册到envoy_on_request与envoy_on_response两个事件上,这意味着针对传入请求与传出流量它都会调用过滤器。