kubernetes服務發現有兩個機制,一個是環境變量另一個則是域名解析,而提供域名解析的正是今天要說的主題kube-dns。這篇文章我先介紹一下dns的發展歷程接下來的blog會繼續進行源碼閱讀分享。我把發展定義了三個階段:
階段一
如果使用過kubernetes 1.2的應該都會知道dns的四件套:kube2sky、etcd、skydns和exechealthz。Kube2sky通過K8S API監視K8S Service資源的變化,并根據Service的信息生成DNS記錄寫入到etcd中。Skydns為集群中的Pod提供DNS查詢服務,DNS記錄從etcd中讀取。Exechealthz提供健康檢查功能。結構如下圖所示:
階段二
kubernetes 1.4以后把以前的四件套整成了三件套,最大的變化是去掉etcd,降低系統的復雜度,exechealth會檢查兩個容器的健康狀態;為集群提供DNS查詢服務的skydns變為了dnsmasq;Kubedns替代了kube2sky來監視Service和Endpoint的資源變化。
去除了etcd,那數據存儲在哪里呢?這個要看的kubedns的treeCache實現,是一個樹存儲結構,把:服務名稱.命名空間.域名(kubernetes.default.svc.cluster.local),反過來(顛倒順序local.cluster.svc.default.kubernetes)存儲,詳細的看后續代碼詳解。
階段三
最新的kubernetes是單獨建立的kubernetes子項目,最大的變化是把exechealth改為了sidecar,它是一個daemon進程負責監控dns并提供metric性能數據。和階段二沒有本質變化,就不畫結構圖了。