成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

kube-dns的前世今生

Lin_R / 1870人閱讀

摘要:通過(guò)監(jiān)視資源的變化,并根據(jù)的信息生成記錄寫入到中。是唯一保留的容器,依然提供健康檢查。操作會(huì)獲取最新的全量資源與本地狀態(tài)進(jìn)行比較來(lái)產(chǎn)生通知,可以避免網(wǎng)絡(luò)原因?qū)е碌膩G失通知的情況。最后一個(gè)參數(shù)用來(lái)設(shè)置處理事件的回調(diào)。

上一期我們以1.2版本為背景,介紹了K8S的服務(wù)發(fā)現(xiàn)和kube-dns插件的相關(guān)內(nèi)容。有了上一期內(nèi)容作為基礎(chǔ),這期了解最新版本的kube-dns就會(huì)容易很多。

本文主要對(duì)比1.2和1.4版本中kube-dns 的主要變化,以及最新版本中kube-dns的內(nèi)部實(shí)現(xiàn)。滿滿的干貨來(lái)了,你準(zhǔn)備好了嗎?

大綱

● kube-dns的主要變化

● kube-dns的實(shí)現(xiàn)原理

● kubedns容器詳解

● dnsmasq容器簡(jiǎn)介

● exechealthz容器簡(jiǎn)介

主要變化

● 服務(wù)發(fā)現(xiàn)機(jī)制未變化

也就是說(shuō)kube-dns對(duì)外的接口是基本沒變的。變化主要在于kube-dns插件的內(nèi)部組成,由原來(lái)的四個(gè)容器變?yōu)榱巳齻€(gè)。

現(xiàn)在回顧一下上一期所講的1.2版本kube-dns的組成。

Kube2sky通過(guò)K8S API監(jiān)視K8S Service資源的變化,并根據(jù)Service的信息生成DNS記錄寫入到etcd中。Skydns為集群中的Pod提供DNS查詢服務(wù),DNS記錄從etcd中讀取。Exechealthz提供健康檢查功能。

接下來(lái)我們?cè)倏匆幌?.4版本kube-dns的組成。對(duì)比兩張圖,可以很直觀的看到kube-dns對(duì)外接口沒有發(fā)生變化。Exechealthz是唯一保留的容器,依然提供健康檢查。

不同點(diǎn):

1.會(huì)檢查兩個(gè)容器的健康狀態(tài)。

2.為集群提供DNS查詢服務(wù)的容器由skydns變?yōu)榱薲nsmasq。

3.Kubedns容器替代了kube2sky來(lái)監(jiān)視Service資源。

4.Etcd容器不見了。

相信有些人會(huì)好奇DNS記錄現(xiàn)在保存在哪了呢?那為了回答這個(gè)問題以及了解新版kube-dns的工作原理,我們就進(jìn)入下一章內(nèi)容來(lái)了解其實(shí)現(xiàn)原理。

實(shí)現(xiàn)原理

● kubedns容器的實(shí)現(xiàn)

本著“Talk is cheap, show me the code”原則,我們將會(huì)以源碼分析的方式介紹其原理。對(duì)另外兩個(gè)容器會(huì)進(jìn)行簡(jiǎn)要介紹。

先來(lái)看一下源碼位置,這里列出的是kube-dns插件相關(guān)的源碼,不僅僅是kubedns容器的。之前的源碼是集中在cluster/addons/dns下面的,那么1.4版本中分成了三個(gè)目錄:

● 第一個(gè)目錄會(huì)有K8S DNS相關(guān)的README以及kubedns容器的Dockerfile。

● 第二個(gè)目錄存放kube-dns插件的編排文件。

● 第三個(gè)是kubedns源碼目錄,kubedns容器使用的命令行就是從這構(gòu)建出來(lái)的。

● kubedns容器的功能:

● 接入SkyDNS,為dnsmasq提供查詢服務(wù)

● 替換etcd容器,使用樹形結(jié)構(gòu)在內(nèi)存中保存DNS記錄

● 通過(guò)K8S API監(jiān)視Service資源變化并更新DNS記錄

● 服務(wù)10053端口

對(duì)功能有了大概了解之后,我們下面就結(jié)合源碼來(lái)看看各個(gè)功能是如何實(shí)現(xiàn)的。

