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

本地K8s环境NextJS服务端调用API连接失败问题求助

问题分析

你遇到的核心矛盾是:

  • 客户端请求依赖本地/etc/hosts将自定义域名指向127.0.0.1(Ingress暴露的本地入口),这部分正常。
  • NextJS服务端请求在K8s Pod内部发起,Pod里的127.0.0.1是Pod自身,而非运行Ingress的主机节点,因此解析local.api.my-app.com到127.0.0.1后会出现连接拒绝错误。

之前用路径路由正常,是因为服务端请求用的是相对路径(比如/api),Ingress直接转发到后端Service,不需要解析外部域名。

解决方案

方案1:服务端直接调用K8s内部Service(推荐)

这是最简洁高效的方式,服务端绕过Ingress,直接通过K8s内部Service网络访问API。

在NextJS代码中区分服务端/客户端环境,使用不同的API地址:

// 根据环境切换API地址
const apiBaseUrl = typeof window === 'undefined' 
  ? 'http://service-api:4001' // K8s内部Service名称+端口
  : 'https://local.api.my-app.com'; // 客户端使用自定义域名

// 发起请求示例
async function fetchData() {
  const res = await fetch(`${apiBaseUrl}/your-endpoint`);
  return res.json();
}

方案2:给NextJS Pod配置HostAliases

如果必须让服务端也使用自定义域名,可通过hostAliases在Pod内部的/etc/hosts添加映射,将域名指向Minikube节点IP。

  1. 获取Minikube节点IP:
minikube ip
  1. 修改NextJS的Deployment配置,添加hostAliases:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-frontend
spec:
  template:
    spec:
      hostAliases:
      - ip: "192.168.49.2" # 替换为上面获取的Minikube IP
        hostnames:
        - "local.api.my-app.com"
      # 其他原有配置...

应用更新后,Pod内部解析local.api.my-app.com会指向Minikube节点,从而访问到Ingress。

方案3:自定义K8s CoreDNS记录

如果需要所有Pod都能解析该自定义域名,可修改CoreDNS配置添加DNS记录,指向Ingress Controller的ClusterIP。

  1. 获取Ingress Controller的ClusterIP:
kubectl get svc nginx-ingress-controller -n ingress-nginx # 替换为你的Ingress Controller命名空间
  1. 创建CoreDNS自定义配置的ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns-custom
  namespace: kube-system
data:
  local.api.my-app.com.server: |
    local.api.my-app.com {
      hosts {
        10.96.0.10 local.api.my-app.com; # 替换为Ingress Controller的ClusterIP
        fallthrough
      }
    }
  1. 重启CoreDNS Pod使配置生效:
kubectl rollout restart deployment/coredns -n kube-system

内容的提问来源于stack exchange,提问作者francesco.venica

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:40:11