AWS中的Keycloak跨数据中心设置
2018年1月15日,星期一,由Hynek mlna ř í k发布
这个帖子已经有一年多的历史了。 博客中的内容很可能已经过时。
AWS环境中的Keycloak跨数据中心设置示例
借助Keycloak 3.3.0,可以支持跨多个数据中心 (也称为跨站点,X站点,跨数据中心,跨DC) 的大规模部署。 关于如何在云环境中利用这种支持的自然问题出现了。 这篇博客文章跟进了以前的博客文章
关于在本地设置跨DC,并通过如何在Amazon Web Services (AWS) 中设置此类部署的示例对其进行了增强。
强烈建议至少使用版本3.4.3.Final,因为自第一个具有跨DC功能的版本以来,围绕跨DC支持进行了一些重要的修复。
建筑
详细描述了跨DC部署的一般架构
在Keycloak文档中并简要显示在下图中。 有几个数据中心 (
站点1和
站点2在可以找到完整比例的图片中
在文档中)。 这些站点有一个复制的数据库,理想情况下是在多主同步复制模式下设置的。 每个站点都有一个Keycloak节点集群和一个Infinispan节点集群。 Keycloak节点的集群隐藏在私有子网中的负载平衡器后面; Infinispan节点在相应的数据中心内形成集群,此外还利用中继协议在数据中心之间相互备份。
示例
这篇文章基于三个CloudFormation模板,这些模板逐渐构建了两个带有Keycloak实例的数据中心,每个数据中心在单独的AWS可用性区域中共享相同的虚拟私有云 (VPC)。 请注意,模板是有意的仅用于尝试/测试目的,不用于生产。 模板描述如下:
连接到节点
由于Infinispan节点分配了公共ip,并且安全组设置为允许SSH流量,因此您可以使用标准方式访问Infinispan节点。
访问Keycloak节点只是有点复杂,因为它们是在专用子网中产生的,并且只能通过Infinispan节点进行访问。 您可以将私钥复制到中间Infinispan节点并从那里使用它,或者 (更容易) 使用SSH代理转发,如下所示:
- 在你的本地主机,将您的AWS ssh密钥添加到代理:
ssh-添加/路径/到/我的/aws_ssh_key
- 现在ssh到Infinispan主机,ssh添加了ForwardAgent选项:
ssh -oForwardAgent = 是 \
ec2-user @ ${InfinispanServerDcX.PublicDnsName}
- 从Infinispan主机,您现在可以ssh到Keycloak节点:
ssh ec2-user @ ${KeycloakServerDcX.PrivateDnsName}
连接到Infinispan JConsole
正如你从
跨DC指南,许多DC范围的操作需要在Infinispan JMX MBeans上运行JConsole和调用操作。 例如,要使DC脱机,必须首先禁用从其他DC到即将关闭的DC的备份,这是通过调用
离线在CacheManager的操作
全球xsiteadminoperationsMBean。
要连接,最容易通过SSH命令创建到Infinispan节点的隧道。 为了简化这种情况,连接到Infinispan服务器并创建隧道的ssh命令显示在输出下第三个堆栈的选项卡SshToInfinispanDcX键,它采用以下形式:
ssh -L 19990:127.0.0.1:9990 \
-鸵鸟密钥检查 = 否 \
-oUserKnownHostsFile =/dev/null \
-oForwardAgent = 是 \
ec2-user @ ${InfinispanServerDcX.PublicDnsName}
在上面的命令中,主机密钥检查被有效地禁用,因为这只是一次测试运行,在生产中不要这样做!
现在有必要添加一个Infinispan管理用户,以便可以填写JConsole凭据:
/opt/测试/缓存-服务器-infinispan/bin/add-user.sh -u admin -p pwd
最后一件事是运行实际的JConsole。 由于JConsole不支持Infinispan和Keycloak都使用的服务: jmx:remote + http协议,因此有必要修改JConsole classpath。 幸运的是,这项工作已经在WildFly中完成,因此我们可以使用已经在那里准备的脚本。 在你的本地主机,提取野蝇10 + 或Infinispan到路径Wf _ 根,并运行以下命令:
Wf _ 根/bin/jconsole.sh
在新连接窗口中,指定远程进程属性如下 (请注意,我们正在使用通过ssh安全转发到上面的实际管理端口的localhost上的端口19990,这需要上面的ssh命令在使用JConsole的整个时间内运行):
- 远程进程:服务: jmx: 远程 + http:// localhost:19990
- 用户名:管理员
- 密码:pwd
现在,您可以连接到正在运行的实例,导航到所需的任何bean并根据需要执行操作。 备份站点名称由AMI堆栈值dc-1和dc-2。
有关更多详细信息,请检查中的配置文件/opt/测试/身份验证服务器-wildfly/独立/配置/独立-哈-DC。xml和/opt/测试/缓存-服务器-infinispan/独立/配置/集群-DC。xml。
免责声明
这个博客是在Keycloak 3.4.3的时候写的。最终已经发布。 将来可能会有不兼容的更改,但是您仍然应该能够使用此版本运行模板。
对AWS细节进行故障排除
- AWS中的Keycloak和Infinispan集群中的节点发现由S3_PING协议处理。 然而,该协议只能在支持版本2签名的区域运行,因为这个JGroups bug。 见亚马逊关于S3端点的文档对于支持版本2签名的区域。 请注意,可能可以使用新的本土 _ s3 _ 平协议,但由于以下原因,该协议尚未合并到Keycloak中这个野蝇问题。 作为一种解决方法,您可能可以使用其他发现协议,例如JDBC_PING。
- 推荐的跨DC部署数据库产品只有那些在文档中列出(当前为MariaDB提供的Oracle数据库12c RAC和Galera集群)。 可以使用从亚马逊RDS服务。 此博客中的模板仅用于MySQL/MariaDB数据库。
- 有可能使用亚马逊ALB当相关目标群体设置为支持负载平衡器粘性。 ALB使用专有的负载平衡器cookie,并忽略在Keycloak cookie中设置的路由,因此将路由添加到cookie应该在Keycloak配置中禁用。