MySQL 与 kubernetes 集群集成的 DNS 错误
DNS error with MySQL integration with kubernetes cluster
发生了什么:
我正在尝试使用 externalName
规范创建服务端点,以允许 pods 内的微服务 运行 访问本地主机上的本地 MySQL 服务器。
这是 yaml 文件的相关部分:
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: default
spec:
type: ExternalName
externalName: host.minikube.internal
你预期会发生什么:
我希望能够连接,但我的 SpringBoot 容器显示 mysql 连接不工作。我已经测试了微服务,它在 Docker 中使用相同的 MySQL 数据库工作。
如何重现它(尽可能精简和精确):
正常安装 minikube 和 kubernetes,运行 来自 https://k8s.io/examples/admin/dns/dnsutils.yaml 的 dnsutils
镜像和上面给出的 mysql 服务。
还有什么我们需要知道的吗?:
我已经测试了这里详述的故障排除 (https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/),但它没有解决问题。当运行:
kubectl exec -i -t dnsutils -- nslookup mysql.default
我收到以下消息:
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
已安装并且 运行:
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
环境:
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"}
云提供商或硬件配置:
本地 Windows 10 Pro x64 运行 带有 Minikube 的 Kubernetes
OS(例如: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 minikube 4.19.150 #1 SMP Fri Nov 6 15:58:07 PST 2020 x86_64 GNU/Linux
安装工具:使用相关的kubectl和minikube.exe文件安装
网络插件和版本(如果这是与网络相关的错误):
其他:
此问题似乎与 github 中描述的 Minikube
issue 密切相关。
您可以看到,在 /etc/hosts
文件中的 Pod
- 没有任何 host.minikube.internal
条目:
$ kubectl exec -it dnsutils -- cat /etc/hosts | grep "host.minikube.internal"
$
在 Minikube
主机上,您可以访问 host.minikube.internal
,因为 Minikube
(版本 v1.10+)添加了此 hostname
进入 /etc/hosts
文件。您可以在 Host access | minikube.
中找到更多信息
这是我的 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
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
我认为在某些情况下可能有用的唯一解决方法是将 hostAliases
添加到 Deployment
/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
...
发生了什么:
我正在尝试使用 externalName
规范创建服务端点,以允许 pods 内的微服务 运行 访问本地主机上的本地 MySQL 服务器。
这是 yaml 文件的相关部分:
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: default
spec:
type: ExternalName
externalName: host.minikube.internal
你预期会发生什么:
我希望能够连接,但我的 SpringBoot 容器显示 mysql 连接不工作。我已经测试了微服务,它在 Docker 中使用相同的 MySQL 数据库工作。
如何重现它(尽可能精简和精确):
正常安装 minikube 和 kubernetes,运行 来自 https://k8s.io/examples/admin/dns/dnsutils.yaml 的 dnsutils
镜像和上面给出的 mysql 服务。
还有什么我们需要知道的吗?:
我已经测试了这里详述的故障排除 (https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/),但它没有解决问题。当运行:
kubectl exec -i -t dnsutils -- nslookup mysql.default
我收到以下消息:
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
已安装并且 运行:
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
环境:
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"}
云提供商或硬件配置:
本地 Windows 10 Pro x64 运行 带有 Minikube 的 Kubernetes
OS(例如: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 minikube 4.19.150 #1 SMP Fri Nov 6 15:58:07 PST 2020 x86_64 GNU/Linux
安装工具:使用相关的kubectl和minikube.exe文件安装 网络插件和版本(如果这是与网络相关的错误):
其他:
此问题似乎与 github 中描述的 Minikube
issue 密切相关。
您可以看到,在 /etc/hosts
文件中的 Pod
- 没有任何 host.minikube.internal
条目:
$ kubectl exec -it dnsutils -- cat /etc/hosts | grep "host.minikube.internal"
$
在 Minikube
主机上,您可以访问 host.minikube.internal
,因为 Minikube
(版本 v1.10+)添加了此 hostname
进入 /etc/hosts
文件。您可以在 Host access | minikube.
这是我的 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
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
我认为在某些情况下可能有用的唯一解决方法是将 hostAliases
添加到 Deployment
/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
...