架构

Alauda Application Services Identity Management E1 利用 Keycloak™ 的云原生架构,提供经过验证的高可用身份和访问管理解决方案,满足企业对安全、可靠且可弹性扩展的身份验证和授权服务的要求。

整体架构

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 暴露给集群内部服务或外部客户端。

    ┌─────────────────────────────────────────────────────────┐
    │                    Kubernetes Cluster                   │
    │                                                         │
    │   ┌──────────────────┐     ┌────────────────────────┐   │
    │   │ Keycloak Operator│────▶│   Keycloak CR          │   │
    │   │  (Controller)    │     │   KeycloakRealmImport  │   │
    │   └──────────────────┘     └────────────────────────┘   │
    │           │                                             │
    │           ▼                                             │
    │   ┌──────────────────────────────────┐                  │
    │   │         Keycloak Deployment      │                  │
    │   │  ┌──────────┐  ┌──────────┐      │                  │
    │   │  │ Instance │  │ Instance │ ...  │                  │
    │   │  └──────────┘  └──────────┘      │                  │
    │   └──────────┬───────────────────────┘                  │
    │              │                                          │
    │   ┌──────────▼──────────┐  ┌──────────────────────┐     │
    │   │   PostgreSQL DB     │  │  Ingress / Service   │     │
    │   └─────────────────────┘  └──────────────────────┘     │
    └─────────────────────────────────────────────────────────┘

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:

CRDKind用途
keycloaks.k8s.keycloak.orgKeycloak定义和管理 Keycloak 服务器实例
keycloakrealmimports.k8s.keycloak.orgKeycloakRealmImport以声明方式将 Realm 配置导入正在运行的 Keycloak 实例

调和循环

Operator 持续将 Keycloak 资源的实际状态与 CR 中声明的期望状态进行调和:

  1. 用户创建或更新 Keycloak CR。
  2. Operator 检测到更改,并计算所需的集群状态(Deployment、Service、Ingress、Secrets)。
  3. Operator 应用所需的 Kubernetes 资源。
  4. 健康检查(存活探针和就绪探针)验证实例是否正在运行。
  5. 对于 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
  • 应用 RuntimeDefault seccomp 配置文件

集群和缓存架构

嵌入式 Infinispan

Keycloak 使用嵌入式 Infinispan 缓存层实现高性能分布式缓存。在多副本部署中,Infinispan 节点会使用 Kubernetes 原生发现机制(DNS_PING 或 KUBE_PING)自动组成集群。

缓存类型

缓存用途分布方式
Realm 缓存缓存 Realm 配置(客户端、角色、身份验证流)在所有节点之间复制
用户缓存缓存来自数据库或用户联合提供程序的用户数据在所有节点之间复制
会话缓存存储活动用户会话(SSO 会话、客户端会话)分布式,所有者数量可配置
身份验证会话缓存存储正在进行的登录流程分布式
离线会话缓存存储离线令牌/会话分布式
操作令牌缓存存储一次性操作令牌(密码重置、电子邮件验证)分布式

缓存配置

默认缓存配置适用于大多数部署。对于高级调优,可以通过 ConfigMap 提供自定义 Infinispan 缓存配置:

spec:
  cache:
    configMapFile:
      name: keycloak-cache-config
      key: cache-ispn.xml
自定义缓存配置

修改 Infinispan 缓存配置属于高级操作。不正确的设置可能导致会话丢失、缓存不一致或集群不稳定。缓存 XML 格式和可用选项可能会在不同 Keycloak 版本之间发生变化。在应用自定义缓存配置之前,请先在非生产环境中进行充分测试。

集群发现

在 Kubernetes 中,Keycloak Operator 会自动为 Infinispan 配置集群发现机制。所使用的具体发现协议属于由 Operator 管理的内部实现细节,可能会在不同版本之间发生变化。

为确保集群能够正确组建:

  • Keycloak Pod 必须能够通过集群通信端口(默认:7800)彼此通信。
  • 网络策略必须允许 Keycloak 命名空间内 Pod 之间通过此端口进行流量通信。
  • 根据 Operator 使用的发现机制,Keycloak service account 可能需要具备发现对等 Pod 的权限。
集群组建由 Operator 管理

无需手动配置 JGroups 或 Infinispan 发现。Operator 会根据 spec.instances 数量和集群环境处理此配置。如果 Pod 未能组成集群,请验证 Pod 之间通过 7800 端口的网络连接,并检查 Operator 日志中是否存在发现错误。


Keycloak™ 是 The Linux Foundation 的商标。Alauda 是独立供应商。本产品与 The Linux Foundation 没有关联,也未获得其认可或赞助。所有商标均归其各自所有者所有,仅用于标识目的。