主頁 > 作業系統 > 036.Kubernetes集群網路-K8S網路模型及Linux基礎網路

036.Kubernetes集群網路-K8S網路模型及Linux基礎網路

2020-09-25 02:35:07 作業系統

一 Kubernetes網路模型概述

1.1 Kubernetes網路模型

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

二 Docker網路基礎

Docker本身的技術依賴于近年來Linux內核虛擬化技術的發展,所以Docker對Linux內核的特性有很強的依賴,Docker通常使用到的與Linux網路有關的主要技術有:網路命名空間(Network Namespace)、Veth設備對、網橋、ipatables和路由,

2.1 網路命名空間

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

2.2 Veth設備對

引入Veth設備對是為了在不同的網路命名空間之間通信,利用它可以直接將兩個網路命名空間連接起來,由于要連接兩個網路命名空間,所以Veth設備都是成對出現的,很像一對以太網卡,并且中間有一根直連的網線,通常將其中一端稱為另一端的peer, 在Veth設備的一端發送資料時,它會將資料直接發送到另一端,并觸發另一端的接收操作,Veth設備對的示意圖如下: 1575105169
  • veth pair操作
  1 [root@k8smaster01 ~]# ip link add veth0 type veth peer name veth1	#創建veth設備對
  2 [root@k8smaster01 ~]# ip link show | grep veth			#當前查看veth
  3 [root@k8smaster01 ~]# ip netns add ns0
  4 [root@k8smaster01 ~]# ip netns add ns1				#創建命名空間
  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		#進入命名空間查看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	#設定對應的IP
 10 [root@k8smaster01 ~]# ip netns exec ns0 ifconfig veth0 up
 11 [root@k8smaster01 ~]# ip netns exec ns1 ifconfig veth1 up		#開啟設備
 12 [root@k8smaster01 ~]# ip netns exec ns0 ping 192.168.10.2		#連通性測驗
clipboard 提示:在Docker內部,Veth設備對也是連通容器與宿主機的主要網路設備,
  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 網橋

Linux可以支持多個不同的網路,它們之間能夠相互通信,可通過網橋將這些網路連接起來并實作各網路中主機的相互通信, 網橋是一個二層的虛擬網路設備,把若干個網路介面“連接”起來,以使得網路介面之間的報文能夠互相轉發,網橋能夠決議收發的報文,讀取目標MAC地址的資訊,和自己記錄的MAC表結合,來決策報文的轉發目標網路介面, 為了實作轉發功能,網橋學習源MAC地址(二層網橋轉發的依據就是MAC地址),在轉發報文時,網橋只需要向特定的網口進行轉發,來避免不必要的網路互動,如果接受到未學習到的地址,就無法知道這個報文應該向哪個網路介面轉發,就將報文廣播給所有的網路介面(報文來源的網路介面除外), 在實際的網路中,網路拓撲若出現改變,如設備被移動到另一個埠上,卻沒有發送任何資料,網橋設備就無法感知到這個變化,網橋還是向原來的埠轉發資料包,在這種情況下資料就會丟失,所以網橋還要對學習到的MAC地址表加上超時時間(默認為5min),如果網橋收到了對應埠MAC地址回發的包,則重置超時時間,否則過了超時時間后,就認為設備已經不在那個埠上了,它就會重新廣播發送, 對于多網卡、多虛擬的設備,Linux的網橋提供了在這些設備之間互相轉發資料的二層設備,Linux內核支持網口的橋接(目前只支持以太網介面),但是與單純的交換機不同,交換機只是一個二層設備,對于接收到的報文,要么轉發,要么丟棄,運行著Linux內核的機器本身就是一臺主機,有可能是網路報文的目的地,其收到的報文除了轉發和丟棄,還可能被送到網路協議堆疊的上層(網路層),從而被自己(這臺主機本身的協議堆疊)消化,所以既可以把網橋看作一個二層設備,也可以把它看作一個三層設備,
  • Linux網橋的實作
Linux內核是通過一個虛擬的網橋設備(Net Device)來實作橋接的,這個虛擬設備可以系結若干個以太網介面設備,從而將它們橋接起來,如下圖所示,這種Net Device網橋和普通的設備不同,最明顯的一個特性是還可以有一個IP地址, clipboard 如上圖所示,網橋設備br0系結了eth0和eth1,對于網路協議堆疊的上層來說,只看得到br0就行,因為橋接是在資料鏈路層實作的,上層不需要關心橋接的細節,所以協議堆疊上層需要發送的報文被送到br0,網橋設備的處理代碼判斷報文該被轉發到eth0還是eth1,或者兩者皆轉發;反之,從eth0或從eth1接收到的報文被提交給網橋的處理代碼,在這里會判斷報文應該被轉發、丟棄還是被提交到協議堆疊上層,而有時eth0、eth1也可能會作為報文的源地址或目的地址,直接參與報文的發送與接收,從而繞過網橋,
  • 網橋的常用操作命令
