使用以代码为中心的 Helm Charts 在 Kubernetes 高可用性集群(使用 ldap 作为用户联合)上的 Keycloak

fos*_*ose 1 high-availability kubernetes keycloak kubernetes-helm

我们想在 Kubernetes 上建立一个高可用的 Keycloak 集群(使用 ldap 作为用户联盟)。我们决定使用codecentrics helm charts,因为我们正在尝试将它们用于单个 Keycloak 实例设置并且效果很好。对于集群,我们在尝试正确设置所有内容时遇到了一些问题,但没有在广泛的互联网上找到最佳资源。因此,我决定写一个简短的总结,我们的主要问题在哪里以及我们如何解决这些问题。

本网站(除其他外)上描述的我们问题的解决方案,但描述的内容非常简短,感觉部分不完整。

我们在以下方面遇到的问题:

  1. 选择正确的 jgroups.discoveryProtocol
  2. 添加正确的 discoveryProperties
  3. 需要自己覆盖的部分 values.yaml

额外问题(我们已经面临单实例设置):

  1. 设置信任库以通过 ladps 作为用户联盟连接 ldap
  2. 为keycloak添加自定义主题

如果由于代码中心更新他们的掌舵图而发生变化,我将尝试更新它。

感谢 codecentrics 顺便提供了 helm charts!

fos*_*ose 7

免责声明:
这是我们设置它的方式 - 我希望这是有帮助的,但我不对配置错误和由此产生的安全漏洞负责。此外,我们在互联网上浏览了许多不同的资源,很抱歉,我不能对所有这些资源都表示感谢,但是已经过了几天了,我再也无法将它们聚集在一起了……

CODECENTRIC 图表版本 < 9.0.0

主要问题:
1. 选择正确的 jgroups.discoveryProtocol:
我不会在这里解释,但对我们来说,使用的正确协议是org.jgroups.protocols.JDBC_PING. 在此处了解有关协议(和一般集群设置)的更多信息

discoveryProtocol: org.jgroups.protocols.JDBC_PING
Run Code Online (Sandbox Code Playgroud)

使用 JDBC_PING jgroups 将管理实例发现。因此,为了缓存用户会话,为 keycloak 提供的数据库将使用额外的表进行增强,例如JGROUPSPING.

2.设置discoveryProperties: 这个需要设置为

discoveryProperties: >
      "datasource_jndi_name=java:jboss/datasources/KeycloakDS"
Run Code Online (Sandbox Code Playgroud)

避免出现以下错误:

java.lang.IllegalStateException: java.lang.IllegalArgumentException: 
Either the 4 configuration properties starting with 'connection_' or 
the datasource_jndi_name must be set
Run Code Online (Sandbox Code Playgroud)

3.其他需要设置的部分(主要在codecentrics github的readme和github中values.yaml的注释中都有描述):

  • 设定clusterDomain根据您的集群
  • 设置replicas大于 1的数量以启用集群
  • 设置service.type:我们采用了ClusterIP但它也可以与其他设置一起使用,例如LoadBalancer取决于您的设置
  • 可选但推荐:根据您的需要设置maxUnavailableminAvailable始终有足够的 Pod。
  • 设置我们的 Ingress(看起来非常标准):
 ingress:
    enabled: true
    path: /
    annotations: {
      kubernetes.io/ingress.class: nginx
    }
    hosts:
      - your.host.org
Run Code Online (Sandbox Code Playgroud)

奖金问题:

1. 信任库:
为了让 Keycloak 通过 ldaps 与 ldap 通信,我们必须建立一个信任库,其中包含我们的 ldap 证书:

从 ldap 接收证书并将其保存在某处:

discoveryProtocol: org.jgroups.protocols.JDBC_PING
Run Code Online (Sandbox Code Playgroud)

创建一个新的密钥库:

discoveryProperties: >
      "datasource_jndi_name=java:jboss/datasources/KeycloakDS"
Run Code Online (Sandbox Code Playgroud)

将下载的证书添加到密钥库:

java.lang.IllegalStateException: java.lang.IllegalArgumentException: 
Either the 4 configuration properties starting with 'connection_' or 
the datasource_jndi_name must be set
Run Code Online (Sandbox Code Playgroud)

