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();
排查步骤
检查集群DNS服务状态
- 执行
kubectl get pods -n kube-system,确认coredns(或kube-dns)Pod处于Running状态 - 若DNS Pod异常,执行
kubectl rollout restart deployment coredns -n kube-system重启服务
- 执行
验证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需确保服务存在于对应空间)
- 进入expiration Pod:
检查服务与后端Pod的关联
- 查看nats-srv服务详情:
kubectl describe service nats-srv,确认Endpoints字段有对应的NATS Pod IP - 若Endpoints为空,检查NATS Pod状态:
kubectl get pods -l app=nats,确认Pod处于Running且标签与服务selector匹配
- 查看nats-srv服务详情:
重置Skaffold部署缓存
- 停止当前
skaffold dev进程,执行skaffold delete清理现有资源 - 重新执行
skaffold dev --force,强制重新构建镜像并部署,避免缓存导致的资源不同步
- 停止当前
修正NATS连接协议
- NATS客户端标准连接协议为
nats://而非http://,将expiration-depl.yaml中NATS_URL的值改为nats://nats-srv:4222,重新部署后验证连接
- NATS客户端标准连接协议为
内容的提问来源于stack exchange,提问作者Endri Bida
相关产品推荐
相关产品推荐

