Warm tip: This article is reproduced from serverfault.com, please click

docker-AWS(ECS)上的keycloak集群

(docker - keycloak cluster on AWS (ECS))

发布于 2020-11-26 18:34:31

我正在尝试在AWS ECS中设置密钥斗篷集群。

我尝试了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端口。(它们甚至在任务定义中打开)。

关于如何解决此问题的任何想法吗?

Questioner
VIAE IT
Viewed
0
VIAE IT 2020-12-01 15:14:26

首先:ping操作无济于事(我尝试了TCP_PING,JDBC_PING,DNS_PING,S3_PING等)

解决方案:

我注意到的是,服务器登录启动表明它将以集群模式启动,但无法与其他服务器通信。由于这似乎与AWS中的TCP / UDP通信有关,因此我开始从那里开始阅读更多的网络接口。

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

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

简短答案:

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