设置为Kubernetes v1.13和Istio 1.0.5
我遇到一个问题,其中Istio服务发现正在创建与TCP侦听器而不是HTTP侦听器匹配的Envoy配置。
通信在服务网格中进行,但是我需要Envoy充当第7层代理,而不是第4层直通。我没有收到通过Envoy发送HTTP请求所需的日志。
这是我在sidecar istio-proxy日志中看到的内容:
[2019-02-05T15:40:59.403Z]-5739 7911 149929“ 127.0.0.1:80” inbound | 80 || api-endpoint.default.svc.cluster.local 127.0.0.1:44560 10.244.3.100 :80 10.244.3.105:35204
当我在边车中检查Envoy配置时-这是该日志消息的相应配置。
"name": "envoy.tcp_proxy",
"config": {
"cluster": "inbound|80||api-endpoint.default.svc.cluster.local",
"access_log": [
{
"name": "envoy.file_access_log",
"config": {
"path": "/dev/stdout",
"format": "[%START_TIME%] %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS%\n"
}
}
],
"stat_prefix": "inbound|80||api-endpoint.default.svc.cluster.local"
}
所以我的问题是:为什么Pilot为Envoy提供HTTP服务的TCP配置?
答案 0 :(得分:2)
我遇到了这个问题,在我的情况下,我的服务的端口名不是http-xyz
的形式。
Istio / Envoy假定流量是TCP,除非它从端口名得到暗示它是其他协议的消息。
按照https://istio.io/help/faq/traffic-management/#naming-port-convention
命名端口:必须命名服务端口。
为了使用Istio的路由功能,端口名称的格式必须为协议后缀,使用http,http2,grpc,mongo或redis作为协议。
例如,名称:http2-foo或名称:http是有效的端口名称,但名称:http2foo不是。如果端口名称不以可识别的前缀开头或未命名,则该端口上的流量将被视为纯TCP流量(除非该端口明确使用Protocol:UDP表示UDP端口)。