一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

036.Kubernetes集群網(wǎng)絡(luò)-K8S網(wǎng)絡(luò)模型及Linux基礎(chǔ)網(wǎng)絡(luò)

 頭號(hào)碼甲 2022-07-12 發(fā)布于北京

一 Kubernetes網(wǎng)絡(luò)模型概述

1.1 Kubernetes網(wǎng)絡(luò)模型

Kubernetes網(wǎng)絡(luò)模型設(shè)計(jì)的一個(gè)基礎(chǔ)原則是:每個(gè)Pod都擁有一個(gè)獨(dú)立的IP地址,并假定所有Pod都在一個(gè)可以直接連通的、扁平的網(wǎng)絡(luò)空間中。所以不管它們是否運(yùn)行在同一個(gè)Node(宿主機(jī))中,都要求它們可以直接通過對(duì)方的IP進(jìn)行訪問。設(shè)計(jì)這個(gè)原則的原因是,用戶不需要額外考慮如何建立Pod之間的連接,也不需要考慮如何將容器端口映射到主機(jī)端口等問題。
實(shí)際上,在Kubernetes的集群里,IP是以Pod為單位進(jìn)行分配的。一個(gè)Pod內(nèi)部的所有容器共享一個(gè)網(wǎng)絡(luò)堆棧(相當(dāng)于一個(gè)網(wǎng)絡(luò)命名空間,它們的IP地址、網(wǎng)絡(luò)設(shè)備、配置等都是共享的)。按照這個(gè)網(wǎng)絡(luò)原則抽象出來的為每個(gè)Pod都設(shè)置一個(gè)IP地址的模型也被稱作IP-per-Pod模型。
由于Kubernetes的網(wǎng)絡(luò)模型假設(shè)Pod之間訪問時(shí)使用的是對(duì)方Pod的實(shí)際地址,所以一個(gè)Pod內(nèi)部的應(yīng)用程序看到的自己的IP地址和端口與集群內(nèi)其他Pod看到的一樣。它們都是Pod實(shí)際分配的IP地址。將IP地址和端口在Pod內(nèi)部和外部都保持一致,也就不需要使用NAT來進(jìn)行地址轉(zhuǎn)換了。
Kubernetes的網(wǎng)絡(luò)之所以這么設(shè)計(jì),主要原因就是可以兼容過去的應(yīng)用。當(dāng)然,我們使用Linux命令“ipaddrshow”也能看到這些地址,和程序看到的沒有什么區(qū)別。所以這種IP-per-Pod的方案很好地利用了現(xiàn)有的各種域名解析和發(fā)現(xiàn)機(jī)制。
為每個(gè)Pod都設(shè)置一個(gè)IP地址的模型還有另外一層含義,那就是同一個(gè)Pod內(nèi)的不同容器會(huì)共享同一個(gè)網(wǎng)絡(luò)命名空間,也就是同一個(gè)Linux網(wǎng)絡(luò)協(xié)議棧。這就意味著同一個(gè)Pod內(nèi)的容器可以通過localhost來連接對(duì)方的端口。這種關(guān)系和同一個(gè)VM內(nèi)的進(jìn)程之間的關(guān)系是一樣的,看起來Pod內(nèi)容器之間的隔離性減小了,而且Pod內(nèi)不同容器之間的端口是共享的,就沒有所謂的私有端口的概念了。如果應(yīng)用必須要使用一些特定的端口范圍,那么也可以為這些應(yīng)用單獨(dú)創(chuàng)建一些Pod。反之,對(duì)那些沒有特殊需要的應(yīng)用,由于Pod內(nèi)的容器是共享部分資源的,所以可以通過共享資源互相通信,這顯然更加容易和高效。針對(duì)這些應(yīng)用,雖然損失了可接受范圍內(nèi)的部分隔離性,卻也是值得的。
IP-per-Pod模式和Docker原生的通過動(dòng)態(tài)端口映射方式實(shí)現(xiàn)的多節(jié)點(diǎn)訪問模式有如下差別:
  • 主要區(qū)別是后者的動(dòng)態(tài)端口映射會(huì)引入端口管理的復(fù)雜性,而且訪問者看到的IP地址和端口與服務(wù)提供者實(shí)際綁定的不同(因?yàn)镹AT的緣故,它們都被映射成新的地址或端口了),這也會(huì)引起應(yīng)用配置的復(fù)雜化。
  • 同時(shí),標(biāo)準(zhǔn)的DNS等名字解析服務(wù)也不適用了,甚至服務(wù)注冊(cè)和發(fā)現(xiàn)機(jī)制都比較復(fù)雜,因?yàn)樵诙丝谟成淝闆r下,服務(wù)自身很難知道自己對(duì)外暴露的真實(shí)的服務(wù)IP和端口,外部應(yīng)用也無法通過服務(wù)所在容器的私有IP地址和端口來訪問服務(wù)。
