架构
Alauda Application Services Identity Management E1 利用 Keycloak™ 的云原生架构,提供经过验证的高可用身份和访问管理解决方案,满足企业对安全、可靠且可弹性扩展的身份验证和授权服务的要求。
目录
整体架构Keycloak Server 架构基于 Realm 的多租户会话和缓存管理身份验证流程基于 Operator 的生命周期管理自定义资源定义调和循环高可用性网络和安全TLS网络策略安全上下文集群和缓存架构嵌入式 Infinispan缓存类型缓存配置集群发现整体架构
Alauda Application Services Identity Management E1 通过 Kubernetes Operator 进行部署和管理。该 Operator 监视 Keycloak 和 KeycloakRealmImport Custom Resources,并将期望状态协调至集群中。主要组件包括:
-
Keycloak Operator:管理 Keycloak 实例生命周期和 Realm 导入的控制器。
-
Keycloak Server:身份提供商和授权服务器,以 Kubernetes Deployment 的形式运行。
-
数据库:持久化关系数据库(推荐使用 PostgreSQL),用于存储所有 Realm、用户、客户端和会话数据。
-
Ingress / Service:通过 Kubernetes Ingress 将 Keycloak Server 暴露给集群内部服务或外部客户端。
Keycloak Server 架构
基于 Realm 的多租户
Keycloak 将身份管理组织为称为 Realm 的隔离单元。每个 Realm 都是一个独立的身份验证域,管理其自身的:
- 用户和凭据
- 客户端(应用程序)
- 角色和权限
- 身份提供商和联合身份
- 身份验证流程和策略
master Realm 是顶级管理 Realm,用于管理其他 Realm 以及 Keycloak 实例本身。
会话和缓存管理
Keycloak 在集群节点之间维护分布式会话和缓存数据。在多实例部署中,会话状态通过嵌入式 Infinispan(JGroups)集群共享。缓存配置可以通过由 Keycloak CR 引用的 ConfigMap 进行自定义。
身份验证流程
Keycloak 支持完全可自定义的身份验证流程。流程是身份验证步骤和子流程组成的序列(例如,先检查用户名/密码,再进行 OTP 验证)。可以按 Realm 和客户端配置流程。
基于 Operator 的生命周期管理
自定义资源定义
两个 CRD 定义了 Alauda Application Services Identity Management E1 的 Kubernetes API:
调和循环
Operator 持续将 Keycloak 资源的实际状态与 CR 中声明的期望状态进行调和:
- 用户创建或更新
KeycloakCR。 - Operator 检测到更改,并计算所需的集群状态(Deployment、Service、Ingress、Secrets)。
- Operator 应用所需的 Kubernetes 资源。
- 健康检查(存活探针和就绪探针)验证实例是否正在运行。
- 对于
KeycloakRealmImport,Operator 触发导入 Job,将 Realm 配置加载到 Keycloak 服务器中。
高可用性
对于生产部署,Alauda Application Services Identity Management E1 支持高可用配置:
- 多个副本:将
spec.instances设置为 2 或更高,以运行多个 Keycloak Pod。Kubernetes 会在所有正常运行的副本之间分发流量。 - 会话共享:Infinispan 集群通信确保用户会话在所有副本之间共享。如果某个 Pod 发生故障,用户会被透明地路由到另一个副本,无需重新进行身份验证。
- 数据库高可用:数据库是持久化数据的唯一真实来源。使用高可用 PostgreSQL 设置(例如采用复制或托管数据库服务),以消除数据库这一单点故障。
- Pod 调度:使用
spec.scheduling配置节点亲和性、容忍度和拓扑分布约束,以便将 Keycloak Pod 分布到不同的故障域(节点、可用区)。
网络和安全
TLS
Keycloak 支持两种 TLS 模式:
- Keycloak Service 上的 HTTPS:配置
spec.http.tlsSecret,以在 Keycloak Pod 处终止 TLS。适用于需要 Pod 到客户端之间直接进行加密通信的场景。 - Ingress 处的 TLS:配置
spec.ingress.tlsSecret,以在 Ingress 控制器处终止 TLS。当spec.http.httpEnabled: true时,Keycloak 本身可以在内部提供 HTTP 服务。
网络策略
spec.networkPolicy 字段控制允许哪些源访问 Keycloak 的 HTTP、HTTPS 和管理端口。这可以在 Kubernetes 网络层实现细粒度的入口流量控制。
安全上下文
Alauda Application Services Identity Management E1 通过 Pod 安全上下文实施安全加固:
- 以非 root 用户运行
- 删除所有 Linux capabilities
- 应用
RuntimeDefaultseccomp 配置文件
集群和缓存架构
嵌入式 Infinispan
Keycloak 使用嵌入式 Infinispan 缓存层实现高性能分布式缓存。在多副本部署中,Infinispan 节点会使用 Kubernetes 原生发现机制(DNS_PING 或 KUBE_PING)自动组成集群。
缓存类型
缓存配置
默认缓存配置适用于大多数部署。对于高级调优,可以通过 ConfigMap 提供自定义 Infinispan 缓存配置:
修改 Infinispan 缓存配置属于高级操作。不正确的设置可能导致会话丢失、缓存不一致或集群不稳定。缓存 XML 格式和可用选项可能会在不同 Keycloak 版本之间发生变化。在应用自定义缓存配置之前,请先在非生产环境中进行充分测试。
集群发现
在 Kubernetes 中,Keycloak Operator 会自动为 Infinispan 配置集群发现机制。所使用的具体发现协议属于由 Operator 管理的内部实现细节,可能会在不同版本之间发生变化。
为确保集群能够正确组建:
- Keycloak Pod 必须能够通过集群通信端口(默认:
7800)彼此通信。 - 网络策略必须允许 Keycloak 命名空间内 Pod 之间通过此端口进行流量通信。
- 根据 Operator 使用的发现机制,Keycloak service account 可能需要具备发现对等 Pod 的权限。
无需手动配置 JGroups 或 Infinispan 发现。Operator 会根据 spec.instances 数量和集群环境处理此配置。如果 Pod 未能组成集群,请验证 Pod 之间通过 7800 端口的网络连接,并检查 Operator 日志中是否存在发现错误。
Keycloak™ 是 The Linux Foundation 的商标。Alauda 是独立供应商。本产品与 The Linux Foundation 没有关联,也未获得其认可或赞助。所有商标均归其各自所有者所有,仅用于标识目的。