---
# System prepended metadata

title: CNI Flannel 網路架構
tags: [K8S]

---

# CNI Flannel 網路架構


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

![image](https://hackmd.io/_uploads/BkP39xC_R.png)

* 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 跨節點運作架構

![image](https://hackmd.io/_uploads/SkNiie0d0.png)

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

![image](https://hackmd.io/_uploads/SyurdWAOA.png)

* 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 網路中網路設備的不同端口，可以視為虛擬二層交換器。

![image](https://hackmd.io/_uploads/BJ2x5ZCOC.png)




## 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
