You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:00:59