總的來說,IP-per-Pod模型是一個(gè)簡(jiǎn)單的兼容性較好的模型。從該模型的網(wǎng)絡(luò)的端口分配、域名解析、服務(wù)發(fā)現(xiàn)、負(fù)載均衡、應(yīng)用配置和遷移等角度來看,Pod都能夠被看作一臺(tái)獨(dú)立的虛擬機(jī)或物理機(jī)。
按照這個(gè)網(wǎng)絡(luò)抽象原則,Kubernetes對(duì)網(wǎng)絡(luò)有如下要求。
  1. 所有容器都可以在不用NAT的方式下同別的容器通信。
  2. 所有節(jié)點(diǎn)都可以在不用NAT的方式下同所有容器通信,反之亦然。
  3. 容器的地址和別人看到的地址是同一個(gè)地址。
這些基本要求意味著并不是只要兩臺(tái)機(jī)器都運(yùn)行Docker,Kubernetes就可以工作了。具體的集群網(wǎng)絡(luò)實(shí)現(xiàn)必須滿足上述基本要求,原生的Docker網(wǎng)絡(luò)目前還不能很好地支持這些要求。
實(shí)際上,這些對(duì)網(wǎng)絡(luò)模型的要求并沒有降低整個(gè)網(wǎng)絡(luò)系統(tǒng)的復(fù)雜度。如果程序原來在VM上運(yùn)行,而那些VM擁有獨(dú)立IP,并且它們之間可以直接透明地通信,那么Kubernetes的網(wǎng)絡(luò)模型就和VM使用的網(wǎng)絡(luò)模型一樣。所以使用這種模型可以很容易地將已有的應(yīng)用程序從VM或者物理機(jī)遷移到容器上。
當(dāng)然,谷歌設(shè)計(jì)Kubernetes的一個(gè)主要運(yùn)行基礎(chǔ)就是其公有云GCE,GCE默認(rèn)支持這些網(wǎng)絡(luò)要求。另外,常見的其他公有云服務(wù)商如亞馬遜等,其公有云環(huán)境也支持這些網(wǎng)絡(luò)要求。
由于部署私有云的場(chǎng)景也非常普遍,所以在私有云中運(yùn)行Kubernetes+Docker集群之前,需要自己搭建出符合Kubernetes要求的網(wǎng)絡(luò)環(huán)境。有很多開源組件可以幫助我們打通Docker容器和容器之間的網(wǎng)絡(luò),實(shí)現(xiàn)滿足Kubernetes要求的網(wǎng)絡(luò)模型。當(dāng)然,每種方案都有適合的場(chǎng)景,需要根據(jù)自己的實(shí)際需要進(jìn)行選擇。
提示:Kubernetes的網(wǎng)絡(luò)依賴于Docker,Docker的網(wǎng)絡(luò)又離不開Linux操作系統(tǒng)內(nèi)核特性的支持。

二 Docker網(wǎng)絡(luò)基礎(chǔ)

Docker本身的技術(shù)依賴于近年來Linux內(nèi)核虛擬化技術(shù)的發(fā)展,所以Docker對(duì)Linux內(nèi)核的特性有很強(qiáng)的依賴。Docker通常使用到的與Linux網(wǎng)絡(luò)有關(guān)的主要技術(shù)有:網(wǎng)絡(luò)命名空間(Network Namespace)、Veth設(shè)備對(duì)、網(wǎng)橋、ipatables和路由。

2.1 網(wǎng)絡(luò)命名空間

為了支持網(wǎng)絡(luò)協(xié)議棧的多個(gè)實(shí)例,Linux在網(wǎng)絡(luò)棧中引入了網(wǎng)絡(luò)命名空間,這些獨(dú)立的協(xié)議棧被隔離到不同的命名空間中。
處于不同命名空間中的網(wǎng)絡(luò)棧是完全隔離的,彼此之間無法通信。通過對(duì)網(wǎng)絡(luò)資源的隔離,就能在一個(gè)宿主機(jī)上虛擬多個(gè)不同的網(wǎng)絡(luò)環(huán)境。Docker正是利用了網(wǎng)絡(luò)的命名空間特性,實(shí)現(xiàn)了不同容器之間的網(wǎng)絡(luò)隔離。在Linux的網(wǎng)絡(luò)命名空間中可以有自己獨(dú)立的路由表及獨(dú)立的iptables設(shè)置來提供包轉(zhuǎn)發(fā)、NAT及IP包過濾等功能。
為了隔離出獨(dú)立的協(xié)議棧,需要納入命名空間的元素有進(jìn)程、套接字、網(wǎng)絡(luò)設(shè)備等。進(jìn)程創(chuàng)建的套接字必須屬于某個(gè)命名空間,套接字的操作也必須在命名空間中進(jìn)行。同樣,網(wǎng)絡(luò)設(shè)備也必須屬于某個(gè)命名空間。因?yàn)榫W(wǎng)絡(luò)設(shè)備屬于公共資源,所以可以通過修改屬性實(shí)現(xiàn)在命名空間之間移動(dòng)。
  • 網(wǎng)絡(luò)命名空間的實(shí)現(xiàn)
