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-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
...
知道如何让它正常工作吗?
对于 ExternalName service type,externalName
应该是 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
我正在尝试通过 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-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
在这个
> 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 type,externalName
应该是 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