首页 > 解决方案 > Mac 上 Minikube 中 ExternalName 的 DNS 解析

问题描述

我正在尝试从 virtualbox 中的 minikube 设置连接到我的 mac 上的 docker 中运行的 postgres 容器。但是我遇到了dns解决问题。

我在 docker 上将 postgres 作为容器运行

> docker ps                                                                                                                                                                                                                                                                                   
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
a794aca3a6dc        postgres            "docker-entrypoint.s…"   3 days ago          Up 3 days           0.0.0.0:5432->5432/tcp   postgres

在我的 Mac / VirtualBox / Minikube 设置上,我创建了一个服务

kind: Service
apiVersion: v1
metadata:
  name: postgres-svc
spec:
  type: ExternalName
  externalName: 10.0.2.2
  ports:
    - port: 5432

10.0.2.2是主机接口的别名(在此处找到此信息)

> kubectl get service --all-namespaces
NAMESPACE     NAME                                             TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
default       kubernetes                                       ClusterIP      10.96.0.1        <none>        443/TCP                  21d
hazelnut      postgres-svc                                     ExternalName   <none>           10.0.2.2      5432/TCP                 27m
kube-system   kube-dns                                         ClusterIP      10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP   21d
kube-system   kubernetes-dashboard                             ClusterIP      10.108.181.235   <none>        80/TCP                   19d
kube-system   tiller-deploy                                    ClusterIP      10.101.218.56    <none>        44134/TCP                20d

(我们的命名空间是hazelnut,不要问:-)

在我的部署中,如果我直接连接到 10.0.2.2,它会毫无问题地连接到 postgres,但是如果我尝试解析 kubernetes 服务的主机名,它就不起作用。所以这不是防火墙或路由问题,纯 dns。

我试过postgres-svc.hazelnut.cluster.local, postgres-svc, postgres-svc.hazelnut.svc.cluster.local,postgres-svc.hazelnut都导致 NXDOMAIN

kubernetes.default虽然有效。

> nslookup kubernetes.default
Server:     10.96.0.10
Address:    10.96.0.10#53

Name:   kubernetes.default.svc.cluster.local
Address: 10.96.0.1

在这篇文章中,他们提到使用 kube-dns 应该可以解决它,但我正在使用它并无济于事

> kubectl get svc --namespace=kube-system
NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
kube-dns               ClusterIP   10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP   21d
...

知道如何让它正常工作吗?

标签: macoskubernetesdnsminikubekube-dns

解决方案


对于ExternalName 服务类型externalName应该是 FQDN,而不是 IP 地址,例如

kind: Service
...
metadata:
  name: postgres-svc
spec:
  type: ExternalName
  externalName: mydb.mytestdomain

主机应该能够解析该 FQDN 的名称。您可以/etc/hosts在 Mac 主机上添加一条记录来实现:

10.0.0.2    mydb.mytestdomain

实际上,coredns 使用/etc/resolv.confMinikube VM 中配置的名称解析器。它指向 VirtualBox NAT 网络 (10.0.2.3) 中的名称解析器。反过来,VirtualBox 依赖于查看本地/etc/hosts文件的主机名解析机制。

测试:MacOS 10.14.3、VBox 6.0.10、kubernetes 1.15.0、minikube 1.2.0、coredns


推荐阅读