成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從 Flannel 學習 Kubernetes overlay 網絡

網絡 網絡管理
Flannel 是通過 Daemonset 的方式部署的,每臺節點上都會運行一個 flannel 的 pod。通過掛載本地磁盤的方式,在 Pod 啟動時會通過初始化容器將二進制文件和 CNI 的配置復制到本地磁盤中,分別位于 /opt/cni/bin/flannel 和 /etc/cni/net.d/10-flannel.conflist。

?Flannel 介紹

Flannel 是一個非常簡單的 overlay 網絡(VXLAN),是 Kubernetes 網絡 CNI 的解決方案之一。Flannel 在每臺主機上運行一個簡單的輕量級 agent flanneld? 來監聽集群中節點的變更,并對地址空間進行預配置。Flannel 還會在每臺主機上安裝 vtep flannel.1(VXLAN tunnel endpoints),與其他主機通過 VXLAN 隧道相連。

flanneld 監聽在 8472 端口,通過 UDP 與其他節點的 vtep 進行數據傳輸。到達 vtep 的二層包會被原封不動地通過 UDP 的方式發送到對端的 vtep,然后拆出二層包進行處理。簡單說就是用四層的 UDP 傳輸二層的數據幀。

圖片

vxlan-tunnel

在 Kubernetes 發行版 K3S[1] 中將 Flannel 作為默認的 CNI 實現。K3S 集成了 flannel,在啟動后 flannel 以 go routine 的方式運行。

環境搭建

Kubernetes 集群使用 k3s 發行版,但在安裝集群的時候,禁用 k3s 集成的 flannel,使用獨立安裝的 flannel 進行驗證。

安裝 CNI 的 plugin,需要在所有的 node 節點上執行下面的命令,下載 CNI 的官方 bin。

sudo mkdir -p /opt/cni/bin
curl -sSL https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz | sudo tar -zxf - -C /opt/cni/bin

安裝 k3s 的控制平面。

export INSTALL_K3S_VERSION=v1.23.8+k3s2
curl -sfL https://get.k3s.io | sh -s - --disable traefik --flannel-backend=none --write-kubeconfig-mode 644 --write-kubeconfig ~/.kube/config

安裝 Flannel。這里注意,Flannel 默認的 Pod CIRD 是 10.244.0.0/16?,我們將其修改為 k3s 默認的 10.42.0.0/16。

curl -s https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml | sed 's|10.244.0.0/16|10.42.0.0/16|g' | kubectl apply -f -

添加另一個節點到集群。

export INSTALL_K3S_VERSION=v1.23.8+k3s2
export MASTER_IP=<MASTER_IP>
export NODE_TOKEN=<TOKEN>
curl -sfL https://get.k3s.io | K3S_URL=https://${MASTER_IP}:6443 K3S_TOKEN=${NODE_TOKEN} sh -

查看節點狀態。

kubectl get node
NAME STATUS ROLES AGE VERSION
ubuntu-dev3 Ready <none> 13m v1.23.8+k3s2
ubuntu-dev2 Ready control-plane,master 17m v1.23.8+k3s2

運行兩個 pod:curl? 和 httpbin,為了探尋

NODE1=ubuntu-dev2
NODE2=ubuntu-dev3
kubectl apply -n default -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
labels:
app: curl
name: curl
spec:
containers:
- image: curlimages/curl
name: curl
command: ["sleep", "365d"]
nodeName: $NODE1
---
apiVersion: v1
kind: Pod
metadata:
labels:
app: httpbin
name: httpbin
spec:
containers:
- image: kennethreitz/httpbin
name: httpbin
nodeName: $NODE2
EOF

網絡配置

接下來,一起看下 CNI 插件如何配置 pod 網絡。

初始化

Flannel 是通過 Daemonset? 的方式部署的,每臺節點上都會運行一個 flannel 的 pod。通過掛載本地磁盤的方式,在 Pod 啟動時會通過初始化容器將二進制文件和 CNI 的配置復制到本地磁盤中,分別位于 /opt/cni/bin/flannel? 和 /etc/cni/net.d/10-flannel.conflist。

通過查看 kube-flannel.yml[2] 中的 ConfigMap?,可以找到 CNI 配置,flannel 默認委托(見 flannel-cni 源碼 `flannel_linux.go#L78`[3])給 bridge 插件[4] 進行網絡配置,網絡名稱為 cbr0;IP 地址的管理,默認委托(見 flannel-cni 源碼 `flannel_linux.go#L40`[5]) host-local 插件[6] 完成。

#cni-conf.json 復制到 /etc/cni/net.d/10-flannel.conflist
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}

還有 Flannel 的網絡配置,配置中有我們設置的 Pod CIDR 10.42.0.0/16? 以及后端(backend)的類型 vxlan?。這也是 flannel 默認的類型,此外還有 多種后端類型[7] 可選,如 host-gw、wireguard、udp、Alloc、IPIP、IPSec。

#net-conf.json 掛載到 pod 的 /etc/kube-flannel/net-conf.json
{
"Network": "10.42.0.0/16",
"Backend": {
"Type": "vxlan"
}
}

