k8s部署keycloak高可用集群及使用

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。


Keycloak使用


anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/6099.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

2 评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注