介绍Keycloak.X分布

2020年12月16日,星期三,由Keycloak团队发布

世界瞬息万变,它一直是引擎的重要组成部分。 随着公司开始将其基础架构迁移到云,安全性成为使这一旅程成功的关键因素。

我们自豪地宣布,Keycloak现在正在Quarkus上运行,Quarkus是一个Kubernetes和云原生堆栈,使用最好的Java库和标准,为我们的用户提供一个云友好的发行版,重点关注可用性、可扩展性,并针对在混合云中运行进行了优化。

也称为Keycloak.X,这种新的发行格式提供:

  • 缩短启动时间

  • 较低的内存占用

  • 容器优先方法

  • 更好的开发人员体验

  • 关注可用性

为什么是夸克斯?

Keycloak基本上是一个Java应用程序,目前在Wildfly (JEE) 应用程序服务器上运行。 到目前为止,这就是我们发布Keycloak服务器以供一般使用的方式。

虽然Wildfly可能是优化,易于使用,性能最佳的JEE应用服务器,但我们现在对以更云原生的方式运行的要求推动了我们的前进,其中Quarkus是Java和容器的第一堆栈,提供了更自然的路径,将所有功能引入Keycloak,使Quarkus非常适合在混合云中运行,重点是Kubernetes和Openshift等平台。

有关Quarkus的更多信息,请访问其网站https://quarkus.io/

关注usability

在Quarkus上,如果与Wildfly发行版相比,Keycloak是一个常规的Java应用程序,具有更简单的堆栈。

使用新的发行版,用户应该期望在配置和启动服务器以及执行其他常见操作时获得更好的体验。

丰富的命令行界面的引入使安装和使用Keycloak变得更加容易。

较小

只有几个目录,分发就更简单了,分发的总大小几乎是当前基于WildFly的分发的大小的一半。

通过利用Quarkus,Keycloak通过Vert.x显着减少了服务器启动时间,内存占用 (低RSS) 以及更好的运行时性能。

在混合云中部署时,所有这些方面都很重要,在混合云中,应优化资源使用以提供最佳的运行时环境并降低成本。

容器优先和云原生分发

与Keycloak操作员一起,将Keycloak部署到混合云中应该更容易。

旋转一个简单的容器也是如此。

开发人员经验

Quarkus为开发人员提供了丰富的生态系统,并为不同的库提供了大量集成。

灵活性可能是Keycloak的主要特征之一,借助Quarkus,我们希望为开发人员提供更好的体验。

安装

下载并提取Keycloak。X从分发zip或tar.gz文件downloads

目录结构

bin目录是所有二进制文件的位置,基本上是新的Keycloak CLI和一些其他实用程序。

conf目录,顾名思义,就是配置文件所在的位置。 您可能正在使用Keycloak。属性此目录中的文件是否配置服务器。 稍后,当我们更详细地讨论配置时,您将看到更多关于配置的信息。

提供商目录是您应该使用自定义提供程序或主题JAR部署jar文件的地方。

命令行界面

我们的主要要求之一是在第一次使用服务器时以及从长远来看,当服务器在生产中运行时,改善用户体验。

人们通常在服务器上执行的常见操作更容易执行,并且通过提供良好的默认值并要求最少的选项集来拥有正在运行的服务器,配置应该更简单。

Keycloak CLI是您现在应该用来启动和更改服务器配置的工具。 与任何其他CLI一样,它是自我描述的,并在其用法上有很好的文档。

通过运行:

kc.sh-帮助

现在,您可以查看可以执行的不同操作,例如启动服务器或导出领域,以及可以为每个受支持的命令设置的不同配置选项。

我们一直在寻求CLI的改进。 请随时与我们联系,提出您认为可能有帮助的任何建议。

启动服务器

如前所述,默认配置对如何启动服务器施加了一些条件。

成功启动服务器的主要条件之一是配置HTTPS。

但是,出于开发目的,可以在开发模式下启动Keycloak。

目前,此模式基本上是一个配置配置文件,允许您在不使用本地缓存的情况下运行服务器。

kc.sh start-dev

执行上述命令后,服务器应在http:// localhost:8080/

将来,这种模式还将在某些领域的配置策略上松懈,否则在生产中运行时将不允许使用。 例如,使用通配符作为客户端的有效重定向uri。