● kubedns實(shí)現(xiàn)——SkyDNS接入

下面是kubedns啟動(dòng)的部分代碼,這部分顯示的是kubedns在啟動(dòng)的時(shí)候會(huì)初始化一個(gè)SkyDNS Server,初始化的時(shí)候傳入了一個(gè)KubeDNSServer.kd。

下面是KubeDNSServer.kd的初始化代碼,使用的是K8S提供的包。使用K8S提供的包可以初始化一個(gè)SkyDNS Server?相信很多人能夠想到,這個(gè)KubeDNSServer.kd應(yīng)該實(shí)現(xiàn)了一個(gè)接口。

SkyDNS Server在初始化的時(shí)候需要傳入一個(gè)Backend接口,其定義如下。SkyDNS基于Etcd實(shí)現(xiàn)了該接口,也會(huì)使用它初始化Server。得益于SkyDNS的良好設(shè)計(jì),K8S只要實(shí)現(xiàn)該接口便可以接入SkyDNS來(lái)提供DNS查詢服務(wù),并定制存儲(chǔ)功能。

skydns/server/server.go

skydns/server/backend.go

● kubedns實(shí)現(xiàn)——etcd替換

在服務(wù)發(fā)現(xiàn)的流程中,主要用到了Records這個(gè)方法,下面我們就來(lái)看看K8S是如何實(shí)現(xiàn)這個(gè)方法。

主要步驟是先將域名按“.”拆分,并將各部分顛倒順序生成一個(gè)path數(shù)組。調(diào)用getRecordsForPath方法獲取DNS記錄并返回。

kubernetes/pkg/dns/dns.go

getRecordsForPath會(huì)調(diào)用cache的相關(guān)方法。這個(gè)cache會(huì)被初始化為一個(gè)TreeCache結(jié)構(gòu),定義如下:

kubernetes/pkg/dns/dns.go

kubernetes/pkg/dns/treecache.go

如下圖所示,TreeCache的結(jié)構(gòu)類似于目錄樹。從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的每個(gè)路徑與一個(gè)域名是相對(duì)應(yīng)的,順序是顛倒的。它的葉子節(jié)點(diǎn)只包含Entries,非葉子節(jié)點(diǎn)只包含ChildNodes。葉子節(jié)點(diǎn)中保存的就是SkyDNS定義的msg.Service結(jié)構(gòu),可以理解為DNS記錄。

在Records接口方法實(shí)現(xiàn)中,只需根據(jù)域名查找到對(duì)應(yīng)的葉子節(jié)點(diǎn),并返回葉子節(jié)點(diǎn)中保存的所有msg.Service數(shù)據(jù)。K8S就是通過(guò)這樣的一個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)保存DNS記錄的,并替換了Etcd。

● kubedns實(shí)現(xiàn)——監(jiān)視Service

最后我們來(lái)看一下監(jiān)視Service資源的相關(guān)代碼。如下圖所示,這里使用了k8s.io/kubernetes/pkg/client/cache包的NewInformer方法,這個(gè)方法在K8S源碼里會(huì)經(jīng)??吹?。其參數(shù)為:

● 第一個(gè)參數(shù)需要傳入ListWatch結(jié)構(gòu),它定義了List和Watch操作步驟。kd.kubeClient結(jié)構(gòu)可以用來(lái)訪問K8S API,從代碼中可以看出分別訪問了List和Watch API

● 第二個(gè)參數(shù)為監(jiān)視的資源類型,代碼中指定了Service資源

● 第三個(gè)參數(shù)為L(zhǎng)ist操作的執(zhí)行間隔。Watch操作是通知機(jī)制,只要監(jiān)視的資源發(fā)送變化

就會(huì)調(diào)用對(duì)應(yīng)的回調(diào)函數(shù)。List操作會(huì)獲取最新的全量資源與本地狀態(tài)進(jìn)行比較來(lái)產(chǎn)生通知,可以避免網(wǎng)絡(luò)原因?qū)е碌腤atch丟失通知的情況。List操作代價(jià)較高,因此需要通過(guò)第三個(gè)參數(shù)來(lái)設(shè)置其執(zhí)行間隔。

