多容器Kubernetes Pod内NATS服务连接失败问题求助
同Pod内应用无法连接NATS服务问题解决
问题背景
我正在将之前以独立Pod运行的多个Kubernetes服务整合到同一个Pod中,以此降低跨节点通信带来的系统延迟(服务间数据传输量大,跨节点通信是主要延迟来源)。我将NATS镜像加入Deployment的容器配置,具体如下:
--- apiVersion: apps/v1 kind: Deployment metadata: name: vei-deployment spec: replicas: 1 selector: matchLabels: app: camera-system template: metadata: labels: app: camera-system spec: containers: - name: application image: image1:latest - name: application2 image: image2:latest - name: application3 image: image3:latest - name: nats image: nats
使用Golang编写的Application 1尝试连接NATS,代码如下:
//start a new connection with NATS var nc, err = nats.Connect("nats://nats:4222") if err != nil { panic(err) } defer nc.Close()
但系统无法连接NATS,抛出错误:panic: dial tcp: lookup nats on 10.43.0.10:53: no such host,尽管NATS日志显示运行正常。
解决方法
方法一:直接使用localhost访问(推荐)
同Pod内的所有容器共享同一个网络命名空间,无需通过DNS解析容器名称,直接用localhost即可访问同Pod内的NATS服务:
修改Application 1的连接代码,将地址改为nats://localhost:4222:
//start a new connection with NATS var nc, err = nats.Connect("nats://localhost:4222") if err != nil { panic(err) } defer nc.Close()
方法二:添加hostAliases映射容器名称(可选)
如果坚持要使用容器名称nats访问,可以在Pod的spec中添加hostAliases配置,手动将nats映射到本地回环地址:
--- apiVersion: apps/v1 kind: Deployment metadata: name: vei-deployment spec: replicas: 1 selector: matchLabels: app: camera-system template: metadata: labels: app: camera-system spec: hostAliases: - ip: "127.0.0.1" hostnames: - "nats" containers: - name: application image: image1:latest - name: application2 image: image2:latest - name: application3 image: image3:latest - name: nats image: nats
原因说明
Kubernetes集群的DNS服务默认只负责解析集群内的Service资源,不会处理同Pod内的容器名称解析。而Pod内的所有容器共享同一网络栈,因此使用localhost是最直接、高效的同Pod内容器通信方式。
内容的提问来源于stack exchange,提问作者Johnney
相关产品推荐
相关产品推荐

