istio - 如果 loadBalancing.simple: PASSTHROUGH,流量不会通过 Egress
问题描述
我有两个节点的 Kafka 集群。ip 1.1.1.1 的 node1 和 ip 2.2.2.2 的 node2 所有流量都必须通过 Egres 控制器。如果来自应用程序的客户端使用 ip 1.1.1.1 寻址节点,那么他应该联系它,而不需要从 Istio 进行任何平衡
配置:
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: kafka
spec:
hosts:
- kafka.host
addresses:
- 1.1.1.1/32
- 2.2.2.2/32
ports:
- number: 9092
name: tcp-kafka
protocol: TCP
location: MESH_EXTERNAL
resolution: STATIC
endpoints:
- address: 1.1.1.1
- address: 2.2.2.2
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: kafka
spec:
host: kafka.host
trafficPolicy:
loadBalancer:
simple: PASSTHROUGH # disabled loadBalancer
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: kafka
spec:
selector:
istio: istio-egressgateway
servers:
- port:
number: 9092
name: tcp-kafka
protocol: TCP
hosts:
- kafka.host
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: kafka
spec:
hosts:
- kafka.host
gateways:
- mesh
- kafka
tcp:
- match:
- gateways:
- mesh
destinationSubnets:
- 1.1.1.1/32
- 2.2.2.2/32
port: 9092
route:
- destination:
host: istio-egressgateway
port:
number: 9092
- match:
- gateways:
- kafka
port: 9092
route:
- destination:
host: kafka.host
port:
number: 9092
weight: 100
流量到达 Egress Controller 并且不会向外流出,而在 Egress Controller 日志中:
[Envoy (Epoch 0)] [2020-07-31 13:52:21.351][58][warning][upstream] [external/envoy/source/common/upstream/original_dst_cluster.cc:76] original_dst_load_balancer: No downstream connection or no original_dst.
[2020-07-31T13:52:11.385Z] "- - -" 0 UH "-" "-" 0 0 0 - "-" "-" "-" "-" "-" - - 10.128.19.132:9092 10.128.13.52:47984 - -
PS 如果您在 DestinationRule 中设置 loadBalancer: ROUND_ROBIN 或其他,那么一切正常,流量会流向外部节点。但是不能保证从应用程序访问 ip 1.1.1.1 时,流量会到 ip 1.1.1.1 的外部服务器
Istio v1.1
解决方案
我认为您可以尝试为此在 DestinationRule 中设置粘性会话。
istio文档中的示例:
负载均衡器设置
应用到特定目的地的负载均衡策略。有关更多详细信息,请参阅 Envoy 的负载平衡 文档 。
例如,以下规则对流向评级服务的所有流量使用循环负载平衡策略。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
以下示例使用 User cookie 作为哈希键,为基于相同评级服务的评级服务散列负载均衡器设置粘性会话。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
loadBalancer:
consistentHash:
httpCookie:
name: user
ttl: 0s
有 v1.1文档的链接。
有一个粘性会话的例子。
希望您觉得这个有帮助。
推荐阅读
- swiftui - SwiftUI Map 长按注解
- c# - 如何修复 MyMethod () 的 Visual Studio 2019 C# 间距
- three.js - 在 Three.js 中动态改变 InstancedMesh 的颜色
- r - 如何使用 vba 在 rstudio 中执行脚本?
- java - Resteasy 错误响应正文无法访问
- c - 在多核处理器上,许多进程会自动分配给不同的处理器吗?
- python - 如何在 for 循环下使用 pims.open() 函数?
- python - 我不知道为什么我的 linux 设备无法连接到我的 windows 服务器
- python - 将十六进制值流转换为 16 位整数
- image - 使用 v-for 动态加载的图像不起作用