我正在使用 bitnami Helm 图表作为 keycloak。并尝试使用 DNS ping 通过 3 个 keycloak 副本实现高可用性。
Chart version: 5.2.8
Image version: 15.1.1-debian-10-r10
Helm repo: https://charts.bitnami.com/bitnami -> bitnami/keycloak
修改后的values.yaml文件参数如下:
global:
image:
registry: docker.io
repository: bitnami/keycloak
tag: 15.1.1-debian-10-r10
pullPolicy: IfNotPresent
pullSecrets: []
debug: true
proxyAddressForwarding: true
serviceDiscovery:
enabled: true
protocol: dns.DNS_PING
properties:
- dns_query=keycloak.identity.svc.cluster.local
transportStack: tcp
cache:
ownersCount: 3
authOwnersCount: 3
replicaCount: 3
ingress:
enabled: true
hostname: my-keycloak.keycloak.example.com
apiVersion: ""
ingressClassName: "nginx"
path: /
pathType: ImplementationSpecific
annotations: {}
tls: false
extraHosts: []
extraTls: []
secrets: []
existingSecret: ""
servicePort: http
登录keycloak UI时,输入用户名和密码后,没有登录,重定向回登录页面。
从 Pod 日志中我看到以下错误:
0:07:05,251 WARN [org.keycloak.events] (default task-1) type=CODE_TO_TOKEN_ERROR, realmId=master, clientId=security-admin-console, userId=null, ipAddress=10.244.5.46, error=invalid_code, grant_type=authorization_code, code_id=157e0483-67fa-4ea4-a964-387f3884cbc9, client_auth_method=client-secret
当我在论坛中检查此错误时,根据一些建议将 proxyAddressForwarding 设置为 true,但同样,问题仍然相同。
除此之外,我还尝试了其他版本的 Helm Chart,但是 UI 本身无法正确加载,并出现页面未找到错误。
更新
当我使用带入口的 headless 服务时,我在日志中收到上述错误,即CODE_TO_TOKEN_ERROR
。但是如果我使用 ClusterIP 类型的服务和 ingress ,错误如下:
06:43:37,587 WARN [org.keycloak.events] (default task-6) type=LOGIN_ERROR, realmId=master, clientId=null, userId=null, ipAddress=10.122.0.26, error=expired_code, restart_after_timeout=true, authSessionParentId=453870cd-5580-495d-8f03-f73498cd3ace, authSessionTabId=1d17vpIoysE
我想发布的另一个附加信息是,我在启动时在所有 keycloak pod 日志中看到以下信息。
05:27:10,437 INFO [org.jgroups.protocols.pbcast.GMS] (ServerService Thread Pool -- 58) my-keycloak-0: no members discovered after 3006 ms: creating cluster as coordinator
这听起来像是 3 个成员没有合并,也没有形成一个 keycloak 集群。
最佳答案
可能导致这种情况的一种常见情况是,发出访问代码的节点不是接收到 token 代码请求的节点。因此,客户端从节点 1 获取访问代码,但第二个请求到达节点 2,并且该值尚未在此节点的缓存中。防止这种情况的最安全方法是设置 session 粘性负载均衡器。
我建议您尝试将service.spec.sessionAffinity
设置为ClientIP
。它的默认值为None
。
关于kubernetes - 无法登录高可用keycloak集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72551732/