Linux的網(wǎng)絡(luò)協(xié)議棧相對(duì)復(fù)雜,為了支持獨(dú)立的協(xié)議棧,相關(guān)的這些全局變量都必須被修改為協(xié)議棧私有。最好的辦法就是讓這些全局變量成為一個(gè)Net Namespace變量的成員,然后為協(xié)議棧的函數(shù)調(diào)用加入一個(gè)Namespace參數(shù)。這就是Linux實(shí)現(xiàn)網(wǎng)絡(luò)命名空間的核心。
同時(shí),為了保證對(duì)已經(jīng)開發(fā)的應(yīng)用程序及內(nèi)核代碼的兼容性,內(nèi)核代碼隱式地使用了命名空間中的變量。程序如果沒有對(duì)命名空間有特殊需求,就不需要編寫額外的代碼,網(wǎng)絡(luò)命名空間對(duì)應(yīng)用程序而言是透明的。
在建立了新的網(wǎng)絡(luò)命名空間,并將某個(gè)進(jìn)程關(guān)聯(lián)到這個(gè)網(wǎng)絡(luò)命名空間后,就出現(xiàn)了類似于下圖所示的內(nèi)核數(shù)據(jù)結(jié)構(gòu),所有網(wǎng)站棧變量都被放入了網(wǎng)絡(luò)命名空間的數(shù)據(jù)結(jié)構(gòu)中。這個(gè)網(wǎng)絡(luò)命名空間是其進(jìn)程組私有的,和其他進(jìn)程組不沖突。
clipboard
在新生成的私有命名空間中只有回環(huán)設(shè)備(名為“l(fā)o”且是停止?fàn)顟B(tài)),其他設(shè)備默認(rèn)都不存在,若需要其他設(shè)備,則要手工建立。
從網(wǎng)絡(luò)角度,每個(gè)namespace提供了一份獨(dú)立的網(wǎng)絡(luò)協(xié)議棧(網(wǎng)絡(luò)設(shè)備接口、IPV4、IPV6、IP路由、防火墻規(guī)則、sockets等)。一個(gè)設(shè)備(Linux Device)只能位于一個(gè)namespace中,不同namespace中的設(shè)備可以利用veth pair進(jìn)行橋接。
clipboard
namespace可實(shí)現(xiàn)隔離的資源:
資源
含義
uts_ns
UTS為Unix Timessharing System的簡(jiǎn)稱,包含內(nèi)存名稱、腳本、版本、底層體系結(jié)構(gòu)等信息。
ipc_ns
所有與進(jìn)程通信(IPC)有關(guān)的信心。
nmt_ns
當(dāng)前裝載的文件系統(tǒng)。
pid_ns
有關(guān)進(jìn)程ID的信息。
user_ns
資源配額的信息。
net_ns
網(wǎng)絡(luò)信息。
Docker容器中的各類網(wǎng)絡(luò)棧設(shè)備都是Docker Daemon在啟動(dòng)時(shí)自動(dòng)創(chuàng)建和配置的。
所有的網(wǎng)絡(luò)設(shè)備(物理的或虛擬接口、橋等在內(nèi)核里都叫作NetDevice)都只能屬于一個(gè)命名空間。
注意,物理設(shè)備(連接實(shí)際硬件的設(shè)備)通常只能關(guān)聯(lián)到root這個(gè)命名空間中。虛擬的網(wǎng)絡(luò)設(shè)備(虛擬的以太網(wǎng)接口或者虛擬網(wǎng)口對(duì))則可以被創(chuàng)建并關(guān)聯(lián)到一個(gè)給定的命名空間中,而且可以在這些命名空間之間移動(dòng)。
同時(shí),由于網(wǎng)絡(luò)命名空間代表的是一個(gè)獨(dú)立的協(xié)議棧,所以它們之間是相互隔離的,彼此無法通信,在協(xié)議棧內(nèi)部都看不到對(duì)方。
若需要打破這種限制,讓處于不同命名空間的網(wǎng)絡(luò)相互通信,甚至和外部的網(wǎng)絡(luò)進(jìn)行通信,則需要應(yīng)用Veth設(shè)備對(duì)。Veth設(shè)備對(duì)的一個(gè)重要作用就是打通互相看不到的協(xié)議棧之間的壁壘,類似一個(gè)通道,一端連著這個(gè)網(wǎng)絡(luò)命名空間的協(xié)議棧,一端連著另一個(gè)網(wǎng)絡(luò)命名空間的協(xié)議棧。所以如果想在兩個(gè)命名空間之間通信,就必須有一個(gè)Veth設(shè)備對(duì)。
  • 網(wǎng)絡(luò)命名空間操作
如下命令需要使用root用戶執(zhí)行,同時(shí)需要iproute軟件包提供相關(guān)命令。
  1 [root@k8smaster01 ~]# ip netns add mytestns			#創(chuàng)建命名空間
  2 [root@k8smaster01 ~]# ip netns exec mytestns <command>	#進(jìn)入命名空間bash
  3 [root@k8smaster01 ~]# ip netns exec mytestns bash		#進(jìn)入命名空間bash
  4 [root@k8smaster01 ~]# exit					#退出命名空間
  5 [root@k8smaster01 ~]# ip link set <device> netns mytestns	#轉(zhuǎn)移設(shè)備
注意:因?yàn)橐粋€(gè)設(shè)備只能屬于一個(gè)命名空間,所以轉(zhuǎn)移后在這個(gè)命名空間中就看不到這個(gè)設(shè)備了。在設(shè)備里面有一個(gè)重要的屬性:NETIF_F_ETNS_LOCAL,如果這個(gè)屬性為on,就不能被轉(zhuǎn)移到其他命名空間中。Veth設(shè)備屬于可以轉(zhuǎn)移的設(shè)備,而很多其他設(shè)備如lo設(shè)備、vxlan設(shè)備、ppp設(shè)備、bridge設(shè)備等都是不可以轉(zhuǎn)移的。

