配置 Ingress 和 TLS

本指南介绍如何通过启用 TLS 加密的 Kubernetes Ingress 从外部访问 Keycloak 实例,这是生产部署所必需的。

TLS 配置模式

Alauda Application Services Identity Management E1 支持两种不同的 TLS 模式。请选择与您的基础设施匹配的模式:

模式字段描述
TLS 位于 Keycloak Podspec.http.tlsSecretKeycloak 本身终止 TLS。客户端与 Pod 之间的流量进行端到端加密。
TLS 位于 Ingressspec.ingress.tlsSecretIngress 控制器终止 TLS。Keycloak 可以在内部提供普通 HTTP(设置 spec.http.httpEnabled: true)。

本指南演示 Ingress TLS 模式(推荐用于大多数 Kubernetes 环境)。

前提条件

  • 正在运行的 Keycloak 实例(请参阅 安装)。
  • 目标主机名对应的有效 TLS 证书和私钥。
  • 已部署在集群中的 Ingress 控制器(例如 NGINX)。

第 1 步:创建 TLS Secret

根据您的证书和私钥创建 Kubernetes TLS Secret:

kubectl create secret tls keycloak-tls-secret \
  --cert=tls.crt \
  --key=tls.key \
  -n <namespace>

验证 Secret 是否已创建:

kubectl get secret keycloak-tls-secret -n <namespace>

第 2 步:更新 Keycloak CR

更新您的 Keycloak CR,以启用带 TLS 的 Ingress 并配置主机名:

apiVersion: k8s.keycloak.org/v2beta1
kind: Keycloak
metadata:
  name: example-kc
spec:
  instances: 1
  db:
    vendor: postgres
    host: postgres-db
    database: keycloak
    usernameSecret:
      name: keycloak-db-secret
      key: username
    passwordSecret:
      name: keycloak-db-secret
      key: password
  http:
    tlsSecret: keycloak-tls-secret
  ingress:
    enabled: true
    className: nginx
    tlsSecret: keycloak-tls-secret
  hostname:
    hostname: keycloak.example.com
  proxy:
    headers: xforwarded
  unsupported:
    podTemplate:
      spec:
        containers:
          - securityContext:
              allowPrivilegeEscalation: false
              runAsNonRoot: true
              capabilities:
                drop:
                  - ALL
              seccompProfile:
                type: RuntimeDefault

应用更新后的清单:

kubectl apply -f keycloak.yaml -n <namespace>

第 3 步:验证 Ingress

检查 Ingress 资源是否已创建并具有正确的主机名:

kubectl get ingress -n <namespace>

预期输出:

NAME               CLASS   HOSTS                   ADDRESS         PORTS     AGE
example-kc-ingress nginx   keycloak.example.com    203.0.113.10    80, 443   1m

第 4 步:验证 HTTPS 访问

访问 https://keycloak.example.com 中的 Keycloak 管理控制台,并确认连接安全。

检查 Keycloak 是否已就绪:

kubectl get keycloak example-kc -n <namespace>

配置参考

字段描述
spec.http.tlsSecretKeycloak Pod 级别用于 HTTPS 的 TLS Secret 名称
spec.ingress.enabled设置为 true 以创建 Ingress 资源
spec.ingress.classNameIngress 类名称(例如 nginx)
spec.ingress.tlsSecret用于 Ingress TLS 终止的 TLS Secret 名称
spec.hostname.hostnameKeycloak 服务器的公共主机名
spec.proxy.headersKeycloak 接受的代理标头。对于 NGINX Ingress,设置为 xforwarded。
代理标头配置

使用反向代理或 Ingress 控制器时,必须正确设置 spec.proxy.headers。配置不正确可能会因信任伪造的标头而使 Keycloak 暴露于安全漏洞之中。