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 minikube
4.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直接连接到它。