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。