Flannel Pod 運行啟動 flanneld? 進程,指定了參數 --ip-masq? 和 --kube-subnet-mgr?,后者開啟了 kube subnet manager 模式。

運行

圖片

集群初始化時使用了默認的 Pod CIDR 10.42.0.0/16?,當有節點加入集群,集群會從該網段上為節點分配 屬于節點的 Pod CIDR 10.42.X.1/24。

flannel 在 kube subnet manager 模式下,連接到 apiserver 監聽節點更新的事件,從節點信息中獲取節點的 Pod CIDR。

kubectl get no ubuntu-dev2 -o jsnotallow={.spec} | jq
{
"podCIDR": "10.42.0.0/24",
"podCIDRs": [
"10.42.0.0/24"
],
"providerID": "k3s://ubuntu-dev2"
}

然后在主機上寫子網配置文件,下面展示的是其中一個節點的子網配置文件的內容。另一個節點的內容差異在 FLANNEL_SUBNET=10.42.1.1/24,使用的是對應節點的 Pod CIDR。

#node 192.168.1.12
cat /run/flannel/subnet.env
FLANNEL_NETWORK=10.42.0.0/16
FLANNEL_SUBNET=10.42.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

CNI 插件執行

CNI 插件的執行是由容器運行時觸發的,具體細節可以看上一篇 《源碼解析:從 kubelet、容器運行時看 CNI 的使用》。

圖片

Flannel Plugin Flow

flannel 插件

flannel? CNI 插件(/opt/cni/bin/flannel?)執行的時候,接收傳入的 cni-conf.json?,讀取上面初始化好的 subnet.env? 的配置,輸出結果,委托給 bridge 進行下一步。

cat /var/lib/cni/flannel/e4239ab2706ed9191543a5c7f1ef06fc1f0a56346b0c3f2c742d52607ea271f0 | jq
{
"cniVersion": "0.3.1",
"hairpinMode": true,
"ipMasq": false,
"ipam": {
"ranges": [
[
{
"subnet": "10.42.0.0/24"
}
]
],
"routes": [
{
"dst": "10.42.0.0/16"
}
],
"type": "host-local"
},
"isDefaultGateway": true,
"isGateway": true,
"mtu": 1450,
"name": "cbr0",
"type": "bridge"
}

bridge 插件

bridge 使用上面的輸出連同參數一起作為輸入,根據配置完成如下操作:

  • 創建網橋cni0(節點的根網絡命名空間)
  • 創建容器網絡接口eth0( pod 網絡命名空間)
  • 創建主機上的虛擬網絡接口vethX(節點的根網絡命名空間)
  • 將vethX? 連接到網橋 cni0
  • 委托 ipam 插件分配 IP 地址、DNS、路由
  • 將 IP 地址綁定到 pod 網絡命名空間的接口eth0 上
  • 檢查網橋狀態
  • 設置路由
  • 設置 DNS

最后輸出如下的結果:

cat /var/li/cni/results/cbr0-a34bb3dc268e99e6e1ef83c732f5619ca89924b646766d1ef352de90dbd1c750-eth0 | jq .result
{
"cniVersion": "0.3.1",
"dns": {},
"interfaces": [
{
"mac": "6a:0f:94:28:9b:e7",
"name": "cni0"
},
{
"mac": "ca:b4:a9:83:0f:d4",
"name": "veth38b50fb4"
},
{
"mac": "0a:01:c5:6f:57:67",
"name": "eth0",
"sandbox": "/var/run/netns/cni-44bb41bd-7c41-4860-3c55-4323bc279628"
}
],
"ips": [
{
"address": "10.42.0.5/24",
"gateway": "10.42.0.1",
"interface": 2,
"version": "4"
}
],
"routes": [
{
"dst": "10.42.0.0/16"
},
{
"dst": "0.0.0.0/0",
"gw": "10.42.0.1"
}
]
}

port-mapping 插件

該插件會將來自主機上一個或多個端口的流量轉發到容器。

Debug

讓我們在第一個節點上,使用 tcpdump? 對接口 cni0 進行抓包。

tcpdump -i cni0 port 80 -vvv

從 pod curl? 中使用 pod httpbin? 的 IP 地址 10.42.1.2 發送請求:

kubectl exec curl -n default -- curl -s 10.42.1.2/get

cni0

從在 cni0 上的抓包結果來看,第三層的 IP 地址均為 Pod 的 IP 地址,看起來就像是兩個 pod 都在同一個網段。

圖片

tcpdump-on-cni0

host eth0

文章開頭提到 flanneld 監聽 udp 8472 端口。

netstat -tupln | grep 8472
udp 0 0 0.0.0.0:8472 0.0.0.0:* -

我們直接在以太網接口上抓取 UDP 的包:

tcpdump -i eth0 port 8472 -vvv

再次發送請求,可以看到抓取到 UDP 數據包,傳輸的負載是二層的封包。

圖片

tcpdump-on-host-eth0

