迁移到 Quarkus 发行版

从旧的 WildFly 发行版迁移到新的 Quarkus 发行版

在 Keycloak 17 中,默认发行版现在由 Quarkus 提供支持,而旧的 WildFly 支持的发行版将一直存在到 2022 年 6 月,我们强烈建议尽快开始迁移。

新发行版引入了许多重大变更,包括

  • 配置 Keycloak 的方式已发生重大改变

  • Quarkus 不是应用程序服务器,而是一个用于构建应用程序的框架

  • /auth 已从默认上下文路径中移除

  • 自定义提供程序的打包和部署方式不同

  • 用于 Kubernetes 和 OpenShift 的新运算符和 CRD

在进行迁移之前,我们强烈建议阅读新的 服务器指南,以了解如何安装和配置新发行版。

迁移配置

Keycloak 的 WildFly 发行版使用复杂的 XML 文件进行配置,导致需要使用 CLI 工具(jboss-cli)来操作这些文件。这些文件还给升级带来了复杂性,其中使用容易出错的脚本将配置从先前版本升级。

新的 Quarkus 支持的发行版使用了一个简单的配置文件,以及相应的 CLI 参数和环境变量作为选项,从而使配置 Keycloak 变得更加容易。但是,这会导致无法自动迁移先前发行版的配置。

要迁移到新的 Quarkus 支持的发行版,第一步是了解您对旧发行版应用了哪些配置更改,并按照新的 服务器指南 应用对新发行版必要的更改。

需要注意的是,新发行版在配置方面更加注重意见。它旨在提供更好的默认值,从而减少您需要进行的配置工作。但是,我们可能无法始终保持平衡,并且可能无法涵盖所有用例。

如果您无法配置新发行版中需要调整的内容,请在 GitHub 讨论 中发起讨论。

在发布新版本之前,可以通过直接通过 conf/quarkus.properties 文件应用 Quarkus 级别的配置来配置新发行版。我们建议您谨慎使用此方法,因为您将应用未经 Keycloak 团队测试和不支持的配置。

Quarkus 不是应用程序服务器

与 WildFly 不同,Quarkus 不是应用程序服务器。应用程序服务器可以动态部署应用程序,并在运行时更改加载到内存中的内容,但在 Quarkus 上则不可能。

另一方面,Quarkus 为容器带来了不变性、更快的启动速度和更高的可预测性。

虽然使用 WildFly 发行版可以热部署自定义提供程序,并将数据库供应商更改为运行时配置,但现在不再支持此功能。

相反,Quarkus 发行版提供了一个单独的构建步骤,该步骤优化了运行时。这里需要特别注意的是,构建步骤实际上并没有构建 Keycloak 源代码,而是通过增强过程优化运行时,该过程非常快,并且能够完全优化加载到运行时中的内容。

我们建议您将此构建步骤作为安装 Keycloak 的一部分执行,通过 CI 执行,或者通过创建扩展基础 Keycloak 映像的自定义容器映像来执行。

但是,还存在一种自动构建模式,使 Keycloak 在这方面的工作方式与 WildFly 发行版大体相同。这会带来启动时间损失,但仍然能够比 WildFly 发行版更好地优化运行时。

初始用户的设置

Keycloak Wildfly 发行版包含名为 add-user-keycloak.sh 的脚本,用于将初始用户添加到 Keycloak。这些脚本不再包含在 Quarkus 发行版中。

要添加初始管理员用户,请设置环境变量 KC_BOOTSTRAP_ADMIN_USERNAMEKC_BOOTSTRAP_ADMIN_PASSWORD,用于设置用户的用户名和密码。Keycloak 在首次启动时使用它们来创建具有管理权限的初始用户。一旦存在具有管理权限的第一个用户,请使用命令行工具 kcadm.sh(Linux)或 kcadm.bat(Windows)创建其他用户。

默认上下文路径已更改

默认情况下,新的 Quarkus 发行版从上下文路径中移除了 /auth。要重新引入 /auth,请使用 http-relative-path 构建选项。例如

bin/kc.[sh|bat] start-dev --http-relative-path /auth

当指定相对路径时,仍然可以从根目录重定向到相对路径。具体来说,当用户访问 localhost:8080/ 时,页面将重定向到 localhost:8080/auth

迁移自定义提供程序

与 WildFly 发行版类似,自定义提供程序是通过将它们复制到部署目录来部署到 Keycloak 的。在新发行版中,您应该将提供程序复制到 providers 目录,而不是 standalone/deployments 目录(该目录不再存在)。其他依赖项也会复制到 providers 目录。

在新发行版中,不再有单独的类路径用于自定义提供程序,因此您在包含其他依赖项时需要更加小心。此外,EAR 打包格式和 jboss-deployment-structure.xml 文件不再受支持。

虽然 WildFly 发行版自动发现自定义提供程序,甚至支持在 Keycloak 运行时热部署自定义提供程序,但现在不再支持此功能,并且当您对 providers 目录中的提供程序或依赖项进行更改时,您必须随后执行构建操作,或者使用自动构建功能重新启动服务器。

根据您的提供程序使用的 API,您可能还需要对提供程序进行一些更改。如果您只利用了 Keycloak SPI 中的类,则无需进行更改,但如果您使用了 WildFly 中的其他 API,则可能需要进行一些更改。此外,JavaEE API(如会话/无状态 Bean)不再受支持。

使用运算符进行迁移

要在 Kubernetes 和 OpenShift 上使用 Quarkus 发行版,您需要使用新的运算符,旧的运算符 不支持新发行版。

没有“直接”迁移路径,要使用新的运算符安装 Keycloak,您需要创建一个新的自定义资源 (CR),最终得到一个基于 Quarkus 发行版的 Keycloak 部署。

旧的和新的运算符可以共存,即使它们在同一个命名空间中,因为它们在 CRD 中使用不同的 API 组和版本。

对于旧的运算符,apiVersion 为

apiVersion: keycloak.org/v1alpha1

对于新的运算符,apiVersion 为

apiVersion: k8s.keycloak.org/v2alpha1

在使用 kubectl 命令时,如果 2 个 CRD 已安装到集群中,请确保使用包含 API 组的完全限定名,例如

$ kubectl get keycloaks.k8s.keycloak.org

新的运算符不支持直接使用 Client、User 和 Realm CRD。相反,它提供了一个 CRD 来执行 领域导入。使用此新的 CR,您可以通过包装领域导入用户、客户端等。

X-Forwarded-* 标头的优先级

在 Quarkus 中,X-Forwarded-Port 标头的优先级高于 X-Forwarded-Host 中包含的任何端口。这与 WildFly 发行版不同,在 WildFly 发行版中,X-Forwarded-Host 中包含的端口优先于 X-Forwarded-Port。

在本页