# CNI Flannel 網路架構
## Flannel CNI 單一節點運作架構

* cni0 就是虛擬橋接器,讓同個網段的 pod 可以互相溝通。
* 不同實體主機的 pod 要互相溝通,就是利用 flannel,他就是一個路由器,讓不同實體機的 pod 可以互聯。
## K8S Master Flannel CNI 單一節點架構
```
$ ifconfig
cni0 Link encap:Ethernet HWaddr 7E:54:2B:28:DC:34
inet addr:10.244.0.1 Bcast:10.244.0.255 Mask:255.255.255.0
.......
eth0 Link encap:Ethernet HWaddr 00:50:56:AB:00:04
inet addr:192.168.61.4 Bcast:0.0.0.0 Mask:255.255.255.0
.......
flannel.1 Link encap:Ethernet HWaddr BE:90:42:CC:9D:70
inet addr:10.244.0.0 Bcast:0.0.0.0 Mask:255.255.255.255
......
$ brctl show
bridge name bridge id STP enabled interfaces
cni0 8000.7e542b28dc34 no veth3a93d696
vetha16fdc4d
```
## K8S Worker Flannel CNI 單一節點架構
```
$ ssh w1 ifconfig
eth0 Link encap:Ethernet HWaddr 00:50:56:AB:00:06
inet addr:192.168.61.6 Bcast:0.0.0.0 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
.........
flannel.1 Link encap:Ethernet HWaddr E2:BE:2A:0E:D2:9C
inet addr:10.244.1.0 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
.........
$ ssh w1 brctl show
```
> [註] 因 w1 及 w2 沒有建立過 POD, 所以沒有建立 cni0 橋接器, 一但有建立 POD, cni0 橋接器便會建立
## Flannel CNI 跨節點運作架構

1. 如在同一個節點 (10.244.0.0/24) 的多個 POD 溝通, 是透過 cni0 橋接網路連接
2. 如跨節點則是先查圖上面的路由表, 將傳送的封包, 從 flannel.1 網卡送出, 這時 flanneld daemon 會包裝這封包, 然後查 etcd 資料庫得知封包目地節點網卡的 IP 位址, 將封包送出
* 它的運作方式是藉由 overlay network,並為每台主機設定 IP 範圍和子網路大小。Flannel 使用 etcd 來維護分配的子網路和實體主機 IP 位址之間的對應。對於資料路徑,flannel 使用 UDP 封裝 IP 資料報,將其傳輸到遠端主機。
* Flannel 就是透過 VXLAN tunnal,透過 UDP 把 IP 封裝一層直接送到對應的節點。
```
# flanneld 他是一個 deamon,這個 process 就是一個路由器,就是他讓 pod 可以跨節點互通
$ ps aux | grep -v grep | grep flanneld
root 4630 0.0 0.4 1332612 35124 ? Ssl 17:01 0:10 /opt/bin/flanneld --ip-masq --kube-subnet-mgr
$ ip route
default via 192.168.61.2 dev eth0 metric 1
10.244.0.0/24 dev cni0 proto kernel scope link src 10.244.0.1
10.244.1.0/24 via 10.244.1.0 dev flannel.1 onlink
10.244.2.0/24 via 10.244.2.0 dev flannel.1 onlink
192.168.61.0/24 dev eth0 proto kernel scope link src 192.168.61.4
```
## VLAN 和 VXLAN 有什麼不同?
### VLAN

* VLAN(Virtual Local Area Network)即虛擬區域網路。它是交換器實作中涉及的一個概念,由 802.1Q 標準定義。由於交換器是工作在鏈路層的網路設備,因此連接到同一台交換器的終端處於同一個三層網絡,也處於同一個廣播域。當交換器連接多個終端時,任何一個終端發送廣播訊息(例如ARP請求),該訊息都會在整個網路中傳播。
* 對於大規模網路場景,廣播訊息的氾濫會對網路通訊造成較大影響。 VLAN 技術為這個問題提供了解決方案。 VLAN 將相同網路分割為多個邏輯虛擬子網(VLAN ID),並規定收到廣播訊息時,只在其 VLAN ID 內廣播,以防止廣播封包氾濫。VLAN 技術在連結層實現了廣播域的隔離。
### VXLAN
* 虛擬可擴充區域網路 (VXLAN) 是網際網路工程任務群組 (IETF) 定義的第 3 層網路虛擬化 (NVO3) 技術之一,是虛擬區域網路 (VLAN) 的擴充。 VXLAN 將二層乙太網路封包封裝成 UDP 封包,透過三層網路進行傳輸。
* 如圖所示,VXLAN 本質上是一種隧道技術。它在來源網路設備和目的網路設備之間建立 IP 網路上的邏輯隧道,對用戶側報文進行封裝並透過隧道進行轉送。伺服器連接到資料中心 VXLAN 網路中網路設備的不同端口,可以視為虛擬二層交換器。

## Canal 網路
* canal 為什麼可以做 networkpolicy,就是因為 flannel 做出 pod 的網路 subnet mask 一定是 /32,這樣代表 pod 跟 pod 再做溝通,這樣封包一定會經過 flannel 的 daemon。
* 就算是同一個 node 上的 pod 溝通,也一定會經過 flannel 的 daemon。
```
# 在有 canal 網路的叢集建立 pod
$ kubectl run test --image=nginx
$ kubectl exec -it test -- bash
$ kubectl run test -it --image=docker.io/taiwanese/debug.alp
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0@if25: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 2e:d3:fc:e2:74:d3 brd ff:ff:ff:ff:ff:ff
inet 10.244.1.29/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::2cd3:fcff:fee2:74d3/64 scope link
valid_lft forever preferred_lft forever
```
## 參考文件
https://forum.huawei.com/enterprise/en/what-are-the-differences-between-vxlan-and-vlan/thread/667249751827038208-667213852955258880