● 最后一個(gè)參數(shù)用來(lái)設(shè)置處理事件的回調(diào)。

kubernetes/pkg/dns/dns.go

下面我們以新增Service事件的處理流程為例來(lái)簡(jiǎn)單了解一下事件處理的代碼。

在創(chuàng)建一個(gè)K8S Service資源后,newService方法最終會(huì)調(diào)用newPortalService方法,其代碼如下。getSkyMsg函數(shù)會(huì)將Service的ClusterIP保存到msg.Service結(jié)構(gòu)中并返回,對(duì)應(yīng)recordValue。recordLabel可以理解為一個(gè)摘要值,與ClusterIP是一一對(duì)應(yīng)的,它將作為TreeCache葉子節(jié)點(diǎn)的key。

最后根據(jù)Service信息找到對(duì)應(yīng)的樹枝(如不存在會(huì)構(gòu)建),并設(shè)置葉子節(jié)點(diǎn)。這樣一個(gè)新建的Service對(duì)應(yīng)的DNS記錄就保存到kubedns中了。

kubernetes/pkg/dns/dns.go

Kubedns容器的主要原理已經(jīng)講解完了,下面我們簡(jiǎn)要介紹一下其他兩個(gè)容器。

● dnsmasq簡(jiǎn)介

● Dnsmasq是一款小巧的DNS配置工具

● 在kube-dns插件中的作用:

● 通過(guò)kubedns容器獲取DNS規(guī)則,在集群中提供DNS查詢服務(wù)

● 提供DNS緩存,提高查詢性能

● 降低kubedns容器的壓力、提高穩(wěn)定性

● Dockerfile在GitHub上Kubernetes組織的contrib倉(cāng)庫(kù)中,位于dnsmasq目錄下。

● 在kube-dns插件的編排文件中可以看到,dnsmasq通過(guò)參數(shù)--server=127.0.0.1#10053指定upstream為kubedns。

● exechealthz簡(jiǎn)介

● 在kube-dns插件中提供健康檢查功能

● 源碼同樣在contrib倉(cāng)庫(kù)中,位于exec-healthz目錄下。

● 新版中會(huì)對(duì)兩個(gè)容器都進(jìn)行健康檢查,更加完善。

總結(jié)

1.4版本kube-dns插件的三個(gè)容器的功能如下:

● kubedns容器

● 監(jiān)視k8s Service資源并更新DNS記錄

● 替換etcd,使用TreeCache數(shù)據(jù)結(jié)構(gòu)保存DNS記錄并實(shí)現(xiàn)SkyDNS的Backend接口

● 接入SkyDNS,對(duì)dnsmasq提供DNS查詢服務(wù)

● dnsmasq容器

● 對(duì)集群提供DNS查詢服務(wù)

● 設(shè)置kubedns為upstream

● 提供DNS緩存,降低kubedns負(fù)載,提高性能

● exechealthz容器

● 定期檢查kubedns和dnsmasq的健康狀態(tài)

● 為k8s活性檢測(cè)提供HTTP API

相比于1.2版本,個(gè)人認(rèn)為有了如下改進(jìn):

● 無(wú)狀態(tài)服務(wù)。1.2版本中,需要將Etcd的數(shù)據(jù)Volume出來(lái)才能保證Etcd容器重啟之后數(shù)據(jù)不會(huì)丟失,服務(wù)可以快速恢復(fù)。新版本中作為無(wú)狀態(tài)服務(wù)出現(xiàn),通過(guò)增加冗余來(lái)提高可靠性。即使kubedns容器重啟,dnsmasq緩存機(jī)制也可以保證服務(wù)的可用性。

● 優(yōu)化查詢效率。SkyDNS直接從內(nèi)存中獲取DNS記錄。

● 完善健康檢查。1.2版本中只對(duì)kube2sky設(shè)置了健康檢查。

除了改進(jìn)之外,還有一點(diǎn)不足,也是大家比較擔(dān)心的 「 內(nèi)存占用 」。目前在kube-dns編排文件中默認(rèn)設(shè)置了內(nèi)存限制為170M,在注釋中可以看出這一數(shù)字并未在大規(guī)模集群中驗(yàn)證。不過(guò)相信不久的將來(lái)我們就能看到這一驗(yàn)證結(jié)果。

