Kubernetes下配置SPRING_CLOUD_CONFIG_URI网关报unknown host错误
问题根因
你两个Deployment都配置了hostNetwork: true,该参数会让Pod直接复用所在宿主机的网络栈,不会接入K8s集群内部网络,自然无法使用集群内置的CoreDNS完成Service名称解析,所以网关容器里解析configuration服务名时报unknown host错误。
你能在浏览器访问http://configuration/actuator/,大概率是你本地设备的hosts文件手动配置了configuration对应K8s节点的IP,但K8s节点宿主机的hosts没有对应配置,Pod用宿主机DNS规则自然解析失败。
可行解决方案
方案1(推荐):关闭hostNetwork
没有特殊的宿主机端口占用需求时,直接删除两个Deployment spec.template.spec下的hostNetwork: true配置即可。Pod接入K8s集群网络后会自动使用集群DNS解析服务名,http://configuration:8888可正常访问,也符合K8s的常规使用规范。
方案2:必须保留hostNetwork时的处理方式
如果业务必须要用到hostNetwork,可任选以下一种方式解决:
- 给所有可能运行这两个Pod的K8s节点的
/etc/hosts添加映射:[配置服务所在节点IP] configuration,注意配置服务漂移到其他节点时要同步更新所有节点的hosts规则 - 直接修改网关Deployment的
SPRING_CLOUD_CONFIG_URI环境变量值为http://[配置服务所在节点IP]:8888,同样要注意配置服务节点变动后的IP更新问题 - 将
configurationService修改为NodePort/LoadBalancer类型,网关通过节点IP+NodePort/负载均衡IP访问配置服务
如果是为了让外部访问配置服务才开启的hostNetwork,更推荐用NodePort、Ingress这类标准的K8s服务暴露方式,既可以满足外部访问需求,又能保留集群内部的服务发现能力。
内容的提问来源于stack exchange,提问作者sg2000
相关产品推荐
相关产品推荐