配置服务器

考虑到IAM解决方案的重要性以及配置错误对部署整体安全性的影响,现在将Keycloak分发为尽可能少的配置,并考虑默认策略的安全性。

这个想法是提供运行服务器的最低配置选项,同时对在生产运行之前应该如何设置配置施加一些关键约束。

这是我们正在改进并不断尝试改进的主要领域之一,在该领域中,应通过一小部分配置选项或具有良好的默认值来避免样板配置。

现在可以使用属性文件,环境变量或通过Keycloak CLI作为参数来设置不同的配置选项。

您可以通过运行帮助指挥。

有关配置的更多详细信息,请检查配置设计文件。

配置类别

配置选项分为两类:

  • 可以设置为运行时启动服务器时

  • 那些只能在以下情况下设置的配置服务器通过配置命令

例如,如果要将HTTP端口更改为8180,您可以使用:

kc.sh -- http-port = 8180

但是,要更改数据库,您需要首先运行配置启动服务器之前的命令:

kc.sh config -- db = postgres -- db-username = ******* -- db-password = *******
Kc.sh # 然后启动服务器

基本上,您可以在配置服务器时设置的任何配置选项也可以在启动服务器时设置,但是反之亦然,数据库配置就是一个例子。

检查帮助选项来检查可以为每个可用命令设置哪些属性。

HTTPS

在现实世界中,您将配置有效的密钥对和证书,但是您可以使用下面的命令生成自签名证书,以了解如何 设置HTTPS。

只需确保在分布的根目录下执行以下命令:

密钥工具-genkeypair -storepass密码-存储类型PKCS12 -keyalg RSA-密钥大小2048 -dname "CN = 服务器"-别名服务器-ext "SAN:c = DNS: 本地主机,IP:127.0.0.1"-密钥库conf/服务器。密钥库

上面的命令应该创建一个服务器。密钥库文件内部conf目录。 默认情况下,如果未设置密钥库,则Keycloak将从此密钥库加载密钥和证书。

之后,您可以按以下方式运行服务器:

kc.sh

数据库

数据库配置要简单得多。 您只需几个简单的命令行参数就可以更改数据库:

kc.sh配置 -- db = postgres & & kc.sh -- db-用户名 = **** -- db-密码 = ****

对于每个数据库,我们为JDBC URL,驱动程序,数据库名称和方言提供了良好的默认值。 因此,如果您对默认值感到满意,则无需提供这些选项。

在上面的示例中,服务器连接到在localhost上运行的PostgreSQL服务,其中数据库名称为Keycloak

当然,在生产中运行时,您通常需要自定义JDBC URL和其他参数,因此您可以按以下方式启动服务器:

kc.sh -- db-url = jdbc:postgresql:// <主机>/<数据库> \
      -- db-username = ****** \
      -- db-password = ******

或者仍然依赖于默认的JDBC URL,并设置主机和数据库如下:

kc.sh -Dkc.db.url.host =<host> \
      -Dkc.db.url.database =<database>
      -- db-username = ******
      -- db-password = ******

聚类

目前,我们仍在使用Infinispan和JGroups进行群集和HA部署。

但是,该配置现在使用Infinispan的本机配置,而不是像Wildfly Infinispan子系统中那样使用抽象。 这应该在配置、支持和文档方面给予更大的灵活性。

配置也得到了简化,您应该为部署服务器的不同平台获得良好的默认值。

默认情况下,已启用群集,您可以使用默认配置构建Keycloak群集。

默认配置位于conf目录,文件名为cluster-default.xml

在同一个目录中,您还有一个cluster-local.xml将所有缓存配置为本地缓存的文件,没有群集。 要使用此配置,请运行以下命令:

kc.sh -- 集群 = 本地

您可以定义自己的缓存配置,只需在conf目录,其中包含集群-前缀,就像cluster-local.xml集群-默认我们随分发一起运送的文件。

我们还为特定平台 (例如Kubernetes和ec2) 提供了一些良好的默认值。 例如,要在Kubernetes中运行集群,您可以运行以下命令:

kc.sh -Djgroups.dns.query =<jgroups-ping-service>。<命名空间>。<cluster-domain-suffix> -- cluster-stack = kubernetes

这些平台的默认配置基于Infinispan提供的默认值。

