Keycloak 简介
Keycloak 是一个开源的身份和访问管理 (IAM) 解决方案,由红帽开发,提供安全且易于集成的身份验证和授权服务,简化了现代应用程序的访问控制。
Keycloak 的主要特点:
单点登录 (SSO): 用户只需登录一次即可访问所有受 Keycloak 保护的应用程序,无需重复输入用户名和密码。
身份验证: Keycloak 支持多种身份验证方式,包括用户名/密码、社交登录 (例如 Google、Facebook)、SAML、OAuth、OpenID Connect 等。
授权: Keycloak 允许您精细控制用户对应用程序和资源的访问权限,例如:
基于角色的访问控制 (RBAC): 将用户分配到不同的角色,并根据角色授予相应的权限。
基于策略的访问控制 (PBAC): 使用基于属性的规则来定义访问权限。
身份管理: Keycloak 提供了一套强大的工具来管理用户、组、角色和权限。
易于集成: Keycloak 可以轻松集成到各种应用程序和平台,例如:
Web 应用程序: 使用 Keycloak 的 JavaScript 库或 REST API 轻松集成 Keycloak 身份验证和授权功能。
移动应用程序: 使用 Keycloak 的移动 SDK 轻松集成 Keycloak 身份验证和授权功能。
微服务: 使用 Keycloak 的 REST API 轻松集成 Keycloak 身份验证和授权功能。
可扩展性: Keycloak 可以水平扩展,以满足不断增长的用户和应用程序需求。
开源和社区支持: Keycloak 是一个开源项目,拥有庞大的社区支持,可以获得丰富的文档、教程和示例。
Keycloak 的适用场景:
需要集中管理用户身份和权限的企业。
需要提供单点登录 (SSO) 功能的应用程序。
需要使用 OAuth 2.0 或 OpenID Connect 进行身份验证的应用程序。
需要使用基于角色的访问控制 (RBAC) 或基于策略的访问控制 (PBAC) 的应用程序。
需要快速集成身份验证和授权功能的开发团队。
Keycloak k8s高可用部署
keycloak安装可以参考 → K8s部署doris和keycloak,这里部署最新版的keycloak 25.0.1版本,不使用k8s部署数据库和Ingress代理,而是直接使用云上的mysql集群和负载均衡,不需要自签证书这些步骤,keycloak集群部署有两个地方需要特别注意:
1、keycloak各个节点是怎么共享数据通信的?
Keycloak 默认情况下使用端口 7800 来进行 Infinispan 分布式缓存的通信。 Infinispan 是一个开源的分布式缓存,它允许 Keycloak 在不同的节点之间共享数据。 Keycloak 使用 Infinispan 来缓存数据,包括本地缓存和远程缓存。
2、keycloak与反向代理之间的通信方式
Keycloak 的 KC_PROXY
设置用于控制 Keycloak 与反向代理之间的通信方式,edge
和 passthrough
是两种常见的模式。
edge
模式
含义: Keycloak 与反向代理之间使用 HTTP 协议通信,反向代理负责与客户端建立 HTTPS 连接,并在内部以 HTTP 方式将请求转发给 Keycloak。
适用场景: 适合内部网络安全性较高的环境,反向代理可以与客户端建立安全的连接,而 Keycloak 可以使用更简单的 HTTP 通信。
特点: 反向代理需要将 HTTP 请求转换为 HTTPS 请求,Keycloak 不需要处理 TLS 相关操作。
passthrough
模式
含义: Keycloak 会直接接收来自反向代理的 HTTPS 请求,反向代理只是将请求转发到 Keycloak,不进行任何处理。
适用场景: 适合内部网络安全性较低,业务安全性要求高的场景,Keycloak 需要处理 TLS 相关操作。
特点: Keycloak 需要处理 TLS 相关操作,可能需要额外的配置,例如证书和密钥。
区别总结:
模式 | Keycloak 处理 TLS | 反向代理处理 TLS | 适用场景 |
---|---|---|---|
edge | 否 | 是 | 内部网络安全性高,反向代理提供 HTTPS 处理 |
passthrough | 是 | 否 | 反向代理不提供 HTTPS 处理,Keycloak 需要处理 TLS |
选择哪种模式取决于你的环境和需求。如果你的反向代理已经提供了 HTTPS 处理,并且你需要 Keycloak 处理 TLS 相关操作,那么可以选择 passthrough
模式。反之,如果你的反向代理只提供 HTTP 处理,或者你需要反向代理处理 TLS 相关操作,那么可以选择 edge
模式。
此外,Keycloak 还提供了 reencrypt
模式,它要求 Keycloak 和反向代理之间也使用 HTTPS 通信。但 reencrypt
模式已经过时,建议使用 edge
或 passthrough
模式。
因此,部署keycloak集群需要部署集群的通信服务 Infinispan,暴露7800端口,同时将keycloak的 KC_PROXY 配置成 edge 模式,我们在lb上使用https,内网keycloak不需要再处理tls交互了。
k8s keycloak yaml配置:keycloak.yaml
apiVersion: v1 kind: Service metadata: labels: app: keycloak name: keycloak-service namespace: keycloak spec: internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - name: http port: 8080 protocol: TCP targetPort: 8080 nodePort: 30222 selector: app: keycloak sessionAffinity: None type: NodePort --- apiVersion: v1 kind: Service metadata: labels: app: keycloak name: keycloak-discovery namespace: keycloak spec: clusterIP: None clusterIPs: - None internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - port: 7800 protocol: TCP targetPort: 7800 publishNotReadyAddresses: true selector: app: keycloak sessionAffinity: None type: ClusterIP --- apiVersion: apps/v1 kind: StatefulSet metadata: name: keycloak labels: app: keycloak namespace: keycloak spec: podManagementPolicy: OrderedReady replicas: 3 updateStrategy: type: RollingUpdate rollingUpdate: partition: 0 selector: matchLabels: app: keycloak serviceName: "" template: metadata: labels: app: keycloak spec: containers: - name: keycloak image: quay.io/keycloak/keycloak:25.0.1 args: ["start","-Djgroups.dns.query=keycloak-discovery.keycloak"] securityContext: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File env: - name: KC_HOSTNAME value: keycloak.chegva.com - name: KC_FEATURES value: multi-site - name: KC_TRANSACTION_XA_ENABLED value: "false" - name: KC_HTTP_PORT value: "8080" - name: KEYCLOAK_ADMIN value: "admin" - name: KEYCLOAK_ADMIN_PASSWORD value: "admin" - name: KC_DB value: "mysql" - name: KC_DB_URL value: "jdbc:mysql://1.2.3.4:3306/keycloak?characterEncoding=UTF-8" - name: KC_DB_USERNAME valueFrom: secretKeyRef: key: username name: keycloak-db-secret - name: KC_DB_PASSWORD valueFrom: secretKeyRef: key: password name: keycloak-db-secret - name: KC_HEALTH_ENABLED value: "true" - name: KC_DB_POOL_INITIAL_SIZE value: "30" - name: KC_DB_POOL_MIN_SIZE value: "30" - name: KC_DB_POOL_MAX_SIZE value: "30" - name: KC_CACHE value: ispn - name: KC_CACHE_STACK value: kubernetes - name: KC_PROXY value: "edge" - name: KC_HTTP_ENABLED value: "true" - name: KC_HTTP_MAX_QUEUED_REQUESTS value: "1000" - name: KC_LOG_CONSOLE_OUTPUT value: json - name: KC_METRICS_ENABLED value: "true" - name: KC_HTTP_POOL_MAX_THREADS value: "100" ports: - containerPort: 8080 name: http protocol: TCP resources: limits: cpu: "4" memory: 8192M requests: cpu: "2" memory: 4096M
通过以下命令,部署数据库访问账号密码至 Secret 中:
kubectl create secret -n keycloak generic keycloak-db-secret \
--from-literal=username=keycloak \
--from-literal=password=yourpassword
# 创建数据库:create database keycloak;
执行集群部署命令:
kubectl apply -f keycloak.yml --record
查看keycloak集群状态:
kubectl get all,cm,secret,ing,rs,pod,svc -n keycloak
NAME READY STATUS RESTARTS AGE
pod/keycloak-0 1/1 Running 0 2d20h
pod/keycloak-1 1/1 Running 0 2d20h
pod/keycloak-2 1/1 Running 0 2d20h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/keycloak-discovery ClusterIP None <none> 7800/TCP 2d22h
service/keycloak-service NodePort 10.1.57.63 <none> 8080:30222/TCP 2d19h
NAME READY AGE
statefulset.apps/keycloak 3/3 2d20h
NAME DATA AGE
configmap/kube-root-ca.crt 1 3d5h
NAME TYPE DATA AGE
secret/keycloak-db-secret Opaque 2 3d5h
集群正常运行后,在lb上将后端rs配置成 NodeIP:30222 端口,然后解析访问域名即可。
注意:keycloak 25.0.1 容器健康检测有变化,按之前版本的检测path配置会返回404。
虽然可能不会用到,但有趣的项目我都想去试一试 去体验一番 先收藏了 待会儿去试试
@刘郎