使用负载均衡器在 AWS EKS 上公开 Hazelcast 集群

Expose a Hazelcast cluster on AWS EKS with a load balancer

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

您知道如何将 AWS EKS kubernetes 集群内 运行ning 的超过 1 个 pod 的 Hazelcast 集群公开到 kubernetes 集群外部吗?

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

当我 运行 来自 kubernetes 集群外部的 Hazelcast 客户端时,我能够使用 AWS 负载均衡器连接到 Hazelcast 集群。但是,当我尝试从 Hazelcast 映射中获取一些值时,客户端失败并出现此错误:

java.io.IOException: No available connection to address [172.17.251.81]:5701 at com.hazelcast.client.spi.impl.SmartClientInvocationService.getOrTriggerConnect(SmartClientInvocationService.java:75

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

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

如果您想查看 kubernetes LoadBalancer 服务配置:

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

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

hazelcast-client:
  smart-routing: false

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


在博客中阅读更多内容 post:How to Set Up Your Own On-Premises Hazelcast on Kubernetes