【问题标题】:Kubernetes Kubelet says that DNS is not set with MissingClusterDNS (SkyDNS)Kubernetes Kubelet 说 DNS 没有设置 MissingClusterDNS (SkyDNS)
【发布时间】:2016-10-23 07:11:50
【问题描述】:

我在 3 minons/master(1 个 master/minion,2 个 minions)上安装了 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 

启动这个 pod:

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

我尝试为 docker daemon 设置“--dns”选项,但错误是一样的。

查看日志:

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.

“使用 kubernetes API &lt;nil&gt;”是个问题,不是吗? 编辑:我强制 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 配置,之后删除了“--dns”选项,我得到了相同的行为:Docker + dns 没问题,Kubelet 给出了一个 MissingClusterDNS 错误,说 kubelet 没有配置集群 dns。

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


编辑: - 现在 kube2sky 不会抱怨 &lt;nil&gt; 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

但是“MissingClusterDNS”错误仍然存​​在于创建 pod 时,好像 kubelet 没有启动选项“--cluster-dns”和“--cluster-domain”

@布伦丹·伯恩斯:

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

【问题讨论】:

    标签: dns kubernetes skydns


    【解决方案1】:

    我终于解决了我的问题……真丢脸(或不丢脸)。

    我使用 kubelet 资源来了解发生了什么,现在我发现了。

    在“kubelet”文件中,我设置了:

    KUBE_ARGS="--cluster-dns=10.10.0.10 --cluster-domain=cluster.local"
    

    我在源代码中添加的日志说“cluster-dns”选项作为这个值:

    10.10.0.10 --cluster-domain=cluster.local
    

    这主要是因为配置文件被 SystemD 解释为“bash 环境变量”,因此 KUBE_ARGS 是“一个参数”,并且被 kubelet 服务解析错误。

    解决方案是将变量一分为二,并将 kubelet.service 文件更改为使用 vars。致电systemctl daemon-reload; systemctl restart kubelet 后一切正常。

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

    【讨论】:

    • 嘿,我也有同样的问题,但是拆分 vars 并重新启动 kubelet 服务对我不起作用` ${KUBELET_DNS} \ ${KUBELET_DOMAIN} `
    • 您能在此处打开一个新讨论并将其链接吗?我去看看。
    • 我用上述解决方案以某种方式修复了它。我当前的配置看起来像这样 KUBELET_DNS=--cluster-dns={{ cluster_dns }} KUBELET_DOMAIN=--cluster-domain=cluster.local 我认为问题是我在“=”符号和模板变量之间留了一个空格。
    • 是的。环境文件是 bash。所以等号后不允许有空格。 Glade 你找到了解决方案
    【解决方案2】:

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

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

    【讨论】:

    • 如您所见,ip地址为dns的docker命令有效。我现在不在办公室,但明天我会给你答案。感谢您的帮助。
    • 该命令返回正确的 DNS 地址 - 我刚刚在 KVM 上的 3 centos 上本地完成了整个安装。
    • 我添加了命令输出,DNS IP 没问题 - 你可以看到编辑
    • 就我而言,我使用的是 microk8s。我在 microk8s 版本 1.14 上“部署”弹性搜索期间遇到了这个问题。要回答,kubectl get services --namespace=kube-system 不返回任何结果。
    猜你喜欢
    • 2016-10-22
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 2019-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    相关资源
    最近更新 更多