MySQL 与 kubernetes 集群集成时出现 DNS 错误

Jui*_*uin 5 kubernetes minikube coredns

发生了什么:
我尝试使用externalName规范创建一个服务端点,以允许在 Pod 内运行的微服务访问本地主机上的本地 MySQL 服务器。

这是 yaml 文件的相关部分:

apiVersion: v1 
kind: Service 
metadata: 
  name: mysql 
  namespace: default 
spec: 
  type: ExternalName 
  externalName: host.minikube.internal
Run Code Online (Sandbox Code Playgroud)

您期望发生的情况:
我希望能够连接,但我的 SpringBoot 容器显示 mysql 连接不起作用。我已经测试了微服务,它可以在 Docker 中使用相同的 MySQL 数据库运行。

如何重现它(尽可能少且精确):
正常安装 minikube 和 kubernetes,使用上面给出的 mysql 服务运行https://k8s.io/examples/admin/dns/dnsutils.yamldnsutils中的映像。

我们还需要知道什么吗?:
我已经测试了此处详细的故障排除(https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/),但它没有解决问题。运行时:

kubectl exec -i -t dnsutils -- nslookup mysql.default
Run Code Online (Sandbox Code Playgroud)

我收到以下消息:

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
Run Code Online (Sandbox Code Playgroud)

我已经验证它CoreDNS已安装并正在运行:

NAME READY STATUS RESTARTS AGE
coredns-f9fd979d6-z58cr 1/1 Running 0 31m
Run Code Online (Sandbox Code Playgroud)

端点暴露:

NAME ENDPOINTS AGE
kube-dns 172.17.0.2:53,172.17.0.2:53,172.17.0.2:9153 32m
Run Code Online (Sandbox Code Playgroud)

我的/etc/resolv.conf只有一项:

nameserver 192.168.53.145
Run Code Online (Sandbox Code Playgroud)

环境:

Kubernetes 版本(使用 kubectl 版本):

Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:59:43Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"windows/amd64"}

Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.4", GitCommit:"d360454c9bcd1634cf4cc52d1867af5491dc9c5f", GitTreeState:"clean", BuildDate:"2020-11-11T13:09:17Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"linux/amd64"}
Run Code Online (Sandbox Code Playgroud)

云提供商或硬件配置:
运行带有 Minikube OS 的 Kubernetes 的本地 Windows 10 Pro x64(例如:cat /etc/os-release):
NAME=Buildroot VERSION=2020.02.7 ID=buildroot VERSION_ID=2020.02.7 PRETTY_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):

其他的:

mat*_*t_j 4

这个问题似乎与github上描述的Minikube 问题密切相关。

您可以看到,在Pod文件中/etc/hosts- 没有任何host.minikube.internal条目:

$ kubectl exec -it dnsutils -- cat /etc/hosts | grep "host.minikube.internal"
$
Run Code Online (Sandbox Code Playgroud)

Minikube您能够访问的主机上host.minikube.internal,因为Minikube(版本v1.10+)将此hostname条目添加到/etc/hosts文件中。您可以在主机访问 |中找到更多信息。迷你库贝

这是我的示例Minikube(我正在使用 docker 驱动程序):

user@minikube:~$ kubectl exec -it dnsutils -- cat /etc/hosts | grep "host.minikube.internal"
user@minikube:~$
user@minikube:~$ minikube ssh
docker@minikube:~$ cat /etc/hosts | grep host.minikube.internal 
192.168.49.1    host.minikube.internal
docker@minikube:~$ ping host.minikube.internal
PING host.minikube.internal (192.168.49.1) 56(84) bytes of data.
64 bytes from host.minikube.internal (192.168.49.1): icmp_seq=1 ttl=64 time=0.075 ms
64 bytes from host.minikube.internal (192.168.49.1): icmp_seq=2 ttl=64 time=0.067 ms
Run Code Online (Sandbox Code Playgroud)

host.minikube.internal只是文件中的条目/etc/hosts,因此nslookup无法正确解析它(nslookup查询名称服务器。)。

docker@minikube:~$ nslookup host.minikube.internal
Server:         192.168.49.1
Address:        192.168.49.1#53

** server can't find host.minikube.internal: NXDOMAIN
Run Code Online (Sandbox Code Playgroud)

我认为在某些情况下可能有帮助的唯一解决方法是添加hostAliasesDeployment/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
...
Run Code Online (Sandbox Code Playgroud)