2.2 Veth設(shè)備對(duì)

引入Veth設(shè)備對(duì)是為了在不同的網(wǎng)絡(luò)命名空間之間通信,利用它可以直接將兩個(gè)網(wǎng)絡(luò)命名空間連接起來。由于要連接兩個(gè)網(wǎng)絡(luò)命名空間,所以Veth設(shè)備都是成對(duì)出現(xiàn)的,很像一對(duì)以太網(wǎng)卡,并且中間有一根直連的網(wǎng)線。通常將其中一端稱為另一端的peer。
在Veth設(shè)備的一端發(fā)送數(shù)據(jù)時(shí),它會(huì)將數(shù)據(jù)直接發(fā)送到另一端,并觸發(fā)另一端的接收操作。Veth設(shè)備對(duì)的示意圖如下:
1575105169
  • veth pair操作
  1 [root@k8smaster01 ~]# ip link add veth0 type veth peer name veth1	#創(chuàng)建veth設(shè)備對(duì)
  2 [root@k8smaster01 ~]# ip link show | grep veth			#當(dāng)前查看veth
  3 [root@k8smaster01 ~]# ip netns add ns0
  4 [root@k8smaster01 ~]# ip netns add ns1				#創(chuàng)建命名空間
  5 [root@k8smaster01 ~]# ip link set veth0 netns ns0
  6 [root@k8smaster01 ~]# ip link set veth1 netns ns1			#veth移入命名空間
  7 [root@k8smaster01 ~]# ip netns exec ns0 ip link show		#進(jìn)入命名空間查看veth
  8 [root@k8smaster01 ~]# ip netns exec ns0 ip addr add local 192.168.10.1/24 dev veth0
  9 [root@k8smaster01 ~]# ip netns exec ns1 ip addr add local 192.168.10.2/24 dev veth1	#設(shè)置對(duì)應(yīng)的IP
 10 [root@k8smaster01 ~]# ip netns exec ns0 ifconfig veth0 up
 11 [root@k8smaster01 ~]# ip netns exec ns1 ifconfig veth1 up		#開啟設(shè)備
 12 [root@k8smaster01 ~]# ip netns exec ns0 ping 192.168.10.2		#連通性測(cè)試
clipboard
提示:在Docker內(nèi)部,Veth設(shè)備對(duì)也是連通容器與宿主機(jī)的主要網(wǎng)絡(luò)設(shè)備。
  1 [root@k8smaster01 ~]# ip netns exec ns0 ethtool -S veth0
  2 NIC statistics:
  3      peer_ifindex: 9
  4 [root@k8smaster01 ~]# ip netns exec ns1 ip link | grep 9
clipboard

2.3 網(wǎng)橋

Linux可以支持多個(gè)不同的網(wǎng)絡(luò),它們之間能夠相互通信,可通過網(wǎng)橋?qū)⑦@些網(wǎng)絡(luò)連接起來并實(shí)現(xiàn)各網(wǎng)絡(luò)中主機(jī)的相互通信。
網(wǎng)橋是一個(gè)二層的虛擬網(wǎng)絡(luò)設(shè)備,把若干個(gè)網(wǎng)絡(luò)接口“連接”起來,以使得網(wǎng)絡(luò)接口之間的報(bào)文能夠互相轉(zhuǎn)發(fā)。網(wǎng)橋能夠解析收發(fā)的報(bào)文,讀取目標(biāo)MAC地址的信息,和自己記錄的MAC表結(jié)合,來決策報(bào)文的轉(zhuǎn)發(fā)目標(biāo)網(wǎng)絡(luò)接口。
為了實(shí)現(xiàn)轉(zhuǎn)發(fā)功能,網(wǎng)橋?qū)W習(xí)源MAC地址(二層網(wǎng)橋轉(zhuǎn)發(fā)的依據(jù)就是MAC地址)。在轉(zhuǎn)發(fā)報(bào)文時(shí),網(wǎng)橋只需要向特定的網(wǎng)口進(jìn)行轉(zhuǎn)發(fā),來避免不必要的網(wǎng)絡(luò)交互。如果接受到未學(xué)習(xí)到的地址,就無法知道這個(gè)報(bào)文應(yīng)該向哪個(gè)網(wǎng)絡(luò)接口轉(zhuǎn)發(fā),就將報(bào)文廣播給所有的網(wǎng)絡(luò)接口(報(bào)文來源的網(wǎng)絡(luò)接口除外)。
在實(shí)際的網(wǎng)絡(luò)中,網(wǎng)絡(luò)拓?fù)淙舫霈F(xiàn)改變,如設(shè)備被移動(dòng)到另一個(gè)端口上,卻沒有發(fā)送任何數(shù)據(jù),網(wǎng)橋設(shè)備就無法感知到這個(gè)變化,網(wǎng)橋還是向原來的端口轉(zhuǎn)發(fā)數(shù)據(jù)包,在這種情況下數(shù)據(jù)就會(huì)丟失。所以網(wǎng)橋還要對(duì)學(xué)習(xí)到的MAC地址表加上超時(shí)時(shí)間(默認(rèn)為5min)。如果網(wǎng)橋收到了對(duì)應(yīng)端口MAC地址回發(fā)的包,則重置超時(shí)時(shí)間,否則過了超時(shí)時(shí)間后,就認(rèn)為設(shè)備已經(jīng)不在那個(gè)端口上了,它就會(huì)重新廣播發(fā)送。
對(duì)于多網(wǎng)卡、多虛擬的設(shè)備,Linux的網(wǎng)橋提供了在這些設(shè)備之間互相轉(zhuǎn)發(fā)數(shù)據(jù)的二層設(shè)備。Linux內(nèi)核支持網(wǎng)口的橋接(目前只支持以太網(wǎng)接口)。但是與單純的交換機(jī)不同,交換機(jī)只是一個(gè)二層設(shè)備,對(duì)于接收到的報(bào)文,要么轉(zhuǎn)發(fā),要么丟棄。運(yùn)行著Linux內(nèi)核的機(jī)器本身就是一臺(tái)主機(jī),有可能是網(wǎng)絡(luò)報(bào)文的目的地,其收到的報(bào)文除了轉(zhuǎn)發(fā)和丟棄,還可能被送到網(wǎng)絡(luò)協(xié)議棧的上層(網(wǎng)絡(luò)層),從而被自己(這臺(tái)主機(jī)本身的協(xié)議棧)消化,所以既可以把網(wǎng)橋看作一個(gè)二層設(shè)備,也可以把它看作一個(gè)三層設(shè)備。
  • Linux網(wǎng)橋的實(shí)現(xiàn)
