Kubernetes Kubelet说DNS没有设置MissingClusterDNS(SkyDNS)

时间:2016-06-21 16:08:41

标签: dns kubernetes skydns

我已经在3分钟/主人(1个主人/小兵,2个小兵)上安装了Kubernetes 1.2.4并安装了SkyDNS插件。在修复SSL证书问题后,我知道SkyDNS正在运行。但是kubeletes仍然说我没有设置cluster-dns和cluster-domain。

(见底部的编辑)

但你可以看到--cluster-dns=192.168.0.10 --cluster-domain=cluster.local

ps ax | grep kubelet
18717 ?        Ssl    0:04 /opt/kubernetes/bin/kubelet --logtostderr=true --v=0 --address=0.0.0.0 --port=10250 --hostname-override=k8s-minion-1 --api-servers=http://k8s-master:8080 --allow-privileged=false  --cluster-dns=192.168.0.10 --cluster-domain=cluster.local 

启动此广告连播:

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - image: busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always

我明白了:

kubectl describe pod busybox
7m      7m      2   {kubelet k8s-master.XXX}                    Warning     MissingClusterDNS   kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.

我在启动此pod之前重新启动了kubelete服务,而且我没有其他pod正在运行。

如果我使用" - dns"启动docker容器选项:

docker run --rm -it --dns 192.168.0.10 busybox nslookup cluster.local
Server:    192.168.0.10
Address 1: 192.168.0.10

Name:      cluster.local
Address 1: 192.168.0.10
Address 2: 172.16.50.2
Address 3: 192.168.0.1
Address 4: 172.16.96.3


docker run --rm -it --dns 192.168.0.10 busybox cat /etc/resolv.conf
search XXX YYYY 
nameserver 192.168.0.10

那绝对正常(我隐藏了我的客户dns)

但是pod说了别的话:

kubectl exec busybox -- nslookup cluster.local
Server:    XXX.YYY.XXX.YYY
Address 1: XXX.YYYY.XXXX.YYY XXX.domain.fr

nslookup: can't resolve 'cluster.local'
error: error executing remote command: Error executing command in container: Error executing in Docker Container: 1

我试着设置" - dns" docker守护程序的选项,但错误是相同的。

查看日志:

kubectl get  pods --namespace=kube-system
NAME                 READY     STATUS    RESTARTS   AGE
kube-dns-v11-osikn   4/4       Running   0          13m

kubectl logs kube-dns-v11-osikn kube2sky --namespace=kube-system
I0621 15:44:48.168080       1 kube2sky.go:462] Etcd server found: http://127.0.0.1:4001
I0621 15:44:49.170404       1 kube2sky.go:529] Using https://192.168.0.1:443 for kubernetes master
I0621 15:44:49.170422       1 kube2sky.go:530] Using kubernetes API <nil>
I0621 15:44:49.170823       1 kube2sky.go:598] Waiting for service: default/kubernetes
I0621 15:44:49.209691       1 kube2sky.go:660] Successfully added DNS record for Kubernetes service.

&#34;使用kubernetes API <nil>&#34;是一个问题,不是吗? 编辑:我在pod中强制使用kube-master-url让kube2sky联系主人。

kubectl logs kube-dns-v11-osikn skydns --namespace=kube-system
2016/06/21 15:44:50 skydns: falling back to default configuration, could not read from etcd: 100: Key not found (/skydns/config) [10]
2016/06/21 15:44:50 skydns: ready for queries on cluster.local. for tcp://0.0.0.0:53 [rcache 0]
2016/06/21 15:44:50 skydns: ready for queries on cluster.local. for udp://0.0.0.0:53 [rcache 0]

请注意:

kubectl get pods --all-namespaces 
NAMESPACE     NAME                 READY     STATUS    RESTARTS   AGE
default       busybox              1/1       Running   0          17m
kube-system   kube-dns-v11-osikn   4/4       Running   0          18m

所以我对skydns没有任何问题。

我确定问题来自kubelet,我尝试删除/ var / lib / kubelet并重新启动整个群集。我也尝试在安装dns之前和之后重启kubelete服务。我更改了docker配置,删除了&#34; - dns&#34;选项afterward,我有相同的行为:Docker + dns没问题,Kubelet给出了一个MissingClusterDNS错误,说kubelet没有配置群集dns。

所以请...帮助(再一次:))

编辑: - 现在kube2sky并没有抱怨<nil> api版强制kube2sky选项 - 我可以强迫nslookup使用我的天空DNS:

kubectl exec busybox -- nslookup kubernetes.default.svc.cluster.local 192.168.0.10
Server:    192.168.0.10
Address 1: 192.168.0.10

Name:      kubernetes.default.svc.cluster.local
Address 1: 192.168.0.1

但是&#34; MissingClusterDNS&#34;在pod创建时仍然存在错误,就好像kubelet没有启动选项&#34; - cluster-dns&#34;和&#34; - cluster-domain&#34;

@Brendan Burns:

kubectl get services --namespace=kube-system
NAME       CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
kube-dns   192.168.0.10   <none>        53/UDP,53/TCP   12m

2 个答案:

答案 0 :(得分:2)

我终于解决了我的问题...对我感到羞耻(或没有)。

我已经采取了kubelet来源了解发生了什么,现在我找到了。

在&#34; kubelet&#34;文件,我设置:

10.10.0.10 --cluster-domain=cluster.local

我在源代码中添加的日志表示&#34; cluster-dns&#34;选项为此值:

systemctl daemon-reload; systemctl restart kubelet

这主要是因为配置文件被SystemD解释为&#34; bash环境vars&#34;所以KUBE_ARGS是&#34;一个参数&#34;,并且它被kubelet服务严重解析。

解决方案是将变量拆分为两个并更改kubelet.service文件以使用变量。致电{{1}}后一切正常。

我在这里打开了一个问题:https://github.com/kubernetes/kubernetes/issues/27722我解释说示例配置文件中的注释是不明确的和/或参数未按预期解析。

答案 1 :(得分:0)

您是否使用正确的IP地址创建了DNS服务?

kubectl get services --namespace=kube-system显示什么?