Mac Minikube 中 ExternalName 的 DNS 解析

DNS resolution of ExternalName in Minikube on Mac

我正在尝试通过 virtualbox 中的 minikube 设置连接到 mac 中 docker 中的 postgres 容器 运行。但是我 运行 进入 dns 解决问题。

我 运行 postgres 作为 docker

上的容器
> 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 是主机接口的别名(找到此信息 here

> 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-svcpostgres-svc.hazelnut.svc.cluster.localpostgres-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
...

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

对于 ExternalName service typeexternalName 应该是 FQDN,而不是 IP 地址,例如

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

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

10.0.0.2    mydb.mytestdomain

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

测试: MacOS 10.14.3, 垂直盒 6.0.10, 库伯内特斯 1.15.0, 迷你库1.2.0, coredns