Linux內(nèi)核是通過一個(gè)虛擬的網(wǎng)橋設(shè)備(Net Device)來實(shí)現(xiàn)橋接的。這個(gè)虛擬設(shè)備可以綁定若干個(gè)以太網(wǎng)接口設(shè)備,從而將它們橋接起來。如下圖所示,這種Net Device網(wǎng)橋和普通的設(shè)備不同,最明顯的一個(gè)特性是還可以有一個(gè)IP地址。
clipboard
如上圖所示,網(wǎng)橋設(shè)備br0綁定了eth0和eth1。對(duì)于網(wǎng)絡(luò)協(xié)議棧的上層來說,只看得到br0就行。因?yàn)闃蚪邮窃跀?shù)據(jù)鏈路層實(shí)現(xiàn)的,上層不需要關(guān)心橋接的細(xì)節(jié),所以協(xié)議棧上層需要發(fā)送的報(bào)文被送到br0,網(wǎng)橋設(shè)備的處理代碼判斷報(bào)文該被轉(zhuǎn)發(fā)到eth0還是eth1,或者兩者皆轉(zhuǎn)發(fā);反之,從eth0或從eth1接收到的報(bào)文被提交給網(wǎng)橋的處理代碼,在這里會(huì)判斷報(bào)文應(yīng)該被轉(zhuǎn)發(fā)、丟棄還是被提交到協(xié)議棧上層。而有時(shí)eth0、eth1也可能會(huì)作為報(bào)文的源地址或目的地址,直接參與報(bào)文的發(fā)送與接收,從而繞過網(wǎng)橋。
  • 網(wǎng)橋的常用操作命令
Docker自動(dòng)完成了對(duì)網(wǎng)橋的創(chuàng)建和維護(hù)。
新增一個(gè)網(wǎng)橋設(shè)備:
[root@k8smaster01 ~]# brctl #查看brctl模塊
clipboard
提示:可通過# yum -y install bridge-utils安裝brctl。
為網(wǎng)橋增加網(wǎng)口,在Linux中,一個(gè)網(wǎng)口其實(shí)就是一個(gè)物理網(wǎng)卡。
clipboard
  1 [root@k8smaster01 ~]# ip link add tap1 type veth peer name tap1_peer
  2 [root@k8smaster01 ~]# ip link add tap2 type veth peer name tap2_peer
  3 [root@k8smaster01 ~]# ip link add tap3 type veth peer name tap3_peer
  4 [root@k8smaster01 ~]# ip link add tap4 type veth peer name tap4_peer
  5 #創(chuàng)建veth pair
  6 [root@k8smaster01 ~]# ip netns add ns1
  7 [root@k8smaster01 ~]# ip netns add ns2
  8 [root@k8smaster01 ~]# ip netns add ns3
  9 [root@k8smaster01 ~]# ip netns add ns4
 10 #創(chuàng)建namespace
 11 [root@k8smaster01 ~]# ip link set tap1 netns ns1
 12 [root@k8smaster01 ~]# ip link set tap2 netns ns2
 13 [root@k8smaster01 ~]# ip link set tap3 netns ns3
 14 [root@k8smaster01 ~]# ip link set tap4 netns ns4
 15 #tap和namespace關(guān)聯(lián)
 16 [root@k8smaster01 ~]# brctl addbr br1		#創(chuàng)建橋
 17 [root@k8smaster01 ~]# brctl addif br1 tap1_peer
 18 [root@k8smaster01 ~]# brctl addif br1 tap2_peer
 19 [root@k8smaster01 ~]# brctl addif br1 tap3_peer
 20 [root@k8smaster01 ~]# brctl addif br1 tap4_peer
 21 #把相應(yīng)的tap添加至bright中
 22 [root@k8smaster01 ~]# ip netns exec ns1 ip addr add local 192.168.20.1/24 dev tap1
 23 [root@k8smaster01 ~]# ip netns exec ns2 ip addr add local 192.168.20.2/24 dev tap2
 24 [root@k8smaster01 ~]# ip netns exec ns3 ip addr add local 192.168.20.3/24 dev tap3
 25 [root@k8smaster01 ~]# ip netns exec ns4 ip addr add local 192.168.20.4/24 dev tap4
 26 #配置相應(yīng)IP地址
 27 [root@k8smaster01 ~]# ip link set br1 up
 28 [root@k8smaster01 ~]# ip link set tap1_peer up
 29 [root@k8smaster01 ~]# ip link set tap2_peer up
 30 [root@k8smaster01 ~]# ip link set tap3_peer up
 31 [root@k8smaster01 ~]# ip link set tap4_peer up
 32 [root@k8smaster01 ~]# ip netns exec ns1 ip link set tap1 up
 33 [root@k8smaster01 ~]# ip netns exec ns2 ip link set tap2 up
 34 [root@k8smaster01 ~]# ip netns exec ns3 ip link set tap3 up
 35 [root@k8smaster01 ~]# ip netns exec ns4 ip link set tap4 up
 36 #將bright和tap設(shè)置為up
 37 [root@k8smaster01 ~]# ip netns exec ns1 ping 192.168.20.2		#互ping
