Kubernetes 網絡模型

1 網絡模型

       kubernetes 網絡模型設計的一個基本原則是:每個Pod擁有一個獨立IP地址,並假定所有Pod都在一個可以直接連通的、扁平的網絡空間中,

在Kubernetes  IP以Pod爲單位進行分配的,一個Pod內部的所有容器共享一個網絡堆棧(網絡命名空間,ip地址,網絡設備,配置都是共享的)按照這個原則抽象出來的每個Pod都設置一個Ip地址的模型也叫做Ip-per-Pod模型

Kubernetes 對網絡有什麼前提和要求

  1.         所有容器都可以在不用NAT的方式下同別的容器通信
  2.         所有節點都可以在不同NAT方式下同所有容器通信,反之亦然
  3.         容器的地址和別人看到的地址是同一個地址。

2 Docker網絡模型

    Docker本身的技術依賴於近年Linux內核虛擬化技術的發展,所以Docker對Linux內核特性有很強的依賴。

1 網絡命名空間

爲了支持多個網絡協議棧的多個實例,LInux在內核中引入了命名空間,獨立的協議棧被隔離到不同的命名空間。

爲了隔離出獨立協議棧,納入命名空間的元素有:進程、套接字、網絡設備等

 由於網絡命名空間代表一個獨立協議棧,所以它們之間是相互隔離的,彼此無法通信,在協議棧內部無法看到對方。如果想在兩個命名空間之間通信,就必須有一個Veth設備對。

網絡命名空間基礎操作

可以用Linux iproute2 系列配置工具中的ip命令來操作網絡命名空間

root用戶創建

ip netns add  Name

在命名空間中 執行命令

 ip netns exec  Name  command 

也可以通過bash命令進入內部的shell界面,然後執行各種命令,

ip netns exec name shell

如何看哪些設備是不可以轉移到其他命名空間的

ethtool  -k  br0  

如果netns-local   : on  fixed    如果是on 說明不可以轉移,否則可以轉移

2  Veth設備對

引入Veth設備對是爲了在不同的網絡命名空間之間通信,利用它可以將兩個網絡命名空間連接起來。

Veth設備對都是成對出現的,就像一對以太網卡,並且中間有一根直連的網線。既然是一對網卡,那麼我們將其中一端稱爲另一端的peer。

1 Veth設備對操作命令

  1. 創建Veth設備對
    ip link add veth0 type peer name veth1

     

  2. 將另外一頭甩給另一個命名空間
    ip link set veth1 netns netns1

     

  3. 分配ip地址
    ip netns exec netns1 ip addr add 10.1.1.1/24 dev  veth1
    ip addr add 10.1.1.2/24 dev  veth0 
    

     

  4. 啓動  可以互相通信了
    ip netns exec netns1 ip link set dev veth1 up
    ip link set dev veth0 up 

     

3 網橋

Linux可以支持不同的網絡,它們之間能夠互相通信,如何將這些網絡連接起來並實現各網絡中主機的相互通信呢?可以用網橋

網橋是一個二層的虛擬網絡設備,把若干個網絡接口“連接”起來,以使得網絡接口之間的報文能夠互相轉發。

1 網橋實現

Linux 內核通過一個虛擬的網橋設備Net Device 來實現網橋的。這個虛擬設備可以綁定若干個以太網接口設備,從而將它們橋接起來。

橋接是在數據鏈路層實現的

2 網橋的常用操作命令

brctl addbr XXXXXX 
brctl addif XXXXXX  ethx
ifconfig ethx 0.0.0.0
ifconfig brxxx xxx.xxx.xxx.xxx

4 iptables  Netfilter

在Linux網絡協議棧中有一組回調函數掛接點,通過這些掛接點的鉤子函數可以在linux網絡處理數據包的過程中對數據進行一些操作,如過濾、修改、丟棄等 。整個掛接點叫做Netfilter和iptables

Netfilter負責在內核中執行各種掛接的規則,運行在內核模式中,而iptables是在用戶模式下運行的進程,負責協助和維護內核中Netfilter的各種規則表。

Netfilter 可以連接的規則點有五個


上層協議處理

  1. Input
  2. Output
  3. 路由 Forward
  4. Prerouting
  5. Postrouting

接口設備


 

1 規則表table

掛接點掛接的規則分不同的類型 

主要支持的Table類型有

  • Raw
  • Mangle
  • Nat
  • Filter

從上到下優先級從高到低

2 處理規則

每個規則的特性分爲以下幾個部分

  • 表類型   準備幹啥事 
  • 什麼掛接點   啥時候幹
  • 匹配的參數是什麼   針對啥樣的數據包
  • 匹配後有什麼操作   匹配後幹啥

3 iptables命令

參看LInux iptables文檔

iptables-save  按照命令的方式打印iptables內容
iptables-vnL    以另一種格式顯示Netfilter表內容

5 路由

定義

LInux系統包含一個完整的路由功能,當IP層處理數據發送或者轉發時,會使用路由表來決定發往哪裏。

路由功能由IP層維護的一張路由表來實現。 

    當主機接收到報文時,IP層首先檢查報文的IP地址是否與主機自身的地址相同。

如果數據報文中的IP地址是主機自身的地址,那麼報文將會被髮送到傳輸層相應的協議中。如果報文中的IP地址不是主機自身的值,並且主機設置了路由功能,那麼報文將會被轉發,否則報文將會被拋棄。

1 路由表創建

lInux路由表至少包括兩個表 一個Local表 一個MAIN,

Local表中包含所有的本地設備地址,Main表用於各類網絡IP地址的轉發,它的建立既可以使用靜態配置生成,也可以使用動態路由發現協議生成。

2 路由表查看

1 ip route list
2 netstat -rn

3  Dokcer的網絡實現

標準的Docker支持以下四種網絡模式

  1. host模式
  2. container模式
  3. none模式
  4. bridge模式

在kubernetes模式下一般只會使用bridge模式

 

4  Kubernetes 的網絡實現

Kubernetes 網絡設計主要致力於解決以下問題

  1. 容器到容器之間的直接通信

  2. 抽象的pod到pod之間的通信

  3. pod到service之間的通信

  4. 集羣外部與內部組件之間的通信

 

   1   容器到容器之間的通信

      同一個pod內的容器(Pod內的容器時不會垮宿主機的)共享同一個網絡命名空間,共享同一個Linux協議棧。

所以對於網絡的各類操作,就和它們在同一臺機器上一樣

     2 Pod之間的通信

每一個pod都有一個真實的全局IP地址,同一個Node 內的不同Pod之間可以直接採用對方的Pod的IP地址通信,而且不需要採用其他發現機制,如DNS、Consul或etcd

               1 同一個Node內Pod之間的通信

                同一個Node內兩個Pod都被關聯在同一個Dokcer0網橋上,地址段相同,它們之間是能直接通信的。它們的IP地址和docker0網橋在同一個網段。

               2 不同node上pod之間的通信

    docker0網橋和宿主機網卡是兩個完全不同的ip段,不同node之間的通信只能通過宿主機的物理網卡進行。因此實現不同Node上Pod之間的通信,就必須想辦法通過主機的這個Ip地址進行尋址和通信。

 

5 Pod和Service網絡實戰

6 CNI網絡模型

7 Kubernetes 網絡策略

8 開源的網絡組件

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章