首页 > 解决方案 > 使用负载均衡器在 AWS EKS 上公开 Hazelcast 集群

问题描述

我们有一个在 AWS EKS kubernetes 集群内运行的 Hazelcast 3.12 集群。

您是否知道如何将在 AWS EKS kubernetes 集群内运行的具有 1 个以上 pod 的 Hazelcast 集群公开到 kubernetes 集群外部?

Hazelcast 集群有 6 个 Pod,并通过 LoadBalancer(AW​​S 经典负载均衡器)类型的 kubernetes“服务”暴露在 kubernetes 集群之外。

当我从 kubernetes 集群外部运行 Hazelcast 客户端时,我可以使用 AWS 负载均衡器连接到 Hazelcast 集群。但是,当我尝试从 Hazelcast 地图中获取一些值时,客户端失败并出现以下错误:

java.io.IOException:在 com.hazelcast.client.spi.impl.SmartClientInvocationService.getOrTriggerConnect(SmartClientInvocationService.java:75 处没有到地址 [172.17.251.81]:5701 的可用连接

该错误提到了 IP 地址 172.17.251.81。这是一个 Hazelcast pod 的内部 kubernetes IP,我无法从 kubernetes 集群外部连接到它。我不知道为什么客户端尝试连接到这个 IP 地址而不是负载均衡器公共 IP 地址。

另一方面,当我将 hazelcast 集群从 6 个 pod 扩展到 1 个 pod 时,我能够毫无问题地连接并获取地图值。

如果您想查看 kubernetes LoadBalancer Service 配置:

kind: Service
apiVersion: v1
metadata:
  name: hazelcast-elb
  labels:
    app: hazelcast
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-internal: "true"
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
spec:
  ports:
  - name: tcp-hazelcast-elb
    port: 443
    targetPort: 5701
  selector:
    app: hazelcast
  type: LoadBalancer

标签: amazon-web-serviceskuberneteshazelcastamazon-elbamazon-eks

解决方案


如果您使用一个 LoadBalancer 服务公开所有 Pod,那么您需要使用 Hazelcast Unisocket Client

hazelcast-client:
  smart-routing: false

如果你想使用默认的Smart Client(这意味着更好的性能),那么你需要为每个 Pod 公开一个单独的服务,因为每个 Pod 都需要从 Kubernetes 集群外部访问。


在博文中阅读更多内容:如何在 Kubernetes 上设置您自己的本地 Hazelcast


推荐阅读