搞定 Kubernetes 網(wǎng)絡(luò):概念及策略控制
點擊上方藍色“Go語言中文網(wǎng)”關(guān)注我們,領(lǐng)全套Go資料,每天學習?Go?語言

Kubernetes 基本網(wǎng)絡(luò)模型
約法三章的意思是:在評價一個容器網(wǎng)絡(luò)或者設(shè)計容器網(wǎng)絡(luò)的時候,它的準入條件。它需要滿足哪三條?才能認為它是一個合格的網(wǎng)絡(luò)方案;
四大目標的意思是在設(shè)計這個網(wǎng)絡(luò)的拓撲,設(shè)計網(wǎng)絡(luò)的具體功能的實現(xiàn)的時候,要去想清楚,能不能達成連通性等這幾大指標。
約法三章
第一條:任意兩個 Pod 之間其實是可以直接通信的,無需經(jīng)過顯式地使用 NAT 來接收數(shù)據(jù)和地址的轉(zhuǎn)換; 第二條:Node 與 Pod 之間是可以直接通信的,無需使用明顯的地址轉(zhuǎn)換; 第三條:Pod 看到自己的 IP 跟別人看見它所用的 IP 是一樣的,中間不能經(jīng)過轉(zhuǎn)換。
四大目標
外部世界和 service 之間是怎么通信的?就是有一個互聯(lián)網(wǎng)或者是公司外部的一個用戶,怎么用到 service?service 特指 K8s 里面的服務(wù)概念。 service 如何與它后端的 pod 通訊? pod 和 pod 之間調(diào)用是怎么做到通信的? 最后就是 pod 內(nèi)部容器與容器之間的通信?
對基本約束的解釋
Underlay 的標準是它與 Host 網(wǎng)絡(luò)是同層的,從外在可見的一個特征就是它是不是使用了 Host 網(wǎng)絡(luò)同樣的網(wǎng)段、輸入輸出基礎(chǔ)設(shè)備、容器的 IP 地址是不是需要與 Host 網(wǎng)絡(luò)取得協(xié)同(來自同一個中心分配或統(tǒng)一劃分)。這就是 Underlay;
Overlay 不一樣的地方就在于它并不需要從 Host 網(wǎng)絡(luò)的 IPM 的管理的組件去申請 IP,一般來說,它只需要跟 Host 網(wǎng)絡(luò)不沖突,這個 IP 可以自由分配的。


Netns 探秘
Netns 究竟實現(xiàn)了什么

Pod 與 Netns 的關(guān)系


主流網(wǎng)絡(luò)方案簡介
典型的容器網(wǎng)絡(luò)實現(xiàn)方案

Flannel?是一個比較大一統(tǒng)的方案,它提供了多種的網(wǎng)絡(luò) backend。不同的 backend 實現(xiàn)了不同的拓撲,它可以覆蓋多種場景;
Calico?主要是采用了策略路由,節(jié)點之間采用 BGP 的協(xié)議,去進行路由的同步。它的特點是功能比較豐富,尤其是對 Network Point 支持比較好,大家都知道 Calico 對底層網(wǎng)絡(luò)的要求,一般是需要 mac 地址能夠直通,不能跨二層域;
當然也有一些社區(qū)的同學會把 Flannel 的優(yōu)點和 Calico 的優(yōu)點做一些集成。我們稱之為嫁接型的創(chuàng)新項目?Cilium;
最后講一下?WeaveNet,如果大家在使用中需要對數(shù)據(jù)做一些加密,可以選擇用 WeaveNet,它的動態(tài)方案可以實現(xiàn)比較好的加密。
Flannel 方案

一種是用戶態(tài)的 udp,這種是最早期的實現(xiàn); 然后是內(nèi)核的 Vxlan,這兩種都算是 overlay 的方案。Vxlan 的性能會比較好一點,但是它對內(nèi)核的版本是有要求的,需要內(nèi)核支持 Vxlan 的特性功能; 如果你的集群規(guī)模不夠大,又處于同一個二層域,也可以選擇采用 host-gw 的方式。這種方式的 backend 基本上是由一段廣播路由規(guī)則來啟動的,性能比較高。

Network Policy 的用處
Network Policy 基本概念

配置實例

第一件事是控制對象,就像這個實例里面 spec 的部分。spec 里面通過 podSelector 或者 namespace 的 selector,可以選擇做特定的一組 pod 來接受我們的控制;
第二個就是對流向考慮清楚,需要控制入方向還是出方向?還是兩個方向都要控制?
最重要的就是第三部分,如果要對選擇出來的方向加上控制對象來對它流進行描述,具體哪一些 stream 可以放進來,或者放出去?類比這個流特征的五元組,可以通過一些選擇器來決定哪一些可以作為我的遠端,這是對象的選擇;也可以通過 IPBlock 這種機制來得到對哪些 IP 是可以放行的;最后就是哪些協(xié)議或哪些端口。其實流特征綜合起來就是一個五元組,會把特定的能夠接受的流選擇出來 。

本文總結(jié)
在 pod 的容器網(wǎng)絡(luò)中核心概念就是 IP,IP 就是每個 pod 對外通訊的地址基礎(chǔ),必須內(nèi)外一致,符合 K8s 的模型特征;
在介紹網(wǎng)絡(luò)方案的時候,影響容器網(wǎng)絡(luò)性能最關(guān)鍵的就是拓撲。要能夠理解你的包端到端是怎么聯(lián)通的,中間怎么從 container 到達 Host,Host 出了 container 是要封裝還是解封裝?還是通過策略路由?最終到達對端是怎么解出來的?
容器網(wǎng)絡(luò)選擇和設(shè)計選擇。如果你并不清楚你的外部網(wǎng)絡(luò),或者你需要一個普適性最強的方案,假設(shè)說你對 mac 是否直連不太清楚、對外部路由器的路由表能否控制也不太清楚,那么你可以選擇 Flannel 利用 Vxlan 作為 backend 的這種方案。如果你確信你的網(wǎng)絡(luò)是 2 層可直連的,你可以進行選用 Calico 或者 Flannel-Hostgw 作為一個 backend;
最后就是對 Network Policy,在運維和使用的時候,它是一個很強大的工具,可以實現(xiàn)對進出流的精確控制。實現(xiàn)的方法我們也介紹了,要想清楚你要控制誰,然后你的流要怎么去定義。
系列文章推薦閱讀:
☆從零開始入門 K8s?|?人人都能看懂 Pod?與容器設(shè)計模式
☆從零開始入門?K8s?|?K8s?的應(yīng)用編排與管理
☆從零開始入門 K8s?|?如何實現(xiàn)應(yīng)用配置管理
推薦閱讀
xxx
站長 polarisxu
自己的原創(chuàng)文章
不限于 Go 技術(shù)
職場和創(chuàng)業(yè)經(jīng)驗
Go語言中文網(wǎng)
每天為你
分享 Go 知識
Go愛好者值得關(guān)注
