istio-proxy用哪个端口代理http流量的?
在 Istio 中,istio-proxy(基于 Envoy)代理 HTTP 流量的端口取决于具体配置和服务类型。以下是以 Markdown 格式整理的详细说明,涵盖 istio-proxy 如何处理 HTTP 流量以及相关端口信息:
istio-proxy 代理 HTTP 流量的端口
1. 默认端口
istio-proxy 使用 iptables 规则 或 直接配置 来拦截和代理应用的流量。HTTP 流量的代理端口通常包括以下几种情况:
-
出站流量(Outbound):
- 默认情况下,
istio-proxy拦截 Pod 的出站 HTTP 流量(通常是 80 或 8080 端口),并将其重定向到 15001 端口(Envoy 的默认出站端口)。 - 例如,应用发起的 HTTP 请求(目标为某个服务的 80 端口)会被重定向到
istio-proxy的 15001 端口处理。
- 默认情况下,
-
入站流量(Inbound):
- 对于入站 HTTP 流量,
istio-proxy默认监听 15006 端口,然后根据服务的目标端口(例如 80 或 8080)进行转发。 - 具体目标端口由 Kubernetes Service 的
port和targetPort定义。例如,Service 定义的端口是 80,istio-proxy会将入站流量从 15006 转发到应用的实际端口(如 8080)。
- 对于入站 HTTP 流量,
-
服务定义的端口:
- 如果 Kubernetes Service 配置了特定端口(如 80、443、8080 等),
istio-proxy会根据VirtualService和DestinationRule的配置,代理这些端口的 HTTP 流量。 - 例如,
VirtualService中定义的http路由会指定目标服务的端口(如host: reviews.default.svc.cluster.local, port: 9080)。
- 如果 Kubernetes Service 配置了特定端口(如 80、443、8080 等),
2. 如何确认代理的端口
可以通过以下方法查看 istio-proxy 代理 HTTP 流量的具体端口:
方法 1:检查 istio-proxy 的监听端口
在 istio-proxy 容器中运行以下命令,查看 Envoy 监听的端口:
kubectl exec -it <pod-name> -n <namespace> -c istio-proxy -- netstat -tuln
或使用更现代的 ss 命令:
kubectl exec -it <pod-name> -n <namespace> -c istio-proxy -- ss -tuln
输出示例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Porttcp LISTEN 0 128 0.0.0.0:15001 0.0.0.0:*tcp LISTEN 0 128 0.0.0.0:15006 0.0.0.0:*tcp LISTEN 0 128 0.0.0.0:15021 0.0.0.0:*
- 15001:出站流量监听端口(包括 HTTP 流量)。
- 15006:入站流量监听端口(包括 HTTP 流量)。
- 15021:健康检查端口(非 HTTP 流量相关)。
方法 2:查看 Envoy 配置
使用 istioctl 查看 Envoy 的集群和监听器配置,确认 HTTP 流量的端口:
istioctl proxy-config listener <pod-name>.<namespace> -o json
查找 port 字段,筛选与 HTTP 相关的监听器(通常绑定到 15001 或 15006)。输出示例:
{ \"name\": \"0.0.0.0_15001\", \"address\": { \"socketAddress\": { \"address\": \"0.0.0.0\", \"portValue\": 15001 } }, \"filterChains\": [ { \"filters\": [ { \"name\": \"envoy.filters.network.http_connection_manager\" } ] } ]}
这里的 envoy.filters.network.http_connection_manager 表示该监听器处理 HTTP 流量。
方法 3:检查 Kubernetes Service 和 VirtualService
HTTP 流量的目标端口通常由 Kubernetes Service 和 VirtualService 定义。查看 Service 配置:
kubectl get service <service-name> -n <namespace> -o yaml
输出示例:
apiVersion: v1kind: Servicespec: ports: - name: http port: 80 targetPort: 8080
再检查 VirtualService 配置:
kubectl get virtualservice -n <namespace> -o yaml
输出示例:
apiVersion: networking.istio.io/v1alpha3kind: VirtualServicespec: hosts: - reviews.default.svc.cluster.local http: - route: - destination: host: reviews.default.svc.cluster.local port: number: 9080
这里,HTTP 流量被路由到 reviews 服务的 9080 端口,而 istio-proxy 会在 15001(出站)或 15006(入站)处理这些流量。
方法 4:通过 Envoy 管理接口
访问 Envoy 管理接口查看实时监听端口:
kubectl exec -it <pod-name> -n <namespace> -c istio-proxy -- curl -s http://localhost:15000/listeners
输出会列出所有监听器,查找与 HTTP 流量相关的监听器(通常绑定到 15001 或 15006)。
3. 典型场景说明
-
出站 HTTP 流量:
- 应用发起的 HTTP 请求(例如访问
http://reviews:9080)被 iptables 规则重定向到istio-proxy的 15001 端口。 istio-proxy再根据VirtualService和DestinationRule将请求转发到目标服务的正确端口。
- 应用发起的 HTTP 请求(例如访问
-
入站 HTTP 流量:
- 外部请求到达 Pod 时(例如通过 Service 的 80 端口),被重定向到
istio-proxy的 15006 端口。 istio-proxy根据配置转发到应用的实际端口(如 8080)。
- 外部请求到达 Pod 时(例如通过 Service 的 80 端口),被重定向到
-
HTTPS 流量:
- 如果是 HTTPS 流量(通常 443 端口),
istio-proxy仍使用 15006(入站)或 15001(出站)代理,但会处理 TLS 终止或透传,具体取决于DestinationRule的tls配置。
- 如果是 HTTPS 流量(通常 443 端口),
4. 注意事项
-
iptables 重定向:Istio 使用 iptables 规则将流量重定向到
istio-proxy,因此应用本身可能感知不到 15001 或 15006 端口,而是直接与 Service 端口交互。 -
自定义端口:如果服务使用非标准端口(例如 8080、9090),需要在
VirtualService中明确指定目标端口。 -
多协议支持:
istio-proxy不仅代理 HTTP/1.1,还支持 HTTP/2 和 gRPC,端口配置方式类似,但需确保VirtualService中的协议正确(http或http2)。 -
调试端口冲突:如果端口配置错误,可能导致流量无法正确路由。使用
istioctl analyze检查配置是否正确:istioctl analyze -n <namespace>
5. 总结
- 出站 HTTP 流量:通常通过 15001 端口代理。
- 入站 HTTP 流量:通常通过 15006 端口代理。
- 服务端口:实际 HTTP 端口由 Kubernetes Service 和
VirtualService定义(如 80、8080 等)。 - 查看方法:使用
netstat、ss、istioctl proxy-config listener或 Envoy 管理接口(curl http://localhost:15000/listeners)确认端口。