Tips :直播在哪里?噓,悄悄告訴你,點(diǎn)擊http://t.cn/RVRITb3 即可查看直播回放!

掃描上方二維碼。閱讀更多優(yōu)質(zhì)文章。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/32513.html

相關(guān)文章

  • Web技術(shù)前世今生(二)

    摘要:前言我是,如果你還不認(rèn)識(shí)我,不妨先看看技術(shù)的前世今生一平靜的生活已經(jīng)有一段日子了。傳送門技術(shù)的前世今生一技術(shù)的前世今生三 前言:我是JavaScript,如果你還不認(rèn)識(shí)我,不妨先看看《Web技術(shù)的前世今生(一)》 平靜的生活已經(jīng)有一段日子了。 這一天,HTML大哥面露不悅地走過(guò)來(lái)問我: Js,你是打算和我們分家嗎? 大哥,您這說(shuō)的哪里話,我什么地方做的不對(duì)么?我一臉茫然地回答道。 哼,...

    Stardustsky 評(píng)論0 收藏0
  • Web技術(shù)前世今生(二)

    摘要:前言我是,如果你還不認(rèn)識(shí)我,不妨先看看技術(shù)的前世今生一平靜的生活已經(jīng)有一段日子了。傳送門技術(shù)的前世今生一技術(shù)的前世今生三 前言:我是JavaScript,如果你還不認(rèn)識(shí)我,不妨先看看《Web技術(shù)的前世今生(一)》 平靜的生活已經(jīng)有一段日子了。 這一天,HTML大哥面露不悅地走過(guò)來(lái)問我: Js,你是打算和我們分家嗎? 大哥,您這說(shuō)的哪里話,我什么地方做的不對(duì)么?我一臉茫然地回答道。 哼,...

    hyuan 評(píng)論0 收藏0
  • Web技術(shù)前世今生(二)

    摘要:前言我是,如果你還不認(rèn)識(shí)我,不妨先看看技術(shù)的前世今生一平靜的生活已經(jīng)有一段日子了。傳送門技術(shù)的前世今生一技術(shù)的前世今生三 前言:我是JavaScript,如果你還不認(rèn)識(shí)我,不妨先看看《Web技術(shù)的前世今生(一)》 平靜的生活已經(jīng)有一段日子了。 這一天,HTML大哥面露不悅地走過(guò)來(lái)問我: Js,你是打算和我們分家嗎? 大哥,您這說(shuō)的哪里話,我什么地方做的不對(duì)么?我一臉茫然地回答道。 哼,...

    justjavac 評(píng)論0 收藏0
  • Java版本之前世今生

    摘要:原文鏈接版本之前世今生最全篇語(yǔ)言語(yǔ)言是博士在創(chuàng)建年,被命名為提出了愿景公開版本個(gè)包文件,的類文件第一個(gè)版本發(fā)布在定義為代表技術(shù)虛擬機(jī)版本發(fā)布時(shí)間代表技術(shù)文件格式內(nèi)部類反射版本發(fā)布時(shí)間從開始以后的版本定義為擴(kuò)展到個(gè)包個(gè)類版本名稱為區(qū)分企業(yè)平 原文鏈接:Java版本之前世今生-最全篇 1.Oak 語(yǔ)言 Oak 語(yǔ)言是James Gosling 博士在1991創(chuàng)建 2.JDK Beta 1...

    Neilyo 評(píng)論0 收藏0
  • Web技術(shù)前世今生(三)

    摘要:前言我是,如果你還不認(rèn)識(shí)我,不妨先看看技術(shù)的前世今生一,以及技術(shù)的前世今生二前面我提過(guò),我的大哥有一個(gè)叫的死黨,這家伙有事沒事經(jīng)常上我們家串門。時(shí)間來(lái)到了年,在那前后發(fā)生了兩件事讓我印象深刻。傳送門技術(shù)的前世今生一技術(shù)的前世今生二 前言:我是JavaScript,如果你還不認(rèn)識(shí)我,不妨先看看《Web技術(shù)的前世今生(一)》,以及《Web技術(shù)的前世今生(二)》 前面我提過(guò),我的大哥HTML...

    Wuv1Up 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<