本文摘自 istio 学习笔记
Envoy 缺省会把 http header 的 key 转换为小写,例如有一个 http header Test-Upper-Case-Header: some-value
,经过 envoy 代理后会变成 test-upper-case-header: some-value
。这个在正常情况下没问题,RFC 2616 规范也说明了处理 HTTP Header 应该是大小写不敏感的。
通常 header 转换为小写不会有问题(符合规范),有些情况对 header 大小写敏感可能就会有问题,如:
Context-Length
来判断 response 长度时依赖首字母大写。Envoy 只支持两种规则:
如果应用的 http header 的大小写完全没有规律,就没有办法兼容了。
这两种是可以的:
类似这种就没有办法兼容了:
我们可以将服务声明为 TCP 协议,不让 istio 进行七层处理,这样就不会更改 http header 大小写了,但需要注意的是同时也会丧失 istio 的七层能力。
如果服务在集群内,可以在 Service 的 port 名称中带上 "tcp" 前缀:
kind: Service
metadata:
name: myservice
spec:
ports:
- number: 80
name: tcp-web # 指定该端口协议为 tcp
如果服务在集群外,可以通过一个类似如下 ServiceEntry 将服务强制指定为 TCP Service,以避免 envoy 对其进行七层的处理:
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: qcloud-cos
spec:
hosts:
- "private-1251349835.cos.ap-guangzhou.myqcloud.com"
location: MESH_INTERNAL
addresses:
- 169.254.0.47
ports:
- number: 80
name: tcp
protocol: TCP
resolution: DNS
更多协议指定方式请参考: 为服务显式指定协议
如果希望 Envoy 对某些请求开启 Header 首字母大写的规则,可以用 EnvoyFilter 来指定:
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: http-header-proper-case-words
namespace: istio-system
spec:
configPatches:
- applyTo: NETWORK_FILTER # http connection manager is a filter in Envoy
match:
# context omitted so that this applies to both sidecars and gateways
listener:
name: XXX # 指定 cos使用的listener name,可以从config_dump中查询到
filterChain:
filter:
name: "envoy.http_connection_manager"
patch:
operation: MERGE
value:
name: "envoy.http_connection_manager"
typed_config:
"@type": "type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager"
http_protocol_options:
header_key_format:
proper_case_words: {}
注意替换 listener name
应用程序应遵循 RFC 2616 规范,对 Http Header 的处理采用大小写不敏感的原则。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。