k8s:v1.4.6
坑1
創(chuàng)建kube-dns的service時(shí),需要手動(dòng)指定一個(gè)cluster ip范圍內(nèi)的特定ip地址厨钻,但是我照做了之后,通過(guò)/etc/resolv.conf中配置servername xxx_ip執(zhí)行kubectl exec -n kube-system -ti kube-dns-v20-xxxxx -c healthz -- nslookup kibana-logging.kube-system.svc.cluster.local發(fā)現(xiàn)不行屿岂。礼饱。坏为。
于是嘗試了下,把clusterip注釋掉镊绪,讓k8s集群自己分一個(gè)ip匀伏,通過(guò)dashboard查看分出來(lái)的ip,按照這個(gè)ip去配置就可以了蝴韭。
還有一個(gè)奇怪的問(wèn)題够颠,按照目前理解來(lái)說(shuō),在node上的/etc/kubernetes/kubelet文件中配置了KUBELET_ARGS="--cluster-dns=172.17.26.52 --cluster-domain=cluster.local"榄鉴,宿主機(jī)的/etc/resolv.conf中的nameserver應(yīng)該就會(huì)獲取履磨,但是沒(méi)有。庆尘。
因?yàn)閯?chuàng)建的pod內(nèi)的容器內(nèi)的/etc/resolv.conf文件中的內(nèi)容是集成的宿主機(jī)的/etc/resolv.conf剃诅。
坑2
lexec-healthz是k8s提供的一種輔助容器,多用于side car模式中驶忌。它的原理是定期執(zhí)行指定的Linux指令矛辕,從而判斷當(dāng)前Pod中關(guān)鍵容器的健康狀態(tài)。在kube-dns中的作用就是通過(guò)nslookup指令檢查DNS查詢服務(wù)的健康狀態(tài)付魔,k8s livenessProbe通過(guò)訪問(wèn)exec-healthz提供的Http API了解健康狀態(tài)聊品,并在出現(xiàn)故障時(shí)重啟容器。其源碼位于https://github.com/kubernetes/contrib/tree/master/exec-healthz抒抬。
配置dns:創(chuàng)建name為kube-dns的rc杨刨,rc下會(huì)創(chuàng)建一個(gè)名稱為kube-dns-v20-xxxxx的pod晤柄,該pod下有3個(gè)容器擦剑,kubedns、dnsmasq芥颈、healthz惠勒,
master節(jié)點(diǎn)執(zhí)行(可以解析):
?. /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
但是通過(guò)dashboard查看healthz的日志,卻是nslookup can't resolve? xxx爬坑。纠屋。。真無(wú)語(yǔ)盾计,查看skydns-rc.yaml文件中的healthz的cmd參數(shù)售担,拿出來(lái)單獨(dú)執(zhí)行赁遗,
?. /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的執(zhí)行機(jī)制是什么鬼哥攘,我們?cè)谕饷嬉彩菆?zhí)行的它的cmd剖煌,在外面執(zhí)行可以,它自己執(zhí)行卻不行逝淹。耕姊。。
如果一段時(shí)間healthz一直can't resolve栅葡,它會(huì)發(fā)一個(gè)termiated信號(hào)給kubedns容器茉兰,容器自毀。
于是欣簇,既然你自己的cmd不能執(zhí)行邦邦,我就在創(chuàng)建rc時(shí)把你的cmd參數(shù)注釋掉,換成一個(gè)最簡(jiǎn)單的命令“ping 127.0.0.1”醉蚁,這樣既有命令執(zhí)行燃辖,又不會(huì)報(bào)什么錯(cuò)誤,不報(bào)錯(cuò)誤應(yīng)該就不會(huì)發(fā)terminated信號(hào)給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
暫時(shí)這樣”解決“了氏身。。惑畴。
============================
這篇文章中說(shuō)k8s livenessProbe會(huì)用到這個(gè)healthz(屏蔽參數(shù)不知道會(huì)不會(huì)有其他影響蛋欣,暫時(shí)先跳過(guò)了。如贷。):
lexec-healthz是k8s提供的一種輔助容器陷虎,多用于side car模式中。它的原理是定期執(zhí)行指定的Linux指令杠袱,從而判斷當(dāng)前Pod中關(guān)鍵容器的健康狀態(tài)尚猿。在kube-dns中的作用就是通過(guò)nslookup指令檢查DNS查詢服務(wù)的健康狀態(tài),k8s livenessProbe通過(guò)訪問(wèn)exec-healthz提供的Http API了解健康狀態(tài)楣富,并在出現(xiàn)故障時(shí)重啟容器凿掂。其源碼位于https://github.com/kubernetes/contrib/tree/master/exec-healthz。