输入所需的密码:use_the_same_password
通过键入“是”来信任证书。

在配置映射中提供密钥库:

 ingress:
    enabled: true
    path: /
    annotations: {
      kubernetes.io/ingress.class: nginx
    }
    hosts:
      - your.host.org
Run Code Online (Sandbox Code Playgroud)

为信任库增强您的 values.yaml:

添加并挂载配置映射:

extraVolumes: |
    - name: cert-keystore
      configMap:
        name: cert-keystore

extraVolumeMounts: |
    - name: cert-keystore
      mountPath: "/keystore/"
      readOnly: true
Run Code Online (Sandbox Code Playgroud)

告诉java你使用它:

javaToolOptions: >-
    -[maybe some other settings of yours]
    -Djavax.net.ssl.trustStore=/keystore/keystore.jks
    -Djavax.net.ssl.trustStorePassword=<<keystore_password>>
Run Code Online (Sandbox Code Playgroud)

由于我们没有要上传的密钥库密码与git我们增加了一个步骤,我们的管道那里得到sedvalues.yaml,替换<<keystore_password>>

2. 添加自定义主题:
主要是我们提供了一个带有自定义主题的 docker 容器:

extraInitContainers: |
    - name: theme-provider
      image: docker_repo_url/themeContainer:version
      imagePullPolicy: IfNotPresent
      command:
        - sh
      args:
        - -c
        - |
          echo "Copying theme..."
          cp -R /custom-theme/* /theme
      volumeMounts:
        - name: theme
          mountPath: /theme
Run Code Online (Sandbox Code Playgroud)

添加并挂载主题:

extraVolumes: |
    - name: theme
      emptyDir: {}

extraVolumeMounts: |
    - name: theme
      mountPath: /opt/jboss/keycloak/themes/custom-theme
Run Code Online (Sandbox Code Playgroud)

您现在应该能够在 Keycloak 管理 UI 中通过 选择自定义主题Realm Settings -> Themes

CODECENTRIC 图表版本 9.0.0 到 9.3.2(可能更高)

1. 集群
我们仍然使用 JDBC_PING,因为我们在使用 DNS_PING 时遇到了问题,如 Codecentric Repo 自述文件中所述:

extraEnv: |
  ## KEYCLOAK CONFIG
  - name: PROXY_ADDRESS_FORWARDING
    value: "true"
  ### CLUSTERING
  - name: JGROUPS_DISCOVERY_PROTOCOL
    value: org.jgroups.protocols.JDBC_PING
  - name: JGROUPS_DISCOVERY_PROPERTIES
    value: 'datasource_jndi_name=java:jboss/datasources/KeycloakDS'
  - name: CACHE_OWNERS_COUNT
    value: "2"
  - name: CACHE_OWNERS_AUTH_SESSIONS_COUNT
    value: "2"
Run Code Online (Sandbox Code Playgroud)

将服务设置为 ClusterIP:

service:
  annotations: {}
  labels: {}
  type: ClusterIP
  loadBalancerIP: ""
  httpPort: 80
  httpNodePort: null
  httpsPort: 8443
  httpsNodePort: null
  httpManagementPort: 9990
  httpManagementNodePort: null
  extraPorts: []
Run Code Online (Sandbox Code Playgroud)

2. 502 错误入口问题
我们在 Codecentrics 图表 9.xx 中遇到了 502 错误,修复需要一段时间才能弄清楚。这里也描述一个解决方案,我们从中汲取了灵感,但对我们来说,以下入口设置就足够了:

ingress:
  enabled: true
  servicePort: http
  # Ingress annotations
  annotations: {
    kubernetes.io/ingress.class: nginx,
    nginx.ingress.kubernetes.io/proxy-buffer-size: 128k,
  }
Run Code Online (Sandbox Code Playgroud)

CODECENTRIC 图表版本 9.5.0(可能更高)

更新到 9.5.0 需要测试。特别是如果需要使用 KUBE_PING 甚至自动缩放。如果发生重大变化,我会在测试后更新。