k8s:v1.4.6
坑1
創(chuàng)建kube-dns的service時,需要手動指定一個cluster ip范圍內(nèi)的特定ip地址,但是我照做了之后,通過/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集群自己分一個ip,通過dashboard查看分出來的ip,按照這個ip去配置就可以了。
還有一個奇怪的問題,按照目前理解來說,在node上的/etc/kubernetes/kubelet文件中配置了KUBELET_ARGS="--cluster-dns=172.17.26.52 --cluster-domain=cluster.local",宿主機(jī)的/etc/resolv.conf中的nameserver應(yīng)該就會獲取,但是沒有。。
因?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中的作用就是通過nslookup指令檢查DNS查詢服務(wù)的健康狀態(tài),k8s livenessProbe通過訪問exec-healthz提供的Http API了解健康狀態(tài),并在出現(xiàn)故障時重啟容器。其源碼位于https://github.com/kubernetes/contrib/tree/master/exec-healthz。
配置dns:創(chuàng)建name為kube-dns的rc,rc下會創(chuàng)建一個名稱為kube-dns-v20-xxxxx的pod,該pod下有3個容器,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
但是通過dashboard查看healthz的日志,卻是nslookup can't resolve? xxx。。。真無語,查看skydns-rc.yaml文件中的healthz的cmd參數(shù),拿出來單獨(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ī)制是什么鬼,我們在外面也是執(zhí)行的它的cmd,在外面執(zhí)行可以,它自己執(zhí)行卻不行。。。
如果一段時間healthz一直can't resolve,它會發(fā)一個termiated信號給kubedns容器,容器自毀。
于是,既然你自己的cmd不能執(zhí)行,我就在創(chuàng)建rc時把你的cmd參數(shù)注釋掉,換成一個最簡單的命令“ping 127.0.0.1”,這樣既有命令執(zhí)行,又不會報(bào)什么錯誤,不報(bào)錯誤應(yīng)該就不會發(fā)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(屏蔽參數(shù)不知道會不會有其他影響,暫時先跳過了。。):
lexec-healthz是k8s提供的一種輔助容器,多用于side car模式中。它的原理是定期執(zhí)行指定的Linux指令,從而判斷當(dāng)前Pod中關(guān)鍵容器的健康狀態(tài)。在kube-dns中的作用就是通過nslookup指令檢查DNS查詢服務(wù)的健康狀態(tài),k8s livenessProbe通過訪問exec-healthz提供的Http API了解健康狀態(tài),并在出現(xiàn)故障時重啟容器。其源碼位于https://github.com/kubernetes/contrib/tree/master/exec-healthz。