Overlay 網絡下的跨節點通信

在系列的第一篇中,我們研究 pod 間的通信時提到不同 CNI 插件的處理方式不同,這次我們探索了 flannel 插件的工作原理。希望通過下面的圖可以對 overlay 網絡處理跨節點的網絡通信有個比較直觀的認識。

圖片

當發送到 10.42.1.2? 流量到達節點 A 的網橋 cni0?,由于目標 IP 并不屬于當前階段的網段。根據系統的路由規則,進入到接口 flannel.1?,也就是 VXLAN 的 vtep。這里的路由規則也由 flanneld 來維護,當節點上線或者下線時,都會更新路由規則。

#192.168.1.12
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 0 0 0 eth0
10.42.0.0 0.0.0.0 255.255.255.0 U 0 0 0 cni0
10.42.1.0 10.42.1.0 255.255.255.0 UG 0 0 0 flannel.1
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
#192.168.1.13
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 0 0 0 eth0
10.42.0.0 10.42.0.0 255.255.255.0 UG 0 0 0 flannel.1
10.42.1.0 0.0.0.0 255.255.255.0 U 0 0 0 cni0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

flannel.1? 將原始的以太封包使用 UDP 協議重新封裝,將其發送到目標地址 10.42.1.0? (目標的 MAC 地址通過 ARP 獲?。?。對端的 vtep 也就是 flannel.1? 的 UDP 端口 8472 收到消息,解幀出以太封包,然后對以太封包進行路由處理,發送到接口 cni0,最終到達目標 pod 中。

響應的數據傳輸與請求的處理也是類似,只是源地址和目的地址調換。

參考資料

[1] K3S: https://k3s.io/

[2] kube-flannel.yml: https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

[3] flannel-cni 源碼 flannel_linux.go#L78?: https://github.com/flannel-io/cni-plugin/blob/v1.1.0/flannel_linux.go#L78

[4] bridge 插件: https://www.cni.dev/plugins/current/main/bridge/

[5] flannel-cni 源碼 flannel_linux.go#L40?: https://github.com/flannel-io/cni-plugin/blob/v1.1.0/flannel_linux.go#L40

[6] host-local 插件: https://www.cni.dev/plugins/current/ipam/host-local/

[7] 多種后端類型: https://github.com/flannel-io/flannel/blob/master/Documentation/backends.md

責任編輯:武曉燕 來源: 云原生指北
相關推薦

2019-07-03 10:58:22

Kubernetes網絡插件

2025-06-27 10:12:15

Go封裝開發

2022-02-25 16:18:06

OverlayUnderlay網絡設備

2025-06-09 10:08:00

KubernetesGo容器

2022-08-17 07:53:45

Overlay網絡數據中心

2023-01-12 08:12:33

KubernetesCiliumeBPF

2020-12-30 08:00:00

Kubernetes開發機器學習

2020-05-19 09:01:51

Overlay網絡虛擬化集群

2022-08-02 20:17:13

網絡UnderlayOverlay

2019-10-24 10:25:32

Kubernetes網絡集群

2013-12-26 10:17:57

overlayVXLAN詳解

2024-01-19 18:02:25

Kubernetes網絡流量

2025-06-12 09:10:23

2021-12-01 09:48:34

Kubernetes 網絡插件Linux

2013-10-15 09:11:26

多租戶云計算Overlay

2021-11-22 08:50:20

Kubernetes網絡策略云原生應用程序

2020-07-08 09:36:03

Kubernetes容器開發

2020-09-23 14:20:07

Kubernetes容器網絡模型

2020-04-12 22:23:45

Kubernetes容器網絡

2021-04-14 09:33:58

Kubernetes通信網絡模型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91高清视频在线观看 | 亚洲第一网站 | 欧美日韩不卡合集视频 | 亚洲成人一区 | 日韩理论电影在线观看 | 天天摸天天干 | 久久av资源网 | 免费观看www7722午夜电影 | 天堂久久av | 色婷婷综合久久久久中文一区二区 | 欧美一级片在线看 | 国产农村妇女精品一二区 | 奇米四色影视 | 久久久久久成人 | 亚洲免费在线观看 | 欧美中文在线 | 综合久久99| 国产精品一区二区久久精品爱微奶 | 久久久久无码国产精品一区 | 亚洲欧美中文日韩在线v日本 | 亚洲日韩中文字幕一区 | 在线播放中文字幕 | 国产激情 | 久久久综合久久 | 一区二区三区四区在线视频 | 亚洲一区不卡 | 91在线免费视频 | 粉嫩国产精品一区二区在线观看 | 欧美激情综合 | 精品久久久久久久久久久久久久 | 黄视频网站在线 | 日韩在线一区二区 | 国产成人福利在线观看 | 国产精品久久久亚洲 | 亚洲欧美激情精品一区二区 | 亚洲36d大奶网 | 亚洲 中文 欧美 | 午夜极品| 99精品欧美一区二区三区综合在线 | 欧美日日日日bbbbb视频 | 欧美亚洲国产精品 |