在上面的示例中,Kubernetes的默认配置将基于用于节点通信的UDP和用于节点发现的DNS_PING。 您可以用来自定义默认配置的任何参数都可以从Infinispan文档中获得。

自定义提供者和主题

自定义提供程序和主题的JAR文件应该放在提供商目录。

但是,为了在安装自定义提供程序时从优化中受益,您应该首先运行配置命令 启动服务器之前:

kc.sh配置
kc.sh # 然后启动服务器

基本上,在配置服务器时会解析SPI实现,从而在启动期间节省了启动时间和内存。 一次 你运行配置命令安装您的自定义提供程序,它们将被静态链接到服务器。

在容器中运行

要使用Docker运行Keycloak,可以使用以下命令:

docker run-名称keycloak -p 8080:8080 \
    -电子密钥锁 _ 管理 = 管理-电子密钥锁 _ 管理 _ 密码 = 更改 _ 我 \
    码头。io/Keycloak-x \
    start-dev

正如预期的那样,容器将以开发模式运行。

通过传递任何命令行参数,您可以以与使用Keycloak.X发行版相同的方式运行服务器。

若要使用要保留到服务器映像中的任何其他配置来配置容器,可以使用-- 自动配置选项如下:

docker run-名称keycloak -p 8080:8080 \
    -电子密钥锁 _ 管理 = 管理-电子密钥锁 _ 管理 _ 密码 = 更改 _ 我 \
    码头。io/Keycloak-x \
    -自动配置 \
    -- db = postgres -Dkc.db.url.host = $ DB_HOST -- db-username = keycloak -- db-password = change_me -- http-enabled = true

上面的命令应该足以使用PostgreSQL数据库运行服务器,监听给定的数据库主机。 创建容器后,随后的重新启动将永远不会再次经历配置阶段,而只是使用先前定义的配置启动服务器。

但是,建议始终基于此图像创建自己的图像。 通过这样做,您可以执行更多自定义,例如部署自定义提供程序或主题,并通过消除配置步骤来改善启动时间。

有关更多详细信息和示例,请参见https://github.com/keycloak/ keycloak-容器/树/主/服务器-x

基准测试

以下是一些数字,用于在Quarkus和Wildfly上运行的Keycloak之间进行非常简单的比较。

两个发行版都使用PostgreSQL数据库OpenJDK 11运行,数字是每个发行版连续10次运行的平均值。

测试场景涉及第一次以及数据库已经初始化时运行服务器。

分布

启动时间(s)

内存占用(RSS/MB)

第一

第二 +

第一

第二 +

野蝇

12.1

8.1

646

512

夸克斯

7.6

3.1

428

320

数字应该自己说话,人们应该期望这些数字在每个Keycloak.X版本中都会有所改善。

但是,这不仅涉及减少mb,还涉及如何优化内存使用。 通过使用64MB堆运行两个服务器,您应该注意到,在Wildfly上运行时,您有很多垃圾回收,最终可能导致服务器无法启动。 而Keycloak.X使用相同的堆大小,你可以有一个正在运行的服务器。 当然,根据你的用例,使用这个堆大小是不现实的,但它给出了一个好主意,你应该从现在开始期待什么。

关于性能,在第一个版本中,我们的主要重点是启动时间和内存消耗。 运行时性能是一个WIP,由于Keycloak.X在Vert.X之上运行,结果是有希望的。

总的来说,我们还只是旅程的开始。 一旦Keycloak在Quarkus上具有本机发行版,我们就可以期望更快的启动时间,更小的内存消耗以及更高的性能以及更少的资源。

路线图

这只是我们为使用Keycloak的人提供更云友好体验的旅程的开始。

Keycloak.X是一个预览发行版,我们在社区的帮助下不断改进它,直到它成为我们的主要发行版。 我们感谢您在此旅程中的任何反馈。

有许多重要的工作正在完成,以补充Keycloak.X分布,如:

  • 零停机升级

  • 原生图像支持

  • 提高开发人员体验

  • 更多文档

我们希望获得您的支持和反馈,以不断改善您使用Keycloak的体验。

感谢社区

这是社区共同努力的结果,因此,我们要强调并感谢我们所做的所有贡献。

特别感谢:

和所有帮助配置设计文档