MySQL与kubernetes群集集成时出现DNS错误
发生了什么:MySQL与kubernetes群集集成时出现DNS错误,kubernetes,minikube,coredns,Kubernetes,Minikube,Coredns,发生了什么: 我正在尝试使用externalName规范创建一个服务端点,以允许在POD中运行的微服务访问本地主机上的本地MySQL服务器 这是yaml文件的相关部分: apiVersion: v1 kind: Service metadata: name: mysql namespace: default spec: type: ExternalName externalName: host.minikube.internal 您预期会发生什么: 我希望能够连接
我正在尝试使用
externalName
规范创建一个服务端点,以允许在POD中运行的微服务访问本地主机上的本地MySQL服务器
这是yaml文件的相关部分:apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: default
spec:
type: ExternalName
externalName: host.minikube.internal
您预期会发生什么:我希望能够连接,但我的SpringBoot容器显示mysql连接不起作用。我已经测试了微服务,它在Docker中使用相同的MySQL数据库 如何复制它(尽可能少且精确):
正常安装minikube和kubernetes,使用上面给出的mysql服务从运行
dnsutils
映像
还有什么我们需要知道的吗?:我已经测试了此处详述的故障排除()但没有解决问题。运行时:
kubectl exec -i -t dnsutils -- nslookup mysql.default
NAME READY STATUS RESTARTS AGE
coredns-f9fd979d6-z58cr 1/1 Running 0 31m
我收到以下消息:Server: 10.96.0.10
Address: 10.96.0.10#53
mysql.default.svc.cluster.local canonical name = host.minikube.internal.
** server can't find host.minikube.internal: SERVFAIL
command terminated with exit code 1
我已验证CoreDNS
是否已安装并正在运行:kubectl exec -i -t dnsutils -- nslookup mysql.default
NAME READY STATUS RESTARTS AGE
coredns-f9fd979d6-z58cr 1/1 Running 0 31m
端点已公开:NAME ENDPOINTS AGE
kube-dns 172.17.0.2:53,172.17.0.2:53,172.17.0.2:9153 32m
我的/etc/resolv.conf
只有一个条目:nameserver 192.168.53.145
$ kubectl exec -it dnsutils -- cat /etc/hosts | grep "host.minikube.internal"
$
环境:
Kubernetes版本(使用kubectl版本):
云提供商或硬件配置:运行Kubernetes和Minikube的本地Windows 10 Pro x64 操作系统(例如:cat/etc/OS发行版):
NAME=Buildroot VERSION=2020.02.7 ID=Buildroot VERSION\u ID=2020.02.7 PRETTY\u NAME=“Buildroot 2020.02.7
”
内核(例如uname-a):Linux minikube4.19.150#1 SMP Fri Nov 6 15:58:07 PST 2020 x86_64 GNU/Linux
安装工具:使用相关的kubectl和minikube.exe文件安装
网络插件和版本(如果这是与网络相关的bug):
其他:这个问题似乎与github上描述的
Minikube
密切相关
您可以看到,在/etc/hosts
文件中的Pod
中,没有任何host.minikube.internal
条目:nameserver 192.168.53.145
$ kubectl exec -it dnsutils -- cat /etc/hosts | grep "host.minikube.internal"
$
在Minikube
主机上,您可以访问host.Minikube.internal
,因为Minikube
(版本v1.10+)将此主机名
条目添加到/etc/hosts
文件中。您可以在中找到更多信息
这是我的Minikube
(我正在使用docker驱动程序)中的示例:host.minikube.internal
只是/etc/hosts
文件中的条目,因此nslookup
无法正确解析它(nslookup
查询名称服务器仅)
在某些情况下,我认为唯一有帮助的解决方法是将主机别名添加到部署/Pod
清单文件中:
...
spec:
hostAliases:
- ip: "192.168.49.1" # minikube IP
hostnames:
- "host.minikube.internal" # one or more hostnames that should resolve to the above address
containers:
- name: dnsutils
image: gcr.io/kubernetes-e2e-test-images/dnsutils:1.3
...
上描述了一个已知问题。我将在一分钟内进一步解释。@Juin这是否回答了您的问题?@WytrzymałyWiktor我尝试使用HostAlias,但也无法解决。我在网上读到,有些人在这方面取得了成功,而有些人却没有。怀疑这可能是一个bug,并将其添加到GitHub线程中!但就目前而言,HostAlias可能是为其工作的用户提供临时修复的最佳解决方案。接受这个答案,因为这是目前最可行的解决方案。否则,另一个选项是运行MySQL pod并添加服务定义以连接到它。要从本地环境访问它,可以使用负载平衡器端点公开它,并在运行minikube隧道时使用MYSQL workbench直接连接到它。