clipboard
提示:若物理網(wǎng)卡作為網(wǎng)橋的一個(gè)網(wǎng)口,則此物理網(wǎng)卡將在鏈路層工作(是一個(gè)純鏈路層設(shè)備),就不再需要IP地址了,可以取消物理網(wǎng)卡的IP,給網(wǎng)橋配置一個(gè)IP地址。

2.4 iptables和Netfilter

Linux提供了一套機(jī)制來為用戶實(shí)現(xiàn)自定義的數(shù)據(jù)包處理過程。在Linux網(wǎng)絡(luò)協(xié)議棧中有一組回調(diào)函數(shù)掛接點(diǎn),通過這些掛接點(diǎn)掛接的鉤子函數(shù)可以在Linux網(wǎng)絡(luò)棧處理數(shù)據(jù)包的過程中對(duì)數(shù)據(jù)包進(jìn)行一些操作,例如過濾、修改、丟棄等。
整個(gè)掛接點(diǎn)技術(shù)叫作Netfilter和iptables。Netfilter負(fù)責(zé)在內(nèi)核中執(zhí)行各種掛接的規(guī)則,運(yùn)行在內(nèi)核模式中;而iptables是在用戶模式下運(yùn)行的進(jìn)程,負(fù)責(zé)協(xié)助和維護(hù)內(nèi)核中Netfilter的各種規(guī)則表。二者互相配合來實(shí)現(xiàn)整個(gè)Linux網(wǎng)絡(luò)協(xié)議棧中靈活的數(shù)據(jù)包處理機(jī)制。
  • iptables規(guī)則
iptables內(nèi)置三張表:filter、nat和mangle。
  • filter:實(shí)現(xiàn)防火墻功能;
  • nat:實(shí)現(xiàn)NAT功能;
  • mangle:實(shí)現(xiàn)流量整形。
iptables三張表,或三條鏈(chain),也是三種策略(policy)。這類策略,由不同規(guī)則(rule)串聯(lián)而成。
提示:更多iptables知識(shí)參考:https://wiki./index.php/Iptables_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)。
規(guī)則示例:iptables - A INPUT - i ethO -p icmp -j ACCEPT
解釋:允許所有從 ethO 端口進(jìn)入且協(xié)議是 ICMP 的報(bào)文可以接受(可以進(jìn)入下一個(gè)流程)。
規(guī)則的本質(zhì)是對(duì)進(jìn)入的IP報(bào)文進(jìn)行說明,如:符合什么樣的條件(比如本條命令的條件是“允許所有從eth0端口進(jìn)入且協(xié)議是 ICPM 的報(bào)文”)、做什么樣的處理(比如本條命令的處理是“接受”,可以進(jìn)入下一個(gè)流程)。
查看系統(tǒng)中已有規(guī)則的方法如下。
  • iptables-save: 按照命令的方式打印iptables的內(nèi)容。
  • iptables-vnL: 以另一種格式顯示Netfilter表的內(nèi)容。
  • Netfilter規(guī)則
