Envoy External Processing是一种扩展能力,使得Envoy可以通过外部处理服务来增强其HTTP请求/响应处理功能,而不用编写Wasm插件或是其它处理脚本,使得处理更加灵活和可扩展。本文介绍External Processing的实现机制和使用示例。
前提条件
已部署httpbin应用,且可以正常访问,并完成相关操作中部署sleep应用的步骤。
External Processing机制
Envoy External Processing对下游服务请求以及上游服务响应进行处理的过程如下图:
下游服务向上游服务发送请求①,Envoy拦截请求并将请求信息转发至External Processing服务②。
External Processing服务对请求进行的处理,并将其返回给Envoy③。
Envoy根据返回的结果对请求进行处理,并将处理完的请求转发至上游服务④。
上游处理完请求后向下游服务发送响应⑤,Envoy拦截请求并将响应信息转发至External Processing服务⑥。
External Processing服务计对请求进行处理⑦,并将其返回Envoy⑧。
Envoy根据返回的结果对响应头和响应体信息进行处理,并将处理完的请求转发至下游服务⑨。
步骤一:编写External Processing服务处理逻辑
以下是部分核心逻辑代码,完整示例代码请参见ext-proc-demo。更多设计细节,请参见Envoy官方文档。
您需要编写Dockerfile将External Processing服务代码构建成镜像并上传到镜像仓库才可以进行部署。
步骤二:部署External Processing服务
本步骤使用ASM提供的External Processing服务示例镜像进行演示。该服务会在接收到的请求中添加请求头x-ext-proc-header: hello-to-asm
,并在返回的响应中添加请求头x-ext-proc-header: hello-from-asm
。
使用以下内容,创建ext.yaml。
apiVersion: v1 kind: Service metadata: name: ext-proc labels: app: ext-proc service: ext-proc spec: ports: # External Processing 监听端口 - name: grpc port: 9002 targetPort: 9002 selector: app: ext-proc --- apiVersion: apps/v1 kind: Deployment metadata: name: ext-proc spec: replicas: 1 selector: matchLabels: app: ext-proc version: v1 template: metadata: labels: app: ext-proc version: v1 spec: containers: - image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/ext-proc:v0.2 imagePullPolicy: IfNotPresent name: ext-proc ports: - containerPort: 9002
执行以下命令,查看Pod日志以确认External Processing服务运行状态。
kubectl logs ext-proc-64c8xxxxx-xxxxx
预期输出:
I1126 06:41:25.467033 1 main.go:52] Starting gRPC server on port :9002
日志中出现上述内容,说明External Processing服务运行状态正常。
步骤三:配置EnvoyFilter
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
使用以下内容,创建httpbin-ext-proc EnvoyFilter。
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter spec: configPatches: - applyTo: HTTP_FILTER match: context: SIDECAR_INBOUND listener: portNumber: 80 filterChain: filter: name: envoy.filters.network.http_connection_manager proxy: proxyVersion: ^MIN_VERSION-MAX_VERSION.* patch: operation: INSERT_BEFORE value: name: envoy.filters.http.ext_proc typed_config: '@type': >- type.googleapis.com/envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor grpc_service: envoy_grpc: cluster_name: outbound|9002||ext-proc.default.svc.cluster.local authority: ext-proc.default.svc.cluster.local processing_mode: request_header_mode: SEND response_header_mode: SEND
步骤四:访问httpbin应用进行验证
执行以下命令,访问httpbin应用,并查看响应头。
kubectl exec -it deploy/sleep -- curl httpbin:8000/headers -i
预期输出:
HTTP/1.1 200 OK
server: envoy
date: Wed, 11 Dec 2024 06:47:59 GMT
content-type: application/json
content-length: 564
access-control-allow-origin: *
access-control-allow-credentials: true
x-envoy-upstream-service-time: 3
x-ext-proc-header: hello-from-asm
{
"headers": {
"Accept": "*/*",
"Host": "httpbin:8000",
"User-Agent": "curl/8.1.2",
"X-B3-Parentspanid": "5c6dd2cc9312d6bb",
"X-B3-Sampled": "1",
"X-B3-Spanid": "1153a2737cee4434",
"X-B3-Traceid": "baba86b696edc75a5c6dd2cc9312d6bb",
"X-Envoy-Attempt-Count": "1",
"X-Ext-Proc-Header": "hello-to-asm",
"X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/default/sa/httpbin;Hash=69d8f267c3c00b4396a83e12d14520acc9dadb1492d660e10f77e94dcad7cb06;Subject=\"\";URI=spiffe://cluster.local/ns/default/sa/sleep"
}
}
可以看到,请求头中添加了x-ext-proc-header: hello-to-asm
,响应头中添加了x-ext-proc-header: hello-from-asm
。