如何在(本地)kubernetes实例(天空dns运行正常)中导致DNS查找失败

时间:2017-06-15 00:12:34

标签: dns kubernetes

在ubuntu上,kubernetes中的本地向上群集似乎无法在依赖群集DNS时解析DNS查询。

设置

我正在运行一个ubuntu框,在本地向上集群中设置DNS的环境变量:

# env  | grep KUBE
KUBE_ENABLE_CLUSTER_DNS=true
KUBE_DNS_SERVER_IP=172.17.0.1

运行信息

天空似乎很开心:

I0615 00:04:13.563037 1 server.go:198] Skydns metrics enabled (/metrics:10055) I0615 00:04:13.563051 1 dns.go:147] Starting endpointsController I0615 00:04:13.563054 1 dns.go:150] Starting serviceController I0615 00:04:13.563125 1 logs.go:41] skydns: ready for queries on cluster.local. for tcp://0.0.0.0:10053 [rcache 0] I0615 00:04:13.563141 1 logs.go:41] skydns: ready for queries on cluster.local. for udp://0.0.0.0:10053 [rcache 0] I0615 00:04:13.589840 1 dns.go:264] New service: kubernetes I0615 00:04:13.589971 1 dns.go:462] Added SRV record &{Host:kubernetes.default.svc.cluster.local. Port:443 Priority:10 Weight:10 Text: Mail:false Ttl:30 TargetStrip:0 Group: Key:} I0615 00:04:14.063246 1 dns.go:171] Initialized services and endpoints from apiserver I0615 00:04:14.063267 1 server.go:129] Setting up Healthz Handler (/readiness) I0615 00:04:14.063274 1 server.go:134] Setting up cache handler (/cache) I0615 00:04:14.063288 1 server.go:120] Status HTTP port 8081

kube-proxy似乎很高兴:

I0615 00:03:53.448369 5706 proxier.go:864] Setting endpoints for "default/kubernetes:https" to [172.31.44.133:6443] I0615 00:03:53.545124 5706 controller_utils.go:1001] Caches are synced for service config controller I0615 00:03:53.545146 5706 config.go:210] Calling handler.OnServiceSynced() I0615 00:03:53.545208 5706 proxier.go:979] Not syncing iptables until Services and Endpoints have been received from master I0615 00:03:53.545125 5706 controller_utils.go:1001] Caches are synced for endpoints config controller I0615 00:03:53.545224 5706 config.go:110] Calling handler.OnEndpointsSynced() I0615 00:03:53.545274 5706 proxier.go:309] Adding new service port "default/kubernetes:https" at 10.0.0.1:443/TCP I0615 00:03:53.545329 5706 proxier.go:991] Syncing iptables rules I0615 00:03:53.993514 5706 proxier.go:991] Syncing iptables rules I0615 00:03:54.008738 5706 bounded_frequency_runner.go:221] sync-runner: ran, next possible in 0s, periodic in 30s I0615 00:04:24.008904 5706 proxier.go:991] Syncing iptables rules I0615 00:04:24.023057 5706 bounded_frequency_runner.go:221] sync-runner: ran, next possible in 0s, periodic in 30s

结果

但是,我似乎无法解决集群内的任何问题,与docker exec或kube exec的结果相同:

➜  kubernetes git:(master) kc exec --namespace=kube-system kube-dns-2673147055-4j6wm -- nslookup kubernetes.default.svc.cluster.local
Defaulting container name to kubedns.
Use 'kubectl describe pod/kube-dns-2673147055-4j6wm' to see all of the 
containers in this pod.
nslookup: can't resolve '(null)': Name does not resolve
nslookup: can't resolve 'kubernetes.default.svc.cluster.local': Name does not resolve

问题

什么是最简单的方法来进一步调试使用本地向上群集创建的系统,其中DNS pod正在运行,但kubernetes.default.svc.cluster.local未解决?请注意,此群集的所有其他方面似乎都运行良好。

系统信息:Linux ip-172-31-44-133 4.4.0-1018-aws#27-Ubuntu SMP Fri May 19 17:20:58 UTC 2017 x86_64 x86_64 x86_64 GNU / Linux。

放在我的容器中的resolv.conf示例......

/etc/cfssl # cat /etc/resolv.conf
nameserver 172.17.0.1
search default.svc.cluster.local svc.cluster.local cluster.local dc1.lan
options ndots:5  

2 个答案:

答案 0 :(得分:1)

我无法对您的帖子发表评论,所以我会尝试回复此问题。

首先,某些阿尔卑斯山图像have trouble resolving using nslookup。事实上,DNS可能在您的群集中正常运行。

要验证这一点,请阅读与kube-apiserver通信的pod的日志(例如traefik,heapster,calico)。如果没有观察到任何错误,你所拥有的可能是一个无问题。

如果您想要倍加肯定,请部署非Alpine吊舱并尝试nslookup

如果它确实是DNS问题,我将按此顺序进行调试。

  1. kubectl exec进入kube-dns pod。运行nslookup kubernetes.default.svc.cluster.local localhost。如果这样做,DNS实际上正在运行。如果它没有,kube-dns现在应该已进入CrashLoopbackOff状态。
  2. kubectl exec到已部署的广告连播中。运行nslookup kubernetes.default.svc.cluster.local <cluster-ip>。如果这样可行,那么你很高兴。如果它没有,那么pod网络就会出现问题。如果没有详细信息,我建议不要采取进一步措施。
  3. Bonne chance!

答案 1 :(得分:0)

我想我会发布一个通常适合我的系统答案。我希望有更优雅的东西,这不是理想的,但我认为这是最好的起点。

1)确保您的DNS保姆和SkyDNS正在运行。保姆和天空DNS应该在他们的docker日志中显示他们已经绑定到端口。

2)当您创建新服务时,请确保SkyDNS正在将它们写入日志并显示SRV的创建等。

3)查看docker容器中的/etc/resolv.conf。确保名称服务器看起来像你的内部docker IP地址(即Fedora上的常规docker0配置中的10 ....)

您需要正确导出特定的env变量:API_HOST = true且KUBE_ENABLE_CLUSTER_DNS = true。

您可以使用更多更深层次的工具,例如route -n等来调试容器网络,但本地群集通常应该只是工作&#39;如果上面的步骤表明某些东西是可疑的,那么在kubernetes社区中值得一提的可能是一个错误。