iptables可以定義多種策略/規(guī)則,所有規(guī)則最終會(huì)傳遞到內(nèi)核netfilter模塊,netfilter模塊會(huì)根據(jù)這些規(guī)則做相應(yīng)的處理。
netfilter的處理方式是:從報(bào)文進(jìn)入本機(jī)( linux host 或 vm)的那一刻起,到報(bào)文離開本機(jī)的那一刻止,中間這段時(shí)間(或者是發(fā)自本機(jī)的報(bào)文,從報(bào)文準(zhǔn)備發(fā)送的那一刻,到報(bào)文離開本機(jī)的那一刻止,中間這段時(shí)間),netfilter 會(huì)在ABCDE時(shí)刻點(diǎn)插入處理模塊,這些處理模塊根據(jù)相應(yīng)的策略/規(guī)則對(duì)報(bào)文進(jìn)行處理。
對(duì)于 nat 、 filter 、 mangle 三張表也可以這么理解:僅僅是為了達(dá)到不同的目的(功能)而實(shí)現(xiàn)的三個(gè)模塊而已 。
Netfilter可以掛接的規(guī)則點(diǎn)有5個(gè),如下圖所示:
clipboard
在這些時(shí)刻點(diǎn)中,iptables三張表(模塊)并不是所有的時(shí)刻都全部進(jìn)行處理。在同一個(gè)時(shí)刻點(diǎn),也可以有多個(gè)模塊進(jìn)行處理,對(duì)于不同模塊誰先處理,誰后處理,可參考如下順序。
clipboard
解釋:
  1. PREROUTING:報(bào)文進(jìn)入網(wǎng)絡(luò)接口尚未進(jìn)入路由之前的時(shí)刻;
  2. INPUT:路由判斷是本機(jī)接收的報(bào)文,準(zhǔn)備從內(nèi)核空間進(jìn)入到用戶空間的時(shí)刻;
  3. FORWARD:路由判斷不是本機(jī)接收的報(bào)文,需要路由轉(zhuǎn)發(fā),路由轉(zhuǎn)發(fā)的那個(gè)時(shí)刻;
  4. OUTPUT:本機(jī)報(bào)文需要發(fā)出去 經(jīng)過路由判斷選擇好端口以后,準(zhǔn)備發(fā)送的那一刻 ;
  5. POSTROUTING:FORWARD/OUTPUT 已經(jīng)完成,報(bào)文即將出網(wǎng)絡(luò)接口的那一刻 。
三張表所能對(duì)應(yīng)的時(shí)刻點(diǎn)如下:
表名
時(shí)刻點(diǎn)
mangle
PREROUTING, INPUT, FORWARD, OUTPUT
nat
PREROUTING, OUTPUT, POSTROUTING
filter
INPUT, FORWARD, OUTPUT

2.5 路由

Linux系統(tǒng)包含一個(gè)完整的路由功能。當(dāng)IP層在處理數(shù)據(jù)發(fā)送或者轉(zhuǎn)發(fā)時(shí),會(huì)使用路由表來決定發(fā)往哪里。在通常情況下,如果主機(jī)與目的主機(jī)直接相連,那么主機(jī)可以直接發(fā)送IP報(bào)文到目的主機(jī),這個(gè)過程比較簡(jiǎn)單。例如,通過點(diǎn)對(duì)點(diǎn)的鏈接或網(wǎng)絡(luò)共享。如果主機(jī)與目的主機(jī)沒有直接相連,那么主機(jī)會(huì)將IP報(bào)文發(fā)送給默認(rèn)的路由器,然后由路由器來決定往哪里發(fā)送IP報(bào)文。
路由功能由IP層維護(hù)的一張路由表來實(shí)現(xiàn)。當(dāng)主機(jī)收到數(shù)據(jù)報(bào)文時(shí),它用此表來決策接下來應(yīng)該做什么操作。當(dāng)從網(wǎng)絡(luò)側(cè)接收到數(shù)據(jù)報(bào)文時(shí),IP層首先會(huì)檢查報(bào)文的IP地址是否與主機(jī)自身的地址相同。如果數(shù)據(jù)報(bào)文中的IP地址是主機(jī)自身的地址,那么報(bào)文將被發(fā)送到傳輸層相應(yīng)的協(xié)議中。如果報(bào)文中的IP地址不是主機(jī)自身的地址,并且主機(jī)配置了路由功能,那么報(bào)文將被轉(zhuǎn)發(fā),否則,報(bào)文將被丟棄。
路由表中的數(shù)據(jù)一般是以條目形式存在的。一個(gè)典型的路由表?xiàng)l目通常包含以下主要的條目項(xiàng)。
  1. 目的IP地址:此字段表示目標(biāo)的IP地址。這個(gè)IP地址可以是某主機(jī)的地址,也可以是一個(gè)網(wǎng)絡(luò)地址。如果這個(gè)條目包含的是一個(gè)主機(jī)地址,那么它的主機(jī)ID將被標(biāo)記為非零;如果這個(gè)條目包含的是一個(gè)網(wǎng)絡(luò)地址,那么它的主機(jī)ID將被標(biāo)記為零。
  2. 下一跳路由器的IP地址:若并非最終目的的路由器,則該條目給出的下一個(gè)路由器的地址用來轉(zhuǎn)發(fā)在相應(yīng)接口接收到的IP數(shù)據(jù)報(bào)文。
  3. 標(biāo)志:這個(gè)字段提供了另一組重要信息,例如,目的IP地址是一個(gè)主機(jī)地址還是一個(gè)網(wǎng)絡(luò)地址。此外,從標(biāo)志中可以得知下一個(gè)路由器是一個(gè)真實(shí)路由器還是一個(gè)直接相連的接口。
  4. 網(wǎng)絡(luò)接口規(guī)范:為一些數(shù)據(jù)報(bào)文的網(wǎng)絡(luò)接口規(guī)范,該規(guī)范將與報(bào)文一起被轉(zhuǎn)發(fā)。

