amazon-web-services - 使用负载均衡器在 AWS EKS 上公开 Hazelcast 集群
问题描述
我们有一个在 AWS EKS kubernetes 集群内运行的 Hazelcast 3.12 集群。
您是否知道如何将在 AWS EKS kubernetes 集群内运行的具有 1 个以上 pod 的 Hazelcast 集群公开到 kubernetes 集群外部?
Hazelcast 集群有 6 个 Pod,并通过 LoadBalancer(AWS 经典负载均衡器)类型的 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
解决方案
如果您使用一个 LoadBalancer 服务公开所有 Pod,那么您需要使用 Hazelcast Unisocket Client。
hazelcast-client:
smart-routing: false
如果你想使用默认的Smart Client(这意味着更好的性能),那么你需要为每个 Pod 公开一个单独的服务,因为每个 Pod 都需要从 Kubernetes 集群外部访问。
在博文中阅读更多内容:如何在 Kubernetes 上设置您自己的本地 Hazelcast。
推荐阅读
- node.js - 如何在 Mongo 中查询以查找与查询中的字符匹配的集合元素
- r - 从 XML 转换表中重塑数据
- reactjs - 如果我创建一个项目来响应原生如何使其支持多个 Android 平台,例如(Android 6 及更高版本)
- c - 为什么编译器决定将内存变量放入 '%fs' 寄存器?
- css - 如何为 react.js 应用缩放 svg 背景?
- postgresql - 关系 *db_name* 不存在 postgres
- css - 图像与颜色的部分重叠
- c# - 使用 C# 正则表达式解析文本
- azure - 使用直到条件的 Azure 逻辑应用 API 分页
- angular - 类型“TwitterserviceService”上不存在属性“地图”