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

Kubernetes+Skaffold环境下Nats与MongoDB服务连接失败求助

Kubernetes + Skaffold环境下服务DNS解析失败排查

问题现象

运行skaffold dev时出现两类DNS解析错误:

  • Expiration服务报错:NatsError: Could not connect to server: Error: getaddrinfo EAI_AGAIN nats-srv
  • Auth服务报错:MongooseServerSelectionError: getaddrinfo EAI_AGAIN auth-mongo-srv
    此前应用运行正常,已核对代码配置与课程示例,问题持续多日未解决。

相关配置文件

nats-depl.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nats-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nats
  template:
    metadata:
      labels:
        app: nats
    spec:
      containers:
        - name: nats
          image: nats-streaming:0.17.0
          args:
            [
              '-p',
              '4222',
              '-m',
              '8222',
              '-hbi',
              '5s',
              '-hbt',
              '5s',
              '-hbf',
              '2',
              '-SD',
              '-cid',
              'ticketing',
            ]
---
apiVersion: v1
kind: Service
metadata:
  name: nats-srv
spec:
  selector:
    app: nats
  ports:
    - name: client
      protocol: TCP
      port: 4222
      targetPort: 4222
    - name: monitoring
      protocol: TCP
      port: 8222
      targetPort: 8222

expiration-depl.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: expiration-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: expiration
  template:
    metadata:
      labels:
        app: expiration
    spec:
      restartPolicy: Always
      containers:
        - name: expiration
          image: endrieb/expiration
          env:
            - name: NATS_CLIENT_ID
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: NATS_URL
              value: 'http://nats-srv:4222'
            - name: NATS_CLUSTER_ID
              value: ticketing
            - name: REDIS_HOST
              value: expiration-redis-srv

expiration/index.ts

import { natsWrapper } from './nats-wrapper';
import { OrderCreatedListener } from './events/listeners/order-created-listener';

const start = async () => {
  console.log("Expiration starting up ...");
  if (!process.env.NATS_CLIENT_ID) {
    throw new Error('NATS_CLIENT_ID must be defined');
  }
  if (!process.env.NATS_URL) {
    throw new Error('NATS_URL must be defined');
  }
  if (!process.env.NATS_CLUSTER_ID) {
    throw new Error('NATS_CLUSTER_ID must be defined');
  }

  try {
    await natsWrapper.connect(
      process.env.NATS_CLUSTER_ID,
      process.env.NATS_CLIENT_ID,
      process.env.NATS_URL,
    );
    natsWrapper.client.on('close', () => {
      console.log('NATS connection closed!');
      process.exit();
    });
    process.on('SIGINT', () => natsWrapper.client.close());
    process.on('SIGTERM', () => natsWrapper.client.close());

    new OrderCreatedListener(natsWrapper.client).listen();
  } catch (err) {
    console.error(err);
  }
};

start();

排查步骤

  1. 检查集群DNS服务状态

    • 执行kubectl get pods -n kube-system,确认coredns(或kube-dns)Pod处于Running状态
    • 若DNS Pod异常,执行kubectl rollout restart deployment coredns -n kube-system重启服务
  2. 验证Pod内DNS解析能力

    • 进入expiration Pod:kubectl exec -it $(kubectl get pods -l app=expiration -o name) -- /bin/sh
    • 执行nslookup nats-srv,检查是否能返回服务IP;同理对auth-mongo-srv做相同验证
    • 若解析失败,确认服务与应用Pod是否在同一Namespace下(默认使用default,若自定义Namespace需确保服务存在于对应空间)
  3. 检查服务与后端Pod的关联

    • 查看nats-srv服务详情:kubectl describe service nats-srv,确认Endpoints字段有对应的NATS Pod IP
    • 若Endpoints为空,检查NATS Pod状态:kubectl get pods -l app=nats,确认Pod处于Running且标签与服务selector匹配
  4. 重置Skaffold部署缓存

    • 停止当前skaffold dev进程,执行skaffold delete清理现有资源
    • 重新执行skaffold dev --force,强制重新构建镜像并部署,避免缓存导致的资源不同步
  5. 修正NATS连接协议

    • NATS客户端标准连接协议为nats://而非http://,将expiration-depl.yaml中NATS_URL的值改为nats://nats-srv:4222,重新部署后验证连接

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:42:18