首页 > 解决方案 > 如果 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

标签: istioenvoyproxy

解决方案


我认为您可以尝试为此在 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文档的链接。


有一个粘性会话的例子。


希望您觉得这个有帮助。


推荐阅读