AWS (ECS) 上的 keycloak 集群 - 任务无法通信

keycloak cluster on AWS (ECS) - tasks can't communicate

我正在尝试在 AWS ECS 中设置 keycloak 集群。

我尝试了 JDBC_PING、DNS_PING、...但是我什么也做不了。 这是我的 DNS_PING docker 文件:

FROM jboss/keycloak:11.0.0
EXPOSE 8080
EXPOSE 7600
EXPOSE 7800
EXPOSE 9000

COPY themes /opt/jboss/keycloak/themes

#Database
ENV DB_VENDOR=mysql
ENV DB_DATABASE=....
ENV DB_ADDR=....
ENV DB_PORT=3306
ENV JDBC_PARAMS='useSSL=false'
ENV PROXY_ADDRESS_FORWARDING=true
ENV JGROUPS_DISCOVERY_PROTOCOL=dns.DNS_PING
ENV JGROUPS_DISCOVERY_PROPERTIES='dns_query=my.services.internal,dns_record_type=A'
ENV JGROUPS_TRANSPORT_STACK=tcp


#Admin user
ENV KEYCLOAK_USER=...
ENV KEYCLOAK_PASSWORD=...

好像捡起来了,但是两个ECS任务无法互通:org.jgroups.protocols.pbcast.gms超时

我的安全组中有这些条目:

因此 tcp/udp 端口不应被阻止。 (它们甚至在任务定义中打开)。

知道如何解决这个问题吗?

首先:ping 没有任何效果(我尝试了 TCP_PING、JDBC_PING、DNS_PING、S3_PING、...)

解法:

我注意到服务器启动时的日志表明它将以集群模式启动,但它无法与其他服务器通信。 因为这似乎 TCP/UDP 与 AWS 内部的通信有关,所以我开始阅读更多有关网络接口的内容。

我想出了任务定义的网络接口:在ECS中默认是docker(网桥)。这意味着每个 EC2 实例仅知道 IP 地址 运行 docker。 (我的 ECS 集群中有 2 个 EC2 实例 运行,每个 keycloak 实例都放在一个上)。我发现您可以使用类似 awsvpc 的东西(例如用于服务发现)作为任务定义的网络接口。

此 awsvpc 将在该 ECS 集群中的 所有 EC2 实例上启动一个本地 DNS 域。当我这样做时,两个 keycloak 实例开始相互通信,问题就解决了。

简答:

使用 awsvpc 作为任务定义的网络接口