在原生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
相关产品推荐
相关产品推荐

