Kubernetes初探:網(wǎng)絡(luò)技術(shù)原理

1、什么是Kubernetes吧碾?

Kubernetes(k8s) 源于古希臘語倦春,意寓為舵手趴拧,管理者著榴。Kubernetes 是Google開源的容器集群管理系統(tǒng),其提供應(yīng)用部署暮胧、維護往衷、擴展機制等功能严卖,利用Kubernetes能方便地管理跨機器運行容器化的應(yīng)用。

其主要功能如下:

以集群的方式運行来颤、管理跨機器的容器福铅;

解決Docker 跨機器容器之間的通訊問題;

Kubernetes 的自我修復(fù)機制使得容器集群總是運行在用戶期望的狀態(tài)笆包。

實際上使用Kubernetes 只需要一個部署文件庵佣,使用一條命令就可以部署一個完整集群(以官網(wǎng)部署k8s 的dashboard 為例):

kubectl create -fhttps://rawgit.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml

現(xiàn)在先介紹一些核心的概念:

Pods:是連接在一起的容器組合并共享文件卷撞芍。它們是最小的部署單元序无,由 Kubernetes 統(tǒng)一創(chuàng)建衡创、調(diào)度璃氢、管理;

Replication controllers:管理 Pods 的生命周期, 它們確保指定數(shù)量的Pods 會一直運行巢寡;

Labels:被用來管理和選取基于鍵值對為基礎(chǔ)的對象組抑月;

Services:提供獨立舆蝴、可靠名稱和地址的 Pods 集合洁仗,它就像一個基礎(chǔ)版本的負(fù)載均衡器;

Node:相對master是工作主機叫胖,也叫Minon瓮增,物理機、虛擬機均可蹄殃。

Namespace:不同的namespace 形成邏輯上不同的項目或用戶組诅岩。

Volume:Pod 中被多個容器訪問的共享目錄带膜。

下圖是典型的Kubernetes 的架構(gòu)圖:

在開始了解Kubernetes 的網(wǎng)絡(luò)原理之前膝藕,我們先來看下docker 的網(wǎng)絡(luò)模型芭挽。

2袜爪、Docker的網(wǎng)絡(luò)模型

docker network ls 這個命令用于列出所有當(dāng)前主機上的網(wǎng)絡(luò):

在默認(rèn)情況下會看到三個網(wǎng)絡(luò)辛馆,它們是DockerDeamon 進程創(chuàng)建的。標(biāo)準(zhǔn)的Docker 支持一下4種網(wǎng)絡(luò)模式:

Bridge模式:使用—net=bridge指定腊状。容器使用獨立網(wǎng)絡(luò)Namespace缴挖,并連接到docker0虛擬網(wǎng)卡(默認(rèn)模式)硕蛹;

None模式:使用—net=none指定法焰。容器沒有任何網(wǎng)卡埃仪,適合不需要與外部通過網(wǎng)絡(luò)通信的容器;

Host模式:使用—net=host指定颁股。容器與主機共享網(wǎng)絡(luò)Namespace甘有,擁有與主機相同的網(wǎng)絡(luò)設(shè)備;

Container模式:使用—net=container:NAME_or_ID指定忱反。

在Kubernetes 的管理模式下温算,通常只使用bridge 模式间影。在bridge 模式下魂贬,DockerDaemon 第一次啟動時創(chuàng)建一個虛擬的網(wǎng)橋,缺省名字是docker0喂分,然后按照RPC1918的模型,在私有網(wǎng)絡(luò)空間中給這個網(wǎng)橋分配一個子網(wǎng)甘萧。Docker 創(chuàng)建出來的每一個容器扬卷,都會創(chuàng)建一個虛擬的Veth 設(shè)備對怪得,其中一端關(guān)聯(lián)到網(wǎng)橋上,另一端用Linux 的網(wǎng)絡(luò)命名空間技術(shù)蚕断,映射到容器內(nèi)的eth0設(shè)備亿乳,然后在網(wǎng)橋的地址段內(nèi)分配一個IP地址葛假。

Docker的缺省橋接網(wǎng)絡(luò)模型:

虛擬化技術(shù)中最為復(fù)雜的就是虛擬化網(wǎng)絡(luò)技術(shù),也是門檻很高的技術(shù)領(lǐng)域聊训,Docker 很明智的早期并沒有提供跨主機的解決方案抱究。

3、什么是kubernetes網(wǎng)絡(luò)模型带斑?

Kubernetes 網(wǎng)絡(luò)設(shè)計的一個基本原則是:每個Pod 都有一個全局唯一的IP, ?而且假定所有的Pod 都在一個可以直接連通的媳维,扁平的網(wǎng)絡(luò)空間中,Pod 之間可以跨主機通信遏暴,按照這種網(wǎng)絡(luò)原則抽象出來的一個Pod 對應(yīng)一個IP的設(shè)計模型也被稱作IP-per-Pod 模型侄刽。

相比于Docker 原生的NAT方式來說,這樣使得容器在網(wǎng)絡(luò)層面更像虛擬機或者物理機朋凉,復(fù)雜度整體降低州丹,更加容易實現(xiàn)服務(wù)發(fā)現(xiàn)杂彭,遷移墓毒,負(fù)載均衡等功能。

容器間的通信

創(chuàng)建的dashboard 容器信息:

