掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
最近我一直在研究 Kubernetes 網(wǎng)絡(luò)。我注意到一件事情就是,雖然關(guān)于如何設(shè)置 Kubernetes 網(wǎng)絡(luò)的文章很多,也寫得很不錯(cuò),但是卻沒有看到關(guān)于如何去運(yùn)維 Kubernetes 網(wǎng)絡(luò)的文章、以及如何完全確保它不會(huì)給你造成生產(chǎn)事故。

主要從事網(wǎng)頁設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、成都響應(yīng)式網(wǎng)站建設(shè)公司、程序開發(fā)、微網(wǎng)站、小程序開發(fā)等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都網(wǎng)站制作、網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷經(jīng)驗(yàn),集策劃、開發(fā)、設(shè)計(jì)、營(yíng)銷、管理等多方位專業(yè)化運(yùn)作于一體,具備承接不同規(guī)模與類型的建設(shè)項(xiàng)目的能力。
在本文中,我將盡力讓你相信三件事情(我覺得這些都很合理 :)):
我肯定不是 Kubernetes 網(wǎng)絡(luò)方面的專家,但是我在配置 Kubernetes 網(wǎng)絡(luò)時(shí)遇到了一些問題,并且比以前更加了解 Kubernetes 網(wǎng)絡(luò)了。
在這里,我并不討論有關(guān)運(yùn)維物理網(wǎng)絡(luò)的話題(對(duì)于它我不懂),而是討論關(guān)于如何讓像 DNS 服務(wù)、負(fù)載均衡以及代理這樣的軟件正常工作方面的內(nèi)容。
我在一個(gè)負(fù)責(zé)很多網(wǎng)絡(luò)基礎(chǔ)設(shè)施的團(tuán)隊(duì)工作過一年時(shí)間,并且因此學(xué)到了一些運(yùn)維網(wǎng)絡(luò)基礎(chǔ)設(shè)施的知識(shí)?。@然我還有很多的知識(shí)需要繼續(xù)學(xué)習(xí))在我們開始之前有三個(gè)整體看法:
sysctl)配置正確,而一個(gè)錯(cuò)誤配置的系統(tǒng)控制就很容易讓你處于“一切都很好”和“到處都出問題”的差別中。我距離成為一名網(wǎng)絡(luò)運(yùn)維專家還差得很遠(yuǎn),但是我認(rèn)為以下幾點(diǎn)很重要:
切換到 Kubernetes 顯然是個(gè)非常大的更改!因此,我們來討論一下可能會(huì)導(dǎo)致錯(cuò)誤的地方!
在本文中我們將要討論的 Kubernetes 網(wǎng)絡(luò)組件有:
kube-dnskube-proxykubelet如果你打算配置 HTTP 服務(wù),或許這些你都會(huì)用到。這些組件中的大部分我都不會(huì)用到,但是我盡可能去理解它們,因此,本文將涉及它們有關(guān)的內(nèi)容。
讓我們從你能做到的最簡(jiǎn)單的東西開始。這并不能讓你在 Kubernetes 中運(yùn)行 HTTP 服務(wù)。我認(rèn)為它是非常安全的,因?yàn)樵谶@里面可以讓你動(dòng)的東西很少。
如果你為所有容器使用宿主機(jī)網(wǎng)絡(luò),我認(rèn)為需要你去做的全部事情僅有:
如果你為每個(gè) pod 直接使用宿主機(jī)網(wǎng)絡(luò),那就不需要 kube-dns 或者 kube-proxy 了。你都不需要一個(gè)作為基礎(chǔ)的覆蓋網(wǎng)絡(luò)。
這種配置方式中,你的 pod 們都可以連接到外部網(wǎng)絡(luò)(同樣的方式,你的宿主機(jī)上的任何進(jìn)程都可以與外部網(wǎng)絡(luò)對(duì)話),但外部網(wǎng)絡(luò)不能連接到你的 pod 們。
這并不是最重要的(我認(rèn)為大多數(shù)人想在 Kubernetes 中運(yùn)行 HTTP 服務(wù)并與這些服務(wù)進(jìn)行真實(shí)的通訊),但我認(rèn)為有趣的是,從某種程度上來說,網(wǎng)絡(luò)的復(fù)雜性并不是絕對(duì)需要的,并且有時(shí)候你不用這么復(fù)雜的網(wǎng)絡(luò)就可以實(shí)現(xiàn)你的需要。如果可以的話,盡可能地避免讓網(wǎng)絡(luò)過于復(fù)雜。
我們將要討論的第一個(gè)網(wǎng)絡(luò)組件是有關(guān)覆蓋網(wǎng)絡(luò)的。Kubernetes 假設(shè)每個(gè) pod 都有一個(gè) IP 地址,這樣你就可以與那個(gè) pod 中的服務(wù)進(jìn)行通訊了。我在說到“覆蓋網(wǎng)絡(luò)”這個(gè)詞時(shí),指的就是這個(gè)意思(“讓你通過它的 IP 地址指向到 pod 的系統(tǒng))。
所有其它的 Kubernetes 網(wǎng)絡(luò)的東西都依賴正確工作的覆蓋網(wǎng)絡(luò)。更多關(guān)于它的內(nèi)容,你可以讀 這里的 kubernetes 網(wǎng)絡(luò)模型。
Kelsey Hightower 在 kubernetes 艱難之路 中描述的方式看起來似乎很好,但是,事實(shí)上它的作法在超過 50 個(gè)節(jié)點(diǎn)的 AWS 上是行不通的,因此,我不打算討論它了。
有許多覆蓋網(wǎng)絡(luò)后端(calico、flannel、weaveworks、romana)并且規(guī)劃非?;靵y。就我的觀點(diǎn)來看,我認(rèn)為一個(gè)覆蓋網(wǎng)絡(luò)有 2 個(gè)職責(zé):
Okay! 因此!你的覆蓋網(wǎng)絡(luò)可能會(huì)出現(xiàn)的問題是什么呢?
iptables -A -t nat POSTROUTING -s $SUBNET -j MASQUERADE),以確保那個(gè)容器能夠向 Kubernetes 之外發(fā)出網(wǎng)絡(luò)請(qǐng)求。如果在這個(gè)規(guī)則上有錯(cuò)誤,你的容器就不能連接到外部網(wǎng)絡(luò)。這并不很難(它只是幾條 iptables 規(guī)則而已),但是它非常重要。我發(fā)起了一個(gè) 拉取請(qǐng)求,因?yàn)槲蚁氪_保它有很好的彈性。flannel hostgw 后端,我們開始使用它的時(shí)候,節(jié)點(diǎn)刪除功能 尚未開始工作。flannel etcd 集群上丟失了數(shù)據(jù),最后的結(jié)果將是在容器中網(wǎng)絡(luò)連接會(huì)丟失。(現(xiàn)在這個(gè)問題已經(jīng)被修復(fù)了)我在這里主要討論的是過去發(fā)生在 Flannel 中的問題,但是我并不是要承諾不去使用 Flannel —— 事實(shí)上我很喜歡 Flannel,因?yàn)槲矣X得它很簡(jiǎn)單(比如,類似 vxlan 在后端這一塊的部分 只有 500 行代碼),對(duì)我來說,通過代碼來找出問題的根源成為了可能。并且很顯然,它在不斷地改進(jìn)。他們?cè)趯彶槔≌?qǐng)求方面做的很好。
到目前為止,我運(yùn)維覆蓋網(wǎng)絡(luò)的方法是:
sudo ip route list 命令去查看它是否正確即可)我認(rèn)為去遍歷所有已合并的拉取請(qǐng)求以及過去已修復(fù)的 bug 清單真的是非常有幫助的 —— 這需要花費(fèi)一些時(shí)間,但這是得到一個(gè)其它人遇到的各種問題的清單的好方法。
對(duì)其他人來說,他們的覆蓋網(wǎng)絡(luò)可能工作的很好,但是我并不能從中得到任何經(jīng)驗(yàn),并且我也曾聽說過其他人報(bào)告類似的問題。如果你有一個(gè)類似配置的覆蓋網(wǎng)絡(luò):a) 在 AWS 上并且 b) 在多于 50-100 節(jié)點(diǎn)上運(yùn)行,我想知道你運(yùn)維這樣的一個(gè)網(wǎng)絡(luò)有多大的把握。
現(xiàn)在,我有一些關(guān)于運(yùn)維覆蓋網(wǎng)絡(luò)的想法,我們來討論一下。
這個(gè)標(biāo)題的最后面有一個(gè)問號(hào),那是因?yàn)槲也]有真的去運(yùn)維過。在這里我還有更多的問題要問答。
這里的 Kubernetes 服務(wù)是如何工作的!一個(gè)服務(wù)是一群 pod 們,它們中的每個(gè)都有自己的 IP 地址(像 10.1.0.3、10.2.3.5、10.3.5.6 這樣)
kube-dns 去解析 Kubernetes 服務(wù) DNS 名字為 IP 地址(因此,my-svc.my-namespace.svc.cluster.local 可能映射到 10.23.1.2 上)kube-proxy 配置 iptables 規(guī)則是為了在它們之間隨機(jī)進(jìn)行均衡負(fù)載。Kube-proxy 也有一個(gè)用戶空間的輪詢負(fù)載均衡器,但是在我的印象中,他們并不推薦使用它。因此,當(dāng)你發(fā)出一個(gè)請(qǐng)求到 my-svc.my-namespace.svc.cluster.local 時(shí),它將解析為 10.23.1.2,然后,在你本地主機(jī)上的 iptables 規(guī)則(由 kube-proxy 生成)將隨機(jī)重定向到 10.1.0.3 或者 10.2.3.5 或者 10.3.5.6 中的一個(gè)上。
在這個(gè)過程中我能想像出的可能出問題的地方:
kube-dns 配置錯(cuò)誤kube-proxy 掛了,以致于你的 iptables 規(guī)則沒有得以更新iptables 規(guī)則相關(guān)的一些問題我們來討論一下 iptables 規(guī)則,因?yàn)閯?chuàng)建大量的 iptables 規(guī)則是我以前從沒有聽過的事情!
kube-proxy 像如下這樣為每個(gè)目標(biāo)主機(jī)創(chuàng)建一個(gè) iptables 規(guī)則:這些規(guī)則來自 這里)
-A KUBE-SVC-LI77LBOOMGYET5US -m comment --comment "default/showreadiness:showreadiness" -m statistic --mode random --probability 0.20000000019 -j KUBE-SEP-E4QKA7SLJRFZZ2DD[b][c]
-A KUBE-SVC-LI77LBOOMGYET5US -m comment --comment "default/showreadiness:showreadiness" -m statistic --mode random --probability 0.25000000000 -j KUBE-SEP-LZ7EGMG4DRXMY26H
-A KUBE-SVC-LI77LBOOMGYET5US -m comment --comment "default/showreadiness:showreadiness" -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-RKIFTWKKG3OHTTMI
-A KUBE-SVC-LI77LBOOMGYET5US -m comment --comment "default/showreadiness:showreadiness" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-CGDKBCNM24SZWCMS
-A KUBE-SVC-LI77LBOOMGYET5US -m comment --comment "default/showreadiness:showreadiness" -j KUBE-SEP-RI4SRNQQXWSTGE2Y
因此,kube-proxy 創(chuàng)建了許多 iptables 規(guī)則。它們都是什么意思?它對(duì)我的網(wǎng)絡(luò)有什么樣的影響?這里有一個(gè)來自華為的非常好的演講,它叫做 支持 50,000 個(gè)服務(wù)的可伸縮 Kubernetes,它說如果在你的 Kubernetes 集群中有 5,000 服務(wù),增加一個(gè)新規(guī)則,將需要 11 分鐘。如果這種事情發(fā)生在真實(shí)的集群中,我認(rèn)為這將是一件非常糟糕的事情。
在我的集群中肯定不會(huì)有 5,000 個(gè)服務(wù),但是 5,000 并不是那么大的一個(gè)數(shù)字。為解決這個(gè)問題,他們給出的解決方案是 kube-proxy 用 IPVS 來替換這個(gè) iptables 后端,IPVS 是存在于 Linux 內(nèi)核中的一個(gè)負(fù)載均衡器。
看起來,像 kube-proxy 正趨向于使用各種基于 Linux 內(nèi)核的負(fù)載均衡器。我認(rèn)為這只是一定程度上是這樣,因?yàn)樗麄冎С?UDP 負(fù)載均衡,而其它類型的負(fù)載均衡器(像 HAProxy)并不支持 UDP 負(fù)載均衡。
但是,我覺得使用 HAProxy 更舒服!它能夠用于去替換 kube-proxy!我用谷歌搜索了一下,然后發(fā)現(xiàn)了這個(gè) thread on kubernetes-sig-network,它說:
kube-proxy 是很難用的,我們?cè)谏a(chǎn)系統(tǒng)中使用它近一年了,它在大部分的時(shí)間都表現(xiàn)的很好,但是,隨著我們集群中的服務(wù)越來越多,我們發(fā)現(xiàn)它的排錯(cuò)和維護(hù)工作越來越難。在我們的團(tuán)隊(duì)中沒有 iptables 方面的專家,我們只有 HAProxy & LVS 方面的專家,由于我們已經(jīng)使用它們好幾年了,因此我們決定使用一個(gè)中心化的 HAProxy 去替換分布式的代理。我覺得這可能會(huì)對(duì)在 Kubernetes 中使用 HAProxy 的其他人有用,因此,我們更新了這個(gè)項(xiàng)目,并將它開源:https://github.com/AdoHe/kube2haproxy。如果你發(fā)現(xiàn)它有用,你可以去看一看、試一試。
因此,那是一個(gè)有趣的選擇!我在這里確實(shí)沒有答案,但是,有一些想法:
正如你所看到的,我在關(guān)于如何運(yùn)維 Kubernetes 中的內(nèi)部代理方面的思路還是很混亂的,并且我也沒有使用它們的太多經(jīng)驗(yàn)??傮w上來說,kube-proxy 和 kube-dns 還是很好的,也能夠很好地工作,但是我仍然認(rèn)為應(yīng)該去考慮使用它們可能產(chǎn)生的一些問題(例如,”你不能有超出 5000 的 Kubernetes 服務(wù)“)。
如果你正在運(yùn)行著一個(gè) Kubernetes 集群,那么到目前為止,很有可能的是,你事實(shí)上需要 HTTP 請(qǐng)求去進(jìn)入到你的集群中。這篇博客已經(jīng)太長(zhǎng)了,并且關(guān)于入口我知道的也不多,因此,我們將不討論關(guān)于入口的內(nèi)容。
幾個(gè)有用的鏈接,總結(jié)如下:
kube-proxy 上性能的討論:https://www.youtube.com/watch?v=4-pawkiazEg我現(xiàn)在的計(jì)劃是,繼續(xù)不斷地學(xué)習(xí)關(guān)于它們都是如何工作的,以盡可能多地減少對(duì)我動(dòng)過的那些部分的擔(dān)憂。
一如繼往,我希望這篇文章對(duì)你有幫助,并且如果我在這篇文章中有任何的錯(cuò)誤,我非常喜歡你告訴我。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流