kube-dns坑

k8s:v1.4.6

坑1

创建kube-dns的service时,需要手动指定一个cluster ip范围内的特定ip地址,但是我照做了之后,通过/etc/resolv.conf中配置servername xxx_ip执行kubectl exec -n kube-system -ti kube-dns-v20-xxxxx -c healthz -- nslookup kibana-logging.kube-system.svc.cluster.local发现不行。。。

于是尝试了下,把clusterip注释掉,让k8s集群自己分一个ip,通过dashboard查看分出来的ip,按照这个ip去配置就可以了。

还有一个奇怪的问题,按照目前理解来说,在node上的/etc/kubernetes/kubelet文件中配置了KUBELET_ARGS="--cluster-dns=172.17.26.52 --cluster-domain=cluster.local",宿主机的/etc/resolv.conf中的nameserver应该就会获取,但是没有。。

因为创建的pod内的容器内的/etc/resolv.conf文件中的内容是集成的宿主机的/etc/resolv.conf。

坑2

lexec-healthz是k8s提供的一种辅助容器,多用于side car模式中。它的原理是定期执行指定的Linux指令,从而判断当前Pod中关键容器的健康状态。在kube-dns中的作用就是通过nslookup指令检查DNS查询服务的健康状态,k8s livenessProbe通过访问exec-healthz提供的Http API了解健康状态,并在出现故障时重启容器。其源码位于https://github.com/kubernetes/contrib/tree/master/exec-healthz。

配置dns:创建name为kube-dns的rc,rc下会创建一个名称为kube-dns-v20-xxxxx的pod,该pod下有3个容器,kubedns、dnsmasq、healthz,

master节点执行(可以解析):

?. /home/kubernetes/cluster/addons/dns git:(e569a27) ?.>kubectl exec -n kube-system -ti kube-dns-v20-c2lgj -c healthz -- nslookup kibana-logging.kube-system.svc.cluster.local

Server:    172.17.26.52

Address 1: 172.17.26.52 kube-dns-back.kube-system.svc.cluster.local

Name:      kibana-logging.kube-system.svc.cluster.local

Address 1: 172.17.105.169 kibana-logging.kube-system.svc.cluster.local

但是通过dashboard查看healthz的日志,却是nslookup can't resolve  xxx。。。真无语,查看skydns-rc.yaml文件中的healthz的cmd参数,拿出来单独执行,

?. /home/kubernetes/cluster/addons/dns git:(e569a27) ?.>kubectl exec -n kube-system -ti kube-dns-v20-c2lgj -c healthz -- nslookup kibana-logging.kube-system.svc.cluster.local 127.0.0.1

Server:    127.0.0.1

Address 1: 127.0.0.1 localhost

Name:      kibana-logging.kube-system.svc.cluster.local

Address 1: 172.17.105.169 kibana-logging.kube-system.svc.cluster.local

是可以的。。。诡异了,不知道healthz的执行机制是什么鬼,我们在外面也是执行的它的cmd,在外面执行可以,它自己执行却不行。。。

如果一段时间healthz一直can't resolve,它会发一个termiated信号给kubedns容器,容器自毁。

于是,既然你自己的cmd不能执行,我就在创建rc时把你的cmd参数注释掉,换成一个最简单的命令“ping 127.0.0.1”,这样既有命令执行,又不会报什么错误,不报错误应该就不会发terminated信号给kubedns。

- name: healthz

image: gcr.io/google_containers/exechealthz-amd64:1.2

。。。

args:

#- --cmd=nslookup kubernetes.default.svc.cluster.local 127.0.0.1 >/dev/null

- --cmd=ping 127.0.0.1

#- --url=/healthz-dnsmasq

#- --cmd=nslookup kubernetes.default.svc.cluster.lcoal 127.0.0.1:10053 >/dev/null

#- --url=/healthz-kubedns

#- --port=8080

#- --quiet

暂时这样”解决“了。。。

============================

这篇文章中说k8s livenessProbe会用到这个healthz(屏蔽参数不知道会不会有其他影响,暂时先跳过了。。):

lexec-healthz是k8s提供的一种辅助容器,多用于side car模式中。它的原理是定期执行指定的Linux指令,从而判断当前Pod中关键容器的健康状态。在kube-dns中的作用就是通过nslookup指令检查DNS查询服务的健康状态,k8s livenessProbe通过访问exec-healthz提供的Http API了解健康状态,并在出现故障时重启容器。其源码位于https://github.com/kubernetes/contrib/tree/master/exec-healthz。

你可能感兴趣的:(kube-dns坑)