Docker自動完成了對網橋的創建和維護, 新增一個網橋設備: [root@k8smaster01 ~]# brctl #查看brctl模塊 clipboard 提示:可通過# yum -y install bridge-utils安裝brctl, 為網橋增加網口,在Linux中,一個網口其實就是一個物理網卡, 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 #創建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 #創建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關聯
 16 [root@k8smaster01 ~]# brctl addbr br1		#創建橋
 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 #把相應的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 #配置相應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設定為up
 37 [root@k8smaster01 ~]# ip netns exec ns1 ping 192.168.20.2		#互ping
clipboard 提示:若物理網卡作為網橋的一個網口,則此物理網卡將在鏈路層作業(是一個純鏈路層設備),就不再需要IP地址了,可以取消物理網卡的IP,給網橋配置一個IP地址,

2.4 iptables和Netfilter

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

2.5 路由

Linux系統包含一個完整的路由功能,當IP層在處理資料發送或者轉發時,會使用路由表來決定發往哪里,在通常情況下,如果主機與目的主機直接相連,那么主機可以直接發送IP報文到目的主機,這個程序比較簡單,例如,通過點對點的鏈接或網路共享,如果主機與目的主機沒有直接相連,那么主機會將IP報文發送給默認的路由器,然后由路由器來決定往哪里發送IP報文, 路由功能由IP層維護的一張路由表來實作,當主機收到資料報文時,它用此表來決策接下來應該做什么操作,當從網路側接收到資料報文時,IP層首先會檢查報文的IP地址是否與主機自身的地址相同,如果資料報文中的IP地址是主機自身的地址,那么報文將被發送到傳輸層相應的協議中,如果報文中的IP地址不是主機自身的地址,并且主機配置了路由功能,那么報文將被轉發,否則,報文將被丟棄, 路由表中的資料一般是以條目形式存在的,一個典型的路由表條目通常包含以下主要的條目項,
  1. 目的IP地址:此欄位表示目標的IP地址,這個IP地址可以是某主機的地址,也可以是一個網路地址,如果這個條目包含的是一個主機地址,那么它的主機ID將被標記為非零;如果這個條目包含的是一個網路地址,那么它的主機ID將被標記為零,
  2. 下一跳路由器的IP地址:若并非最終目的的路由器,則該條目給出的下一個路由器的地址用來轉發在相應介面接收到的IP資料報文,
  3. 標志:這個欄位提供了另一組重要資訊,例如,目的IP地址是一個主機地址還是一個網路地址,此外,從標志中可以得知下一個路由器是一個真實路由器還是一個直接相連的介面,
  4. 網路介面規范:為一些資料報文的網路介面規范,該規范將與報文一起被轉發,

在通過路由表轉發時,如果任何條目的第1個欄位完全匹配目的IP地址(主機)或部分匹配條目的IP地址(網路),它將指示下一個路由器的IP地址,條目中的所有其他欄位將提供更多的輔助資訊來為路由轉發做決定, 如果沒有找到一個完全匹配的IP,就接著搜索相匹配的網路ID,如果找到,那么該資料報文會被轉發到指定的路由器上,可以看出,網路上的所有主機都通過這個路由表中的單個(這個)條目進行管理, 如果上述兩個條件都不匹配,那么該資料報文將被轉發到一個默認的路由器上, 如果上述步驟都失敗,默認路由器也不存在,那么該資料報文最終無法被轉發,任何無法投遞的資料報文都將產生一個ICMP主機不可達或ICMP網路不可達的錯誤,并將此錯誤回傳給生成此資料報文的應用程式,
  • 路由表的創建
Linux的路由表至少包括兩個表(當啟用策略路由時,還會有其他表):一個是LOCAL,另一個是MAIN, 在LOCAL表中會包含所有的本地設備地址,LOCAL路由表是在配置網路設備地址時自動創建的,LOCAL表用于供Linux協議堆疊識別本地地址,以及進行本地各個不同網路介面之間的資料轉發, [root@k8smaster01 ~]# ip route show table local type local #查看LOCAL表的內容 clipboard MAIN表用于各類網路IP地址的轉發,它的建立既可以使用靜態配置生成,也可以使用動態路由發現協議生成,動態路由發現協議一般使用組播功能來通過發送路由發現資料,動態地交換和獲取網路的路由資訊,并更新到路由表中, Linux下支持路由發現協議的開源軟體有許多,常用的有Quagga、Zebra等,
  • 路由表的查看
可以使用ip route list命令查看當前的路由表: [root@k8smaster01 ~]# ip route list netstat -rn是另一個查看路由表的工具: clipboard 在它顯示的資訊中,如果標志是U,則說明是可達路由;如果標志是G,則說明這個網路介面連接的是網關,否則說明這個介面直連主機,

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/122572.html

標籤:Linux

上一篇:linux關于IP,埠,防火墻相關命令

下一篇:【NetDevOps】新一代網工需要了解的那點事兒---云計算中的網路虛擬化(一)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more