1. 程式人生 > >kubernetes之kubedns部署(kubedns,dnsmasq,exechealthz)以及dns-autoscaler部署

kubernetes之kubedns部署(kubedns,dnsmasq,exechealthz)以及dns-autoscaler部署

一,理解Kubedns原理

通俗理解,首先明白k8s dns是為服務的發現而生,即service的發現,為了能夠讓其它服務能夠直接通過service 名字找到它們,於是就需要dns將service名轉換為它的IP, 那麼service的變化如何知道? 如何知道目前有哪些service 及知道他們的ip呢,service的增加減少又如何知道了,

所以要有一個元件(1.3中是Kube2sky,1.3後是kubedns)來時刻監控它的變化,監控到了什麼就把它記錄下來,記錄的是service和ip之間的對映關係,稱為DNS解析記錄,但是記錄在某個位置呢,監控的元件不同,記錄的位置也不同, Kube2sky是記錄到etcd中,kubedns是記錄到哪了呢, 記錄在記憶體當中,使用樹形結構在記憶體中儲存監控到的記錄。

由於一切對叢集的操作都是通過其API來的,所以它監控service資源變化也是藉助於k8s API

這個元件僅僅是記錄下來以後,並不提供查詢。所以查詢就是另外一個元件的作用了,1.3之前是由Skydns來查詢的, 所有服務(pod)都找skydns查詢,1.3以後都是由dnsmasq查詢的,它們從前面記錄的地方查詢相關service的解析記錄,之所以用dnsmasq來查詢,因為它提供DNS查詢快取,在記憶體中完成查詢,查詢速度非常快!

兩個元件一個負責監控並記錄,另外一個負責幫其它服務做查詢, 兩個元件必須要同時執行,如果其中一個出問題了,那麼dns系統將無法解析,於是需要有另一個元件專門來監控它們的健康狀態,這個元件就是exechealthz,Exechealthz是兩個版本中唯一保留的容器,依然提供健康檢查。

在K8s中,這三個元件都是用容器執行的,而且是在同一個pod中,

官方理解,上圖:

這裡寫圖片描述

下面的語法中注意區分kube-dns和kubedns, kube-dns是k8s的dns業務,kubedns是其中的一個業務容器.

  • dnsmasq簡介
    Dnsmasq是一款小巧的DNS配置工具
    在kube-dns外掛中的作用:

    • 通過kubedns容器獲取DNS規則,在叢集中提供DNS查詢服務,相當於dns的server端。
    • 提供DNS快取,提高查詢效能
    • 降低kubedns容器的壓力、提高穩定性
    • Dockerfile在GitHub上Kubernetes組織的contrib倉庫中,位於dnsmasq目錄下
  • exechealthz簡介

    • 在kube-dns外掛中提供健康檢查功能
    • 原始碼同樣在contrib倉庫中,位於exec-healthz目錄下。
    • 新版中會對兩個容器都進行健康檢查,更加完善。

總結
kube-dns外掛的三個容器的功能如下:

  • kubedns容器

    • 監視k8s Service資源並更新DNS記錄
    • 替換etcd,使用TreeCache資料結構儲存DNS記錄並實現SkyDNS的Backend介面
    • 接入SkyDNS,對dnsmasq提供DNS查詢服務
  • dnsmasq容器

    • 對叢集提供DNS查詢服務
    • 設定kubedns為upstream
    • 提供DNS快取,降低kubedns負載,提高效能
  • exechealthz容器

    • 定期檢查kubedns和dnsmasq的健康狀態
    • 為k8s活性檢測提供HTTP API

二、部署kubedns

1,上官方網址下載需要的yaml部署檔案:https://github.com/kubernetes/kubernetes/tree/release-1.10/cluster/addons/dns

部署檔案為kube-dns.yaml.base

其中ServiceAccount和configMap部分不需要修改

Deployment和service中需要將clusterIP設定為我們想要的值, 也不需要做什麼修改

Deployment運行了 三個容器:kubedns dnsmasq sidecar,sidecar 是一個監控健康模組,同時向外暴露metrics 記錄。

部署檔案設定好後,一起來建立:

# kubectl create -f kube-dns.yaml.base

** 三,驗證kubedns功能**

如果我們此前已經有了部署了許多pod和服務,並且在Kubelet 啟動配置檔案加入了 --cluster-dns=10.254.0.2 --cluster-domain=cluster.local 引數,則可以進入某個pod中的容器內檢視其/etc/resolv.conf 檔案

根據kubelet的啟動引數,kubelet會在每個pod中設定DNS域名解析檔案/etc/resolv.conf,加入了nameser和search搜尋域。最後應用程式就能夠像訪問網站一樣,僅僅通過服務的名字就能訪問到服務了。

通常可以啟動一個帶有nslookup工具的pod,比如busybox,映象從gcr.io/google_containers/busybox下載,來驗證DNS服務是否能夠正常工作。

四,kubedns自動水平擴充套件

在上面部署的Kubedns,它只有一個pod,如果這個pod沒有了 又或一個pod因為解析量大無法撐起解析時,會導致dns無法工作,所以官方給了一個自動水平伸縮的方案,根據當前pod的負載來決定是否增加或減少pod數量,

稱為,dns-horizontal-autoscaler ,部署檔案位於kubernetes/cluster/addons/dns-horizontal-autoscale/dns-horizontal-autoscaler.yaml,下載下來可直接部署。

dns-horizontal-autoscaler-rbac.yaml檔案解析:

實際它就建立了三個資源:ServiceAccount、ClusterRole、ClusterRoleBinding ,建立帳戶,建立角色,賦予許可權,將帳戶繫結到角色上面。

在這裡插入圖片描述

在這裡插入圖片描述

** 至此,一個完整的kubedns部署完成了。**