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

如何在本地Kubernetes中搭配NextAuth与Keycloak运行NextJS后端

解决Kubernetes集群内部解析外部DNS到内部服务的问题

问题背景

本地K8s集群部署了Keycloak、NextJS和Ingress-nginx,外部可通过auth.starter.local和starter.local访问对应服务(已在本地/etc/hosts配置指向127.0.0.1),但NextJS后端在登录时无法从集群内部解析auth.starter.local,导致获取Keycloak的.well-known配置失败。

以下是三种可行解决方案:


方案1:配置CoreDNS实现自定义域名解析

通过修改CoreDNS的ConfigMap,添加自定义映射规则,让集群内部解析auth.starter.local时指向Keycloak的内部服务。

子方案1.1:使用Hosts插件映射到ClusterIP

  1. 获取Keycloak服务的ClusterIP:
    kubectl get svc <keycloak-service-name> -n <keycloak-namespace> -o jsonpath='{.spec.clusterIP}'
    
  2. 编辑CoreDNS的ConfigMap:
    kubectl edit configmap coredns -n kube-system
    
  3. 在Corefile的.:53块中添加hosts配置(放在其他插件之前):
    .:53 {
        hosts {
            <Keycloak-ClusterIP> auth.starter.local
            fallthrough  # 未匹配的请求继续走默认解析
        }
        # 保留原有其他配置(如kubernetes、forward等)
        kubernetes cluster.local in-addr.arpa ip6.arpa {
            pods insecure
            fallthrough in-addr.arpa ip6.arpa
            ttl 30
        }
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }
    
  4. 重启CoreDNS Pod使配置生效:
    kubectl rollout restart deployment coredns -n kube-system
    

子方案1.2:使用Rewrite插件映射到内部服务名

如果Keycloak的ClusterIP可能变化,推荐用服务名映射,更灵活:

  1. 编辑CoreDNS的ConfigMap,在Corefile中添加rewrite规则:
    .:53 {
        rewrite name auth.starter.local <keycloak-service-name>.<keycloak-namespace>.svc.cluster.local
        # 保留原有其他配置
        ...
    }
    
  2. 重启CoreDNS Pod即可。

方案2:修改NextJS的Keycloak配置为内部服务地址

直接让NextJS后端访问Keycloak的集群内部服务地址,绕过外部DNS解析,这是最直接高效的方案。

修改NextAuth的Keycloak Provider配置,将issuer字段替换为Keycloak的内部服务URL:

import NextAuth from "next-auth";
import KeycloakProvider from "next-auth/providers/keycloak";

export default NextAuth({
  providers: [
    KeycloakProvider({
      clientId: process.env.KEYCLOAK_CLIENT_ID,
      clientSecret: process.env.KEYCLOAK_CLIENT_SECRET,
      // 替换为Keycloak的内部服务地址
      issuer: "http://<keycloak-service-name>.<keycloak-namespace>.svc.cluster.local/auth/realms/<your-realm>",
    }),
  ],
});

也可以通过环境变量配置,方便不同环境切换:

# 在NextJS的Deployment中设置环境变量
env:
  - name: KEYCLOAK_ISSUER
    value: "http://keycloak.default.svc.cluster.local/auth/realms/myrealm"

方案3:创建ExternalName类型Service

通过ExternalName Service将外部域名映射到内部服务名,无需修改CoreDNS或应用配置(需确保应用访问的域名与Service名对应,或配合CoreDNS rewrite)。

创建以下Service配置文件(keycloak-external-name.yaml):

apiVersion: v1
kind: Service
metadata:
  name: auth-starter-local
  namespace: <nextjs-namespace> # NextJS所在命名空间
spec:
  type: ExternalName
  externalName: <keycloak-service-name>.<keycloak-namespace>.svc.cluster.local

应用配置:

kubectl apply -f keycloak-external-name.yaml

此时在NextJS的命名空间中,访问auth-starter-local就会指向Keycloak的内部服务。如果要让应用仍使用auth.starter.local,可以结合方案1.2的CoreDNS rewrite规则,将auth.starter.local重写到auth-starter-local.<nextjs-namespace>.svc.cluster.local。


内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 07:32:07