Kubernetes Kubelet 表示未使用 MissingClusterDNS (SkyDNS) 设置 DNS
Kubernetes Kubelet says that DNS is not set with MissingClusterDNS (SkyDNS)
我已经在 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
启动此广告连播:
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 守护程序设置“--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.
"Using kubernetes API <nil>
" 是个问题,不是吗?
编辑:我强制 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 不会抱怨 <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
但是 "MissingClusterDNS" 错误仍然存在于创建 Pod 时,好像 kubelet 没有启动选项“--cluster-dns”和“--cluster-domain”
@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
您是否使用正确的 IP 地址创建了 DNS 服务?
kubectl get services --namespace=kube-system
显示什么?
我终于解决了我的问题...我感到羞耻(或没有)。
我已经使用 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 environment vars"所以KUBE_ARGS是"one argument",并且它被kubelet服务解析得很糟糕
解决方案是将变量一分为二并更改 kubelet.service 文件以使用变量。调用 systemctl daemon-reload; systemctl restart kubelet
后一切正常。
我在这里提出了一个问题:https://github.com/kubernetes/kubernetes/issues/27722 我在其中解释了示例配置文件中的注释不明确 and/or 参数未按预期解析。
我已经在 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
启动此广告连播:
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 守护程序设置“--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.
"Using kubernetes API
编辑:我强制 pod 中的 kube-master-url 让 kube2sky 联系主服务器。<nil>
" 是个问题,不是吗?
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 不会抱怨 <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
但是 "MissingClusterDNS" 错误仍然存在于创建 Pod 时,好像 kubelet 没有启动选项“--cluster-dns”和“--cluster-domain”
@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
您是否使用正确的 IP 地址创建了 DNS 服务?
kubectl get services --namespace=kube-system
显示什么?
我终于解决了我的问题...我感到羞耻(或没有)。
我已经使用 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 environment vars"所以KUBE_ARGS是"one argument",并且它被kubelet服务解析得很糟糕
解决方案是将变量一分为二并更改 kubelet.service 文件以使用变量。调用 systemctl daemon-reload; systemctl restart kubelet
后一切正常。
我在这里提出了一个问题:https://github.com/kubernetes/kubernetes/issues/27722 我在其中解释了示例配置文件中的注释不明确 and/or 参数未按预期解析。