在yaml 文件中你可以發(fā)現(xiàn)我們設(shè)置的replicas 的數(shù)量是1亲怠,但是卻發(fā)現(xiàn)了兩個容器在運行所计,第二個image名為gcr.io/google_containers/pause:2.0,那么第二個容器從何而來团秽?

執(zhí)行下圖中的命令可以發(fā)現(xiàn):

第二個容器和第一個容器共享網(wǎng)絡(luò)命名空間主胧。第一個容器是Netowrk Container,它不做任何事情习勤,只是用來接管Pod 的網(wǎng)絡(luò)踪栋。這樣做的好處在于避免容器間的相互依賴,使用一個簡單的容器來統(tǒng)一管理網(wǎng)絡(luò)图毕。

Pod 間的通信

Pod 間的通信使用的是一個內(nèi)部IP夷都,這個IP就是Network Container 的IP。

以dashboard 為例:

同一個Node 上的Pod 通過Veth 連接在同一個docker0 網(wǎng)橋上予颤,地址段相同囤官,原生能通信。但是不同Node 之間的Pod 如何通信的蛤虐,本質(zhì)是在網(wǎng)路上再架設(shè)一層overlay network 使容器的網(wǎng)絡(luò)運行在這層overlay 網(wǎng)絡(luò)上〉骋現(xiàn)有的方案有Flannel,OpenVSwitch,Weave 等。本文Kubernetes 環(huán)境是采用Flannel笆焰。

Flannel 使用Linux 通用TUN/ TAP 設(shè)備劫谅, 并使用UDP 封裝IP 數(shù)據(jù)包創(chuàng)建一個覆蓋網(wǎng)絡(luò)。它使用etcd 維護子網(wǎng)的分配和overlay 網(wǎng)絡(luò)和實際IP 的映射。

下圖是Flannel 的原理圖:

Pod 到Service 通信

查看dashboard 的Service 的VIP(Virtual IP) 和后端Pod 的IP:

那么dashboard 就可以通過10.254.104.235來進行訪問捏检,執(zhí)行iptables-save:

然后執(zhí)行l(wèi)sof –i:30250:

可以看到Kube-Proxy 進程監(jiān)聽在30250端口上荞驴,這個進程可以看做是Service 的透明代理兼負(fù)載均衡器,對于Service 的訪問請求將被這個進程轉(zhuǎn)發(fā)到后端Pod贯城。

對于Pod 的變化會及時刷新熊楼。那么Service 就是在Pod 間起到中轉(zhuǎn)和代理的作用。

下圖中可以很好的反映整個流程:

當(dāng)一個客戶端訪問這個Service 時能犯,這些iptable 規(guī)則就開始起作用鲫骗,客戶端的流量被重定向到Kube-Proxy 為這個Service 打開的端口上,Kube-Proxy 隨機選擇一個后端Pod 來進行服務(wù)踩晶。

外部到內(nèi)部的通信

Kubernetes 支持兩種對外服務(wù)的Service 的Type 定義:NodePort 和LoadBalancer执泰。

NodePort:在每個Node 上打開一個端口并且每個Node 的端口都是一樣的,通過:NodePort 的方式渡蜻,Kubernetes 集群外部的程序可以訪問Service术吝;

LoadBalancer:通過外部的負(fù)載均衡器來訪問。

參考:

https://github.com/kubernetes/kubernetes/blob/a6fdc50265c9e2831db66b92b23b41e0266387ce/docs/user-guide/services.md#virtual-ips-and-service-proxies

https://github.com/kubernetes/kubernetes/blob/v1.0.1/docs/design/networking.md

http://www.dasblinkenlichten.com/kubernetes-101-networking/

本文作者:陳玉(點融黑幫)茸苇,點融infra團隊運維開發(fā)工程師排苍, 愛點融, 愛自然学密, 愛生活淘衙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市腻暮,隨后出現(xiàn)的幾起案子彤守,更是在濱河造成了極大的恐慌,老刑警劉巖西壮,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遗增,死亡現(xiàn)場離奇詭異,居然都是意外死亡款青,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門霍狰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抡草,“玉大人,你說我怎么就攤上這事蔗坯】嫡穑” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵宾濒,是天一觀的道長腿短。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么橘忱? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任赴魁,我火速辦了婚禮,結(jié)果婚禮上钝诚,老公的妹妹穿的比我還像新娘颖御。我一直安慰自己,他們只是感情好凝颇,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布潘拱。 她就那樣靜靜地躺著,像睡著了一般拧略。 火紅的嫁衣襯著肌膚如雪芦岂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天垫蛆,我揣著相機與錄音禽最,去河邊找鬼。 笑死月褥,一個胖子當(dāng)著我的面吹牛弛随,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宁赤,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舀透,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了决左?” 一聲冷哼從身側(cè)響起愕够,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佛猛,沒想到半個月后惑芭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡继找,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年遂跟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婴渡。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡幻锁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出边臼,到底是詐尸還是另有隱情哄尔,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布柠并,位于F島的核電站岭接,受9級特大地震影響富拗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸣戴,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一啃沪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧葵擎,春花似錦谅阿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盯串,卻和暖如春氯檐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背体捏。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工冠摄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人几缭。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓河泳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親年栓。 傳聞我的和親對象是個殘疾皇子拆挥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容