在GKE中部署Keycloak集群:缓存配置及节点发现问题求助
GKE中Keycloak 20.0.1集群缓存与节点发现配置指南
缓存栈选择建议
- cache-stack=kubernetes:最适配K8s原生环境,依托K8s DNS实现服务发现,无需额外依赖,配置成本低,是GKE集群的优先选择。
- cache-stack=google:针对GCP环境做了适配,但实际使用中与kubernetes栈差异极小,仅在有特殊GCP集成需求时考虑。
- UDP/TCP方式:传统JGroups发现机制,需要手动配置端口暴露、安全组规则,在GKE中易出现网络连通性问题,不推荐。
Kubernetes缓存栈的Headless Service配置
Keycloak的kubernetes缓存栈依赖headless service完成DNS-based节点发现,需创建如下配置:
apiVersion: v1 kind: Service metadata: name: keycloak-headless labels: app: keycloak spec: clusterIP: None # 核心配置:标识为headless服务 ports: - name: jgroups port: 7600 targetPort: 7600 selector: app: keycloak # 必须与Keycloak Deployment的Pod标签完全匹配
Keycloak Deployment完整配置示例
apiVersion: apps/v1 kind: Deployment metadata: name: keycloak labels: app: keycloak spec: replicas: 3 selector: matchLabels: app: keycloak template: metadata: labels: app: keycloak spec: containers: - name: keycloak image: quay.io/keycloak/keycloak:20.0.1 args: ["start"] env: - name: KC_DB value: mysql - name: KC_DB_URL value: jdbc:mysql://<云SQL代理服务名>:3306/keycloak?useSSL=false&allowPublicKeyRetrieval=true - name: KC_DB_USERNAME valueFrom: secretKeyRef: name: keycloak-db-secret key: username - name: KC_DB_PASSWORD valueFrom: secretKeyRef: name: keycloak-db-secret key: password - name: KC_HOSTNAME value: <你的Keycloak域名> - name: KC_HTTP_ENABLED value: "true" - name: KC_PROXY value: edge - name: KC_CACHE_STACK value: kubernetes - name: JGROUPS_DISCOVERY_PROTOCOL value: dns.DNS_PING - name: JGROUPS_DISCOVERY_PROPERTIES value: "dns_query=keycloak-headless.<你的命名空间>.svc.cluster.local" ports: - name: http containerPort: 8080 - name: jgroups containerPort: 7600 readinessProbe: httpGet: path: /realms/master port: 8080 initialDelaySeconds: 30 periodSeconds: 10 livenessProbe: httpGet: path: /realms/master port: 8080 initialDelaySeconds: 60 periodSeconds: 10
"no members discovered"日志问题排查
- 检查Headless Service关联:执行
kubectl describe svc keycloak-headless,确认Endpoints列表包含所有Keycloak Pod的IP,且selector与Pod标签匹配。 - 验证Pod间网络连通性:在任意Keycloak Pod内执行
telnet keycloak-headless.<命名空间>.svc.cluster.local 7600,确认能连通其他Pod的7600端口。 - 核对JGroups配置:确保
JGROUPS_DISCOVERY_PROPERTIES中的DNS地址与headless服务的完整域名一致。 - 检查资源状态:确认所有Keycloak Pod已处于Running状态,无资源配额不足导致的Pending情况。
内容的提问来源于stack exchange,提问作者mrobin
相关产品推荐
相关产品推荐

