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

在原生Kubernetes上部署Keycloak

在原生Kubernetes上部署Keycloak

看起来你已经完成了Keycloak的初始部署,但要让它通过auth.my_domain.org域名在两个节点都能正常访问,需要调整几个关键配置,我一步步给你梳理:

1. 调整Keycloak服务的暴露方式

你用的官方quickstart里的keycloak.yaml,默认的Service类型是ClusterIP(只能集群内部访问),要让外部能通过节点IP访问,得把它改成NodePort类型:

  • 先编辑现有Keycloak服务:
kubectl edit service keycloak
  • 找到spec.type字段,把ClusterIP替换成NodePort,保存退出。K8s会自动分配一个30000-32767之间的端口,你可以用下面的命令查看具体端口:
kubectl get service keycloak

输出里的PORT(S)列会显示类似8080:31234/TCP,这里的31234就是分配的NodePort端口。

2. 更新DNS配置实现双节点流量分发

现在你只把DNS记录指向了控制平面节点,要让域名能轮询到两个节点,需要添加两条A记录:

  • 记录1:auth.my_domain.org -> 8.8.8.101(控制平面IP)
  • 记录2:auth.my_domain.org -> 8.8.8.102(工作节点IP)
    这样DNS会自动轮询解析到两个节点,用户访问域名时流量会被分到两个节点上,每个节点的NodePort都会把请求转发给Keycloak Pod。

3. 配置Keycloak的主机名参数

Keycloak需要明确知道自己的外部访问域名,否则生成的链接、认证Cookie会出现异常,所以要给Deployment添加环境变量:

  • 编辑Keycloak Deployment:
kubectl edit deployment keycloak
  • 在spec.template.spec.containers[0].env列表里新增以下变量:
- name: KC_HOSTNAME
  value: "auth.my_domain.org"
- name: KC_PROXY
  value: "edge"

简单解释下:

  • KC_HOSTNAME:指定Keycloak的外部访问域名,确保所有生成的公共URL都用这个域名
  • KC_PROXY=edge:因为我们直接用NodePort暴露服务,没有中间反向代理,这个参数让Keycloak正确处理外部请求的头信息

保存退出后,K8s会自动重启Keycloak Pod,应用新的配置。

可选:用Ingress实现无端口访问(更友好)

如果不想让用户访问时带端口号,可以用Ingress做反向代理,把80端口转发到Keycloak的8080端口(前提是你的集群已经安装了Ingress Controller,比如NGINX Ingress):
创建keycloak-ingress.yaml文件:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: keycloak-ingress
spec:
  rules:
  - host: auth.my_domain.org
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: keycloak
            port:
              number: 8080

然后应用配置:

kubectl apply -f keycloak-ingress.yaml

这样就可以直接通过http://auth.my_domain.org访问Keycloak了,不用带端口。

备注:内容来源于stack exchange,提问作者Peter Penzov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 12:05:28