K8s部署Keycloak搭配Cloudflare反向代理的控制台访问问题
解决方案:Cloudflare Tunnel + Kubernetes 部署 Keycloak 管理控制台HTTPS访问问题
一、修复生产模式(start)的403 Forbidden错误
核心原因
Keycloak启用edge代理模式时,需要信任反向代理(Cloudflare Tunnel + Ingress)发送的X-Forwarded-*请求头,否则会判定请求来源不合法,返回403。
调整Keycloak Deployment配置
更新环境变量,添加信任代理IP并修正hostname相关配置:
apiVersion: apps/v1 kind: Deployment metadata: name: keycloak labels: app: keycloak spec: replicas: 1 selector: matchLabels: app: keycloak template: metadata: labels: app: keycloak spec: containers: - name: keycloak image: quay.io/keycloak/keycloak:21.0.2 args: ["start"] env: - name: KC_PROXY value: "edge" # 信任所有代理IP(集群内部安全场景可用,如需更严格可配置Cloudflare Tunnel的官方IP段) - name: KC_TRUSTED_PROXIES value: "0.0.0.0/0" - name: KC_HOSTNAME_STRICT value: "true" - name: KC_HOSTNAME_STRICT_BACKCHANNEL value: "false" - name: KC_HOSTNAME value: "sso.example.com" - name: KC_HTTP_ENABLED value: "true" ports: - name: http containerPort: 8080
确保Ingress正确传递转发头
在Ingress配置中添加annotations,让Ingress Controller把正确的转发头传给Keycloak:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: keycloak-ingress annotations: nginx.ingress.kubernetes.io/forwarded-for-header: "X-Forwarded-For" nginx.ingress.kubernetes.io/proxy-set-header: "X-Forwarded-Proto $scheme" nginx.ingress.kubernetes.io/proxy-set-header: "X-Forwarded-Host $host" spec: rules: - host: sso.example.com http: paths: - path: / pathType: Prefix backend: service: name: keycloak-service port: number: 80
二、解决开发模式(start-dev)的CSP错误(仅临时调试用,不推荐生产)
开发模式下Keycloak默认生成HTTP链接,导致CSP策略拦截iframe,需强制指定HTTPS地址并调整CSP规则:
# 在Deployment的env中添加以下变量 - name: KC_HOSTNAME_URL value: "https://sso.example.com" - name: KC_CSP_FRAME_SRC value: "'self' https://sso.example.com"
三、Cloudflare Tunnel配置验证
- 确保Tunnel的流量转发目标是K8s集群的Ingress端口(80),且未修改请求的
Host头,保持为sso.example.com - Cloudflare的
SSL/TLS encryption mode设置为Full或Strict,不要设为OFF,确保客户端到Cloudflare的流量为HTTPS
内容的提问来源于stack exchange,提问作者sqz
相关产品推荐
相关产品推荐

