可扩展性
Keycloak 基于模块化架构构建,并提供 服务提供商接口(SPIs),使开发人员能够扩展系统的几乎所有方面。本页面概述扩展点以及 Kubernetes 环境中的部署模型。
扩展点
开发自定义扩展
自定义扩展以实现 Keycloak SPI 的 Java 库形式开发。其一般模式如下:
- 实现 SPI 的
Provider接口(运行时逻辑)。 - 实现 SPI 的
ProviderFactory接口(实例化和配置)。 - 在
META-INF/services/中注册工厂(Java ServiceLoader 机制)。 - 打包为 JAR 文件。
完整的 SPI 开发指南维护在上游 Keycloak 文档中。本页面重点介绍 Alauda Application Services Identity Management E1 在 Kubernetes 上特有的部署模型。有关 SPI 实现的详细信息,请参阅上游 Keycloak Server Developer Guide。
在 Kubernetes 中部署扩展
Keycloak 26.x(基于 Quarkus)采用了与旧版 Keycloak/RH-SSO(基于 WildFly)根本不同的扩展部署模型。在 Quarkus 模型中,服务器会执行一个构建阶段(kc.sh build),进行提前编译和优化。大多数 SPI 和 provider 必须在此构建阶段存在,才能注册到 Quarkus 运行时中。
这意味着:
- 在构建阶段之前放入
/opt/keycloak/providers/的 provider JAR 会被编译到优化后的运行时中。 - 在构建阶段之后添加的 provider JAR(例如在 Pod 启动时通过卷挂载添加)通常不会被 Quarkus 运行时识别,某些 SPI 类型存在有限的例外情况。
- 没有通用的热部署机制——与基于 WildFly 的 Keycloak 不同,不能简单地将 JAR 放入正在运行的服务器中。
必需:构建自定义镜像
构建包含扩展的自定义 Keycloak 镜像:
下面的示例使用上游 Community 镜像,因此可以按原样运行。基于 Community 镜像构建会生成 Community Keycloak™ 构建版本:它不包含 Alauda Application Services Identity Management E1 的基础镜像、打包内容或补丁,也不受本网站支持政策的覆盖。要构建受支持的自定义镜像,请以产品自有的服务器镜像为基础——即已安装的 Operator 用于其实例的镜像引用——并使版本与正在运行的版本保持一致。
更新 Keycloak CR 以使用自定义镜像:
在 Keycloak 26.x(Quarkus)中,注册新 SPI、身份验证机制或协议映射器的 provider 必须在 kc.sh build 步骤期间存在。跳过构建阶段将导致无法发现或加载 provider。自定义镜像方法是生产部署中唯一受支持的方法。
使用预构建的自定义镜像时,--health-enabled 和 --metrics-enabled 等构建时选项必须包含在 Dockerfile 中的 kc.sh build 命令内。如果通过 Keycloak CR 中的 additionalOptions 指定这些选项,在使用自定义镜像时会被忽略,因为 Operator 不会重新运行构建步骤。始终在 Dockerfile 中包含所有必要的构建时标志。
某些指南建议使用带有 unsupported.podTemplate 的 init 容器,在运行时挂载 provider JAR。这种方法使用不稳定的 API 字段,不会运行 Quarkus 构建阶段,并且无法保证适用于大多数 provider 类型。请勿将此方法用于生产部署。
版本控制与兼容性
- Extension JAR 必须针对部署中使用的相同 Keycloak 版本进行编译。
- 升级 Keycloak 时,针对新版本重新构建并测试所有自定义 Extension。
- 使用 Keycloak 内部 API(而非公共 SPI)的 Extension 可能会在次要版本之间出现兼容性问题。