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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:35:35