自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

聊聊 Ulti-Network Ns 在Underlay下的應(yīng)用-本手篇

云計(jì)算 云原生
對(duì)容器而言,multiple namespace 這個(gè)技術(shù)的重要性怎么強(qiáng)調(diào)都不過(guò)分。因?yàn)?namespace 的出現(xiàn),使得容器所用到的諸如 Hostname、Network、Mount Points 等資源被隔離起來(lái),由公用變成獨(dú)享。

大家好,我是二哥。

對(duì)容器而言,multiple namespace 這個(gè)技術(shù)的重要性怎么強(qiáng)調(diào)都不過(guò)分。因?yàn)?namespace 的出現(xiàn),使得容器所用到的諸如 Hostname、Network、Mount Points 等資源被隔離起來(lái),由公用變成獨(dú)享。

技術(shù)的進(jìn)步是一把雙刃劍,基于 multi namespace 的容器在幾乎重塑了云計(jì)算市場(chǎng)的形態(tài)和云計(jì)算機(jī)基礎(chǔ)設(shè)施棧的同時(shí),也給我們帶來(lái)了陡峭的學(xué)習(xí)曲線。

Network namespace 就是這樣一個(gè)例子。

今年全國(guó)新高考 Ⅰ 卷的作文題看了吧?“本手、妙手、俗手”是圍棋的三個(gè)術(shù)語(yǔ)。本手是指合乎棋理的正規(guī)下法;妙手是指出人意料的精妙下法;俗手是指貌似合理,而從全局看通常會(huì)受損的下法。對(duì)于初學(xué)者而言,應(yīng)該從本手開始,本手的功夫扎實(shí)了,棋力才會(huì)提高。一些初學(xué)者熱衷于追求妙手,而忽視更為常用的本手。本手是基礎(chǔ),妙手是創(chuàng)造。一般來(lái)說(shuō),對(duì)本手理解深刻,才可能出現(xiàn)妙手;否則,難免下出俗手,水平也不易提升。

來(lái)吧,這篇讓我們從“本手”開始。下篇我們看“妙手”部分:將本文所聊內(nèi)容稍作變形看看 multi network namespace 在 Underlay 下面是如何玩的。

multi network namespace

我們先就著下圖來(lái)看看 multi network namespace 的典型使用方式。后文統(tǒng)一將 network namespace 寫成 network ns 。

圖片

圖 1:一個(gè)包含 multi network ns 的環(huán)境

這是一個(gè)包含 multi network ns 的環(huán)境。分為三大部分:最上層為 OS ,中間是一個(gè)網(wǎng)卡(物理的或者虛擬的),最下面是網(wǎng)卡所連接的外部(物理)網(wǎng)絡(luò)。

OS 部分包含了 root network ns 以及被 Pod 使用的其它 network ns 。

OS 部分還包含了 eth 和 bridge 這樣的網(wǎng)絡(luò)設(shè)備(struct net_device)。雖然圖中不同的 network ns 中的 eth 都叫 eth0 ,但 root network ns 中的 eth0 和其它網(wǎng)絡(luò)設(shè)備有著本質(zhì)的區(qū)別:

  • root network ns 中的 eth0 是對(duì)網(wǎng)卡的軟件抽象,也就是說(shuō)它對(duì)應(yīng)的是一個(gè)外部設(shè)備,如果這個(gè)網(wǎng)卡是物理的話,eth0 還包含控制該設(shè)備的一系列函數(shù)。
  • 而圖中其它的 eth0 和 bridge 都是對(duì)根本不存在的虛擬網(wǎng)絡(luò)設(shè)備的抽象,說(shuō)白了它們就只是一些不會(huì)與外部設(shè)備打交道的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)存在的意義是為了可以最大程度上復(fù)用現(xiàn)有的代碼邏輯和功能。它們可以作為媒介用來(lái)在同一個(gè) OS 內(nèi)進(jìn)行進(jìn)程間通信、用戶態(tài)和內(nèi)核態(tài)數(shù)據(jù)交換,但無(wú)法被用于外部通信。比如我們熟知的 loopback 設(shè)備,通過(guò)它可以使本機(jī)上兩個(gè)進(jìn)程間的 socket 通信完整地走完 TCP/IP 協(xié)議棧。

network namespace

我們說(shuō) network ns 用來(lái)隔離包括網(wǎng)卡(Network Interface)、回環(huán)設(shè)備(Loopback Device)、網(wǎng)絡(luò)棧、IP 地址、端口等等在內(nèi)的網(wǎng)絡(luò)資源。它的特點(diǎn)是由可配置的數(shù)據(jù)組成。對(duì)于一個(gè)進(jìn)程來(lái)說(shuō),這些要素,其實(shí)就構(gòu)成了它發(fā)起和響應(yīng)網(wǎng)絡(luò)請(qǐng)求的基本環(huán)境。這里所謂“網(wǎng)絡(luò)棧(Networking stack)”,包括了:路由表(Routing Table), network filter,iptables 規(guī)則等。

無(wú)論是一個(gè) Linux 容器還是宿主機(jī)的進(jìn)程所能看見(jiàn)的“網(wǎng)絡(luò)?!保瑢?shí)際上是被隔離在它們各自的 network ns 當(dāng)中的,通信雙方的網(wǎng)卡(如典型的 veth pair )也自然被隔離到相應(yīng)的 namespace 中。

另外還有一個(gè)棧也會(huì)被經(jīng)常提起:TCP/IP 協(xié)議棧。我們可以將 TCP/IP 協(xié)議??闯墒浅绦虻拇a部分,而網(wǎng)絡(luò)棧看成是程序的數(shù)據(jù)部分。很顯然 TCP/IP 棧應(yīng)該是被這個(gè) OS 上所有人共享的,無(wú)論是進(jìn)程還是容器,甚至是基于 qemu-kvm 的虛擬機(jī)都共享著宿主機(jī)的協(xié)議棧,但網(wǎng)絡(luò)棧卻是各個(gè) network ns 獨(dú)享的。

二哥知道,上面的描述還是太抽象。所以我畫了下面一張圖。圖 2 把內(nèi)核中負(fù)責(zé)描述進(jìn)程的數(shù)據(jù)結(jié)構(gòu) task_struct 和 network ns 之間的結(jié)構(gòu)關(guān)系畫出來(lái)了。進(jìn)程 1 和進(jìn)程 2 共享宿主機(jī) root network ns,它包含網(wǎng)卡 eth0 。Pod 內(nèi)的容器自然位于 Pod 自己的 network ns 中。但容器本質(zhì)上也是進(jìn)程而已,雖然在圖中看起來(lái) Pod 隔離了一個(gè)完全屬于自己的 eth1,但在內(nèi)核看來(lái),一樣也是用相同的數(shù)據(jù)結(jié)構(gòu)來(lái)描述它和 network ns 之間的關(guān)系。

看完這個(gè)數(shù)據(jù)結(jié)構(gòu)示意圖,對(duì)于 TCP/IP 協(xié)議棧而言,希望下面兩點(diǎn)描述沒(méi)有讓你感到困惑:

  • 網(wǎng)絡(luò)包無(wú)論是從容器內(nèi)的網(wǎng)卡流出,還是離開容器后再與其它網(wǎng)絡(luò)設(shè)備打交道,必然都會(huì)經(jīng)過(guò)內(nèi)核 TCP/IP 協(xié)議棧。
  • 無(wú)論網(wǎng)絡(luò)包是屬于容器的還是屬于宿主機(jī) native process 的,對(duì)于內(nèi)核 TCP/IP 協(xié)議棧而言,這些網(wǎng)絡(luò)包只是屬于不同的 network ns 而已。

圖片

圖 2:network ns與task_struct結(jié)構(gòu)關(guān)系圖

網(wǎng)絡(luò)設(shè)備

你一定看到了圖 1 的 OS 部分包含網(wǎng)絡(luò)設(shè)備 eth0 和 bridge。

其中 eth0 用來(lái)描述物理網(wǎng)卡,它在內(nèi)核中用數(shù)據(jù)結(jié)構(gòu) net_device 來(lái)表示。一個(gè) net_device 里面都包含些什么呢?我將其中一些重要的部分畫在了圖 3 里面。簡(jiǎn)單來(lái)說(shuō)就是包含了用來(lái)操作這個(gè)物理網(wǎng)卡的 netdev_ops (如 set _mac / ioctl 之類),與 BSP 相關(guān)的諸如總線地址、IRQ等設(shè)置,與具體網(wǎng)卡型號(hào)相關(guān)的收/發(fā)環(huán)形隊(duì)列,還有 IP 地址設(shè)置等等。

因?yàn)?eth0 是屬于一個(gè) network ns 的,這就意味著如果有多個(gè) network ns ,就可能會(huì)出現(xiàn)多個(gè) eth0(如果都重命名為 eth0 的話)。

圖片

圖 3:net_device 所含部分內(nèi)容示意圖

bridge 又名網(wǎng)橋,是一個(gè)虛擬的二層交互機(jī)。用它來(lái)搭配虛擬網(wǎng)絡(luò)設(shè)備 veth / tap 可以模擬物理交換機(jī)以及插入其上的 RJ-45 網(wǎng)絡(luò)插頭。

在圖 4 所示的這個(gè)環(huán)境里,一個(gè)網(wǎng)橋可以組成一個(gè)簡(jiǎn)單子局域網(wǎng),插在網(wǎng)橋上的設(shè)備之間可以如物理局域網(wǎng)絡(luò)那樣相互通過(guò)二層交流。這樣的交流不需要離開 bridge ,這通常發(fā)生在位于同一個(gè) Work Node 上面的不同 Pod 之間相互通信的場(chǎng)景。

圖片

圖 4:veth + bridge 所組成的子局域網(wǎng)

而如果網(wǎng)絡(luò)包的目的 MAC 地址為網(wǎng)橋本身,并且網(wǎng)橋設(shè)置了 IP 地址的話,那么 bridge 就認(rèn)為該網(wǎng)絡(luò)包應(yīng)該是發(fā)往創(chuàng)建該網(wǎng)橋的那臺(tái)主機(jī),于是這個(gè)數(shù)據(jù)包將不會(huì)轉(zhuǎn)發(fā)到任何設(shè)備,而是直接交給上層(三層)協(xié)議棧去處理。處理的過(guò)程會(huì)涉及到基于本機(jī)路由表的路由查詢。

上述過(guò)程可以結(jié)合圖 5 來(lái)理解。例如當(dāng) Pod 想要訪問(wèn)百度的時(shí)候,請(qǐng)求就會(huì)沿著圖中紅色的線流動(dòng)。如果我們將紅線看成一個(gè)管道的話,那么 Pod 的請(qǐng)求從管道一端流入。而管道的流出端接進(jìn)了宿主機(jī)協(xié)議棧的 IP 層。在這里經(jīng)過(guò) iptables 和路由表的處理后,最終通過(guò)宿主機(jī)的 eth0 離開這臺(tái)機(jī)器。

這種情況下,如果我說(shuō)宿主機(jī)的 eth0 可以看成 bridge 的 gateway,你同意嗎?

如果你對(duì)這個(gè)細(xì)節(jié)感興趣的話,可以閱讀《當(dāng)從Pod訪問(wèn)百度時(shí)會(huì)用到VTEP嗎》。

圖片

圖 5:bridge 將 traffic 交由宿主機(jī)三層處理

讓我們把圖 5 再放大一些。把圖 5 中 network ns 里的路由表、 iptables 、eth0 、bridge 拎出來(lái)看看。看看當(dāng) bridge 處理 Pod 訪問(wèn)百度的請(qǐng)求時(shí),是如何把流量先送進(jìn) root network ns 又是如何以宿主機(jī)為 gateway 將流量送至外部網(wǎng)絡(luò)的。

圖片

圖 6:bridge 處理數(shù)據(jù)流放大示意圖

責(zé)任編輯:武曉燕 來(lái)源: 二哥聊云原生
相關(guān)推薦

2022-06-13 20:49:25

multi-Underlay

2022-06-08 19:08:32

AI押題作文

2021-02-26 14:34:49

筆記本屏幕TN

2023-12-07 08:22:58

Android應(yīng)用

2022-03-04 08:10:35

NettyIO模型Reactor

2022-08-14 15:26:05

自動(dòng)駕駛智能

2011-10-31 15:59:56

SQLiteiPhoneiOS

2020-06-04 18:30:06

二手硬件CPU主板

2013-06-28 17:47:59

移動(dòng)應(yīng)用

2022-11-26 08:16:26

2018-05-18 08:20:32

數(shù)據(jù)治理應(yīng)用

2010-05-26 18:40:54

Linux性能監(jiān)控

2017-05-19 16:35:08

SDN數(shù)據(jù)中心解決方案

2020-12-18 09:05:13

算法單調(diào)棧

2009-07-22 10:18:20

緩存服務(wù)器

2023-09-21 08:05:49

Mybatis插件開發(fā)

2023-03-26 09:08:36

2022-10-25 18:02:31

大數(shù)據(jù)存算分離

2023-07-31 07:48:43

Java內(nèi)存虛擬機(jī)

2011-08-09 15:47:46

LeveldbLinuxC++
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)