使用minikube运行微服务示例时出现DNS解析错误该如何解决
原因说明
- 本次报错不属于Kubernetes集群内部的DNS异常,是minikube内置Docker daemon执行镜像构建阶段的DNS解析失败:你手动修改minikube节点的
/etc/resolv.conf会被重置,是因为minikube默认每次启动时都会从宿主机同步DNS配置,且Docker daemon的DNS配置是独立管理的,不会直接读取节点的resolv.conf文件。 - 报错中的10.0.2.3是VirtualBox/Hyperkit NAT网络的默认网关DNS地址,Docker构建时用该地址无法正常解析alpine软件源的公网域名,导致apk无法拉取git安装包。
解决方案
- 方案一(推荐,永久生效):重建minikube实例时直接指定Docker的DNS配置
先删除现有实例:minikube delete
重新启动时添加DNS参数:minikube start --docker-opt dns=8.8.8.8 --docker-opt dns=114.114.114.114
启动完成后重新执行skaffold run即可。 - 方案二(无需重建实例):直接修改minikube内Docker的配置
进入minikube节点终端:minikube ssh
编辑Docker daemon配置文件:sudo vi /etc/docker/daemon.json
写入如下配置:
重启Docker服务生效:{ "dns": ["8.8.8.8", "114.114.114.114"] }sudo systemctl restart docker
退出节点终端后重新执行skaffold run即可。 - 方案三(临时生效):执行skaffold时指定构建用的DNS参数
直接运行命令:skaffold run --docker-build-opt="dns=8.8.8.8"
minikube/Kubernetes DNS运行机制
- minikube节点层DNS:minikube启动时默认会读取宿主机的DNS配置写入节点的
/etc/resolv.conf,如果使用NAT网络会默认添加NAT网关DNS地址10.0.2.3,每次重启minikube都会重写该文件,因此手动修改会失效。 - Docker构建层DNS:minikube内置的Docker daemon默认继承节点的DNS配置,也可通过启动参数单独指定,Docker构建镜像过程中的所有网络请求都使用该DNS配置解析,和后续Pod运行时的DNS配置无关。
- Kubernetes集群内部DNS:集群运行Pod时默认使用CoreDNS作为服务发现的DNS组件,Pod的
/etc/resolv.conf默认指向CoreDNS的Service地址,CoreDNS负责解析集群内部的服务域名,公网域名则会转发给上游DNS(即minikube节点配置的DNS地址)。
内容的提问来源于stack exchange,提问作者trebi
相关产品推荐
相关产品推荐