在通過路由表轉(zhuǎn)發(fā)時(shí),如果任何條目的第1個(gè)字段完全匹配目的IP地址(主機(jī))或部分匹配條目的IP地址(網(wǎng)絡(luò)),它將指示下一個(gè)路由器的IP地址。條目中的所有其他字段將提供更多的輔助信息來為路由轉(zhuǎn)發(fā)做決定。
如果沒有找到一個(gè)完全匹配的IP,就接著搜索相匹配的網(wǎng)絡(luò)ID。如果找到,那么該數(shù)據(jù)報(bào)文會(huì)被轉(zhuǎn)發(fā)到指定的路由器上??梢钥闯?,網(wǎng)絡(luò)上的所有主機(jī)都通過這個(gè)路由表中的單個(gè)(這個(gè))條目進(jìn)行管理。
如果上述兩個(gè)條件都不匹配,那么該數(shù)據(jù)報(bào)文將被轉(zhuǎn)發(fā)到一個(gè)默認(rèn)的路由器上。
如果上述步驟都失敗,默認(rèn)路由器也不存在,那么該數(shù)據(jù)報(bào)文最終無法被轉(zhuǎn)發(fā)。任何無法投遞的數(shù)據(jù)報(bào)文都將產(chǎn)生一個(gè)ICMP主機(jī)不可達(dá)或ICMP網(wǎng)絡(luò)不可達(dá)的錯(cuò)誤,并將此錯(cuò)誤返回給生成此數(shù)據(jù)報(bào)文的應(yīng)用程序。

  • 路由表的創(chuàng)建
Linux的路由表至少包括兩個(gè)表(當(dāng)啟用策略路由時(shí),還會(huì)有其他表):一個(gè)是LOCAL,另一個(gè)是MAIN。
在LOCAL表中會(huì)包含所有的本地設(shè)備地址。LOCAL路由表是在配置網(wǎng)絡(luò)設(shè)備地址時(shí)自動(dòng)創(chuàng)建的。LOCAL表用于供Linux協(xié)議棧識(shí)別本地地址,以及進(jìn)行本地各個(gè)不同網(wǎng)絡(luò)接口之間的數(shù)據(jù)轉(zhuǎn)發(fā)。
[root@k8smaster01 ~]# ip route show table local type local #查看LOCAL表的內(nèi)容
clipboard
MAIN表用于各類網(wǎng)絡(luò)IP地址的轉(zhuǎn)發(fā)。它的建立既可以使用靜態(tài)配置生成,也可以使用動(dòng)態(tài)路由發(fā)現(xiàn)協(xié)議生成。動(dòng)態(tài)路由發(fā)現(xiàn)協(xié)議一般使用組播功能來通過發(fā)送路由發(fā)現(xiàn)數(shù)據(jù),動(dòng)態(tài)地交換和獲取網(wǎng)絡(luò)的路由信息,并更新到路由表中。
Linux下支持路由發(fā)現(xiàn)協(xié)議的開源軟件有許多,常用的有Quagga、Zebra等。
  • 路由表的查看
可以使用ip route list命令查看當(dāng)前的路由表:
[root@k8smaster01 ~]# ip route list
netstat -rn是另一個(gè)查看路由表的工具:
clipboard
在它顯示的信息中,如果標(biāo)志是U,則說明是可達(dá)路由;如果標(biāo)志是G,則說明這個(gè)網(wǎng)絡(luò)接口連接的是網(wǎng)關(guān),否則說明這個(gè)接口直連主機(jī)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    欧美人妻少妇精品久久性色| 欧美日韩在线第一页日韩| 亚洲精品国产精品日韩| 午夜福利国产精品不卡| 国产欧美一区二区色综合| 日本高清不卡一二三区| 久久精品偷拍视频观看| 日韩午夜福利高清在线观看| 亚洲精品欧美精品日韩精品| 日韩精品一级片免费看| 99久久精品一区二区国产| 国产熟女一区二区三区四区| 超碰在线播放国产精品| 亚洲一区二区亚洲日本| 九九视频通过这里有精品| 可以在线看的欧美黄片| 高清国产日韩欧美熟女| 亚洲一区二区三区一区| 国产三级不卡在线观看视频| 亚洲中文字幕在线视频频道| 午夜福利视频日本一区| 久久99午夜福利视频| 亚洲一区二区欧美在线| 丁香七月啪啪激情综合| 日韩丝袜诱惑一区二区| 日韩欧美国产精品自拍| 五月婷婷六月丁香亚洲| 东京热加勒比一区二区| 91麻豆视频国产一区二区| 日韩一区二区三区嘿嘿| 尹人大香蕉一级片免费看| 国产又黄又爽又粗视频在线| 国内尹人香蕉综合在线| 欧美日韩精品久久亚洲区熟妇人| 亚洲国产一级片在线观看 | 开心五月激情综合婷婷色| 黑丝国产精品一区二区| 青青草草免费在线视频| 午夜视频免费观看成人| 亚洲一区二区三区在线中文字幕| 五月天丁香亚洲综合网|