1 網絡模型
kubernetes 網絡模型設計的一個基本原則是:每個Pod擁有一個獨立IP地址,並假定所有Pod都在一個可以直接連通的、扁平的網絡空間中,
在Kubernetes IP以Pod爲單位進行分配的,一個Pod內部的所有容器共享一個網絡堆棧(網絡命名空間,ip地址,網絡設備,配置都是共享的)按照這個原則抽象出來的每個Pod都設置一個Ip地址的模型也叫做Ip-per-Pod模型
Kubernetes 對網絡有什麼前提和要求
- 所有容器都可以在不用NAT的方式下同別的容器通信
- 所有節點都可以在不同NAT方式下同所有容器通信,反之亦然
- 容器的地址和別人看到的地址是同一個地址。
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設備對操作命令
- 創建Veth設備對
ip link add veth0 type peer name veth1
- 將另外一頭甩給另一個命名空間
ip link set veth1 netns netns1
- 分配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
- 啓動 可以互相通信了
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 可以連接的規則點有五個
上層協議處理
- Input
- Output
- 路由 Forward
- Prerouting
- 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支持以下四種網絡模式
- host模式
- container模式
- none模式
- bridge模式
在kubernetes模式下一般只會使用bridge模式
4 Kubernetes 的網絡實現
Kubernetes 網絡設計主要致力於解決以下問題
-
容器到容器之間的直接通信
-
抽象的pod到pod之間的通信
-
pod到service之間的通信
-
集羣外部與內部組件之間的通信
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 開源的網絡組件