Flannel 同节点通信
  TEZNKK3IfmPf 2023年11月14日 14 0

Flannel 简介

Flannel 是为 Kubernetes 设计的一种简单易行的配置三层网络结构的方法。

Flannel 是如何工作的

Flannel 在每个主机上运行一个小的、单一的二进制 agent,称为 flanneld,负责从一个更大的、预先配置的地址空间中为每个主机分配一个子网租约。Flannel使用 Kubernetes API 或 etcd 存储网络配置、分配的子网和任何辅助数据(如主机的公共IP)。数据包使用几种后端机制之一进行转发,包括VXLAN和各种云端集成。

网络细节

Flannel负责在集群中的多个节点之间提供一个3层IPv4网络。Flannel并不控制容器如何与主机联网,只控制流量如何在主机之间传输。然而,flannel确实为Kubernetes提供了一个CNI插件,以及与Docker集成的指导。

Flannel 专注于网络。对于网络策略,可以使用其他项目,如 Calico。

安装部署

默认部署是 vxlan 模式,注意,如果集群默认的 CIDR 不是 10.244.0.0/16 请在配置文件中修改。

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

多网卡配置请参考:configuration

--iface="": interface to use (IP or name) for inter-host communication. Defaults to the interface for the default route on the machine. This can be specified multiple times to check each option in order. Returns the first match found.

Flannel 多种模式细节

backend

比如,当所有的 Worker Node 都在同一个二层的,Flannel 更推荐用 HOST-GW 模式。
还有对数据包进行加密的 IPSec 模式和 WireGuard 模式
在部署之前,需要确定好需要部署的模式,更建议参考官方文档。

Flannel 故障排除

troubleshooting

包括配置日志记录、接口选择、多网卡、权限问题、防火墙配置等等

Flannel 同节点通信

Flannel 同节点通信利用了 veth pair 对的形式,一端连接到 pod,一端连接到宿主机的网卡,同时作为宿主机 cni0 网卡的的接口,使得同节点的通信,直接是二层互通。
和 calico vxlan 不一样的是,pod 对应的网口并没有使用 proxy-arp 的特性,所以就和传统的二层交换,三层路由一样,理解起来更为简单。

集群环境

kubernetes v1.23.5
  master 192.168.0.80
  node1  192.168.0.81
  node2  192.168.0.82

运行 pod

在集群中运行 pod ,查看在 node1 上的 pod

pod1 10.244.1.2

pod2 10.244.1.3

Flannel 同节点通信

[root@master ]# kubectl create deployment cni-test --image=burlyluo/nettoolbox --replicas=3

[root@master ]# kubectl get pod -o wide 
NAME                        READY   STATUS    RESTARTS   AGE   IP           NODE              NOMINATED NODE   READINESS GATES
cni-test-777bbd57c8-5zhjd   1/1     Running   0          18s   10.244.2.6   node2.whale.com   

查看 pod1 内部网卡和 node1 对应网卡

[root@master ]# kubectl exec -it cni-test-777bbd57c8-t6xhd -- bash
bash-5.1# ifconfig 
eth0      Link encap:Ethernet  HWaddr 6A:6D:35:69:37:FE  
          inet addr:10.244.1.2  Bcast:10.244.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1220 (1.1 KiB)  TX bytes:42 (42.0 B)
bash-5.1# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.244.1.1      0.0.0.0         UG    0      0        0 eth0
10.244.0.0      10.244.1.1      255.255.0.0     UG    0      0        0 eth0
10.244.1.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
bash-5.1# ethtool -S eth0
NIC statistics:
     peer_ifindex: 6
     rx_queue_0_xdp_packets: 0
     rx_queue_0_xdp_bytes: 0
     rx_queue_0_xdp_drops: 0

# node1 对应 pod1 网卡
[root@node1 ]# ip link show | grep ^6
6: veth9903a3d4@if3: 

查看 pod2 内部网卡和 node1 对应网卡

[root@master ]# kubectl exec -it cni-test-777bbd57c8-whwcm -- bash
bash-5.1# ifconfig 
eth0      Link encap:Ethernet  HWaddr CA:BB:AF:BD:E5:3A  
          inet addr:10.244.1.3  Bcast:10.244.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:13 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1178 (1.1 KiB)  TX bytes:42 (42.0 B)
bash-5.1# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.244.1.1      0.0.0.0         UG    0      0        0 eth0
10.244.0.0      10.244.1.1      255.255.0.0     UG    0      0        0 eth0
10.244.1.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
bash-5.1# ethtool -S eth0
NIC statistics:
     peer_ifindex: 7
     rx_queue_0_xdp_packets: 0
     rx_queue_0_xdp_bytes: 0
     rx_queue_0_xdp_drops: 0

# node1 对应 pod2 网卡
[root@node1 ]# ip -d link show vetha61ebf2f
7: vetha61ebf2f@if3: 

查看 node1 网卡

我们可以见到 pod 对应的 veth 网卡会有 master cni0 选项,这个意思是 cni0 的桥接网卡的接口。

Flannel 同节点通信

通过查看 cni0 网卡接口信息,确定 pod 对端的 veth pair 网卡是在 cni0 上的接口

Flannel 同节点通信

通过查看 node1 的路由,我们可以看到 10.244.1.0 指向了 cni0 网卡,所以可以确认,同节点的通信经过的都是 cni0 网桥,而两端的接口分别指向了两个 pod 的对端的 MAC 地址。

[root@node1 ]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.244.1.0      0.0.0.0         255.255.255.0   U     0      0        0 cni0

[root@node1 ]# brctl show cni0
bridge name  bridge id    STP enabled  interfaces
cni0    8000.9a50492d6548  no    veth9903a3d4
                    vetha61ebf2f
[root@node1 ~]# brctl showmacs cni0
port no  mac addr    is local?  ageing timer
  1  2a:5e:4a:15:33:1c  yes       0.00
  1  2a:5e:4a:15:33:1c  yes       0.00
  2  b6:c0:6c:fd:e6:e0  yes       0.00
  2  b6:c0:6c:fd:e6:e0  yes       0.00

同节点通信抓包演示

针对同节点通信,我们通过抓包演示

针对 pod eth0 网卡以及对应 veth 网卡,还有 cni0 进行抓包

Flannel 同节点通信

kubectl exec -it cni-test-777bbd57c8-t6xhd -- ping -c 1 10.244.1.3

pod1.cap

kubectl exec -it cni-test-777bbd57c8-t6xhd -- tcpdump -pne -i eth0 -w pod1.cap

Flannel 同节点通信

pod1-veth.cap

tcpdump -pne -i veth9903a3d4 -w pod1-veth.cap

Flannel 同节点通信

cni0.cap

tcpdump -pne -i cni0 -w cni0.cap

Flannel 同节点通信

pod2-veth.cap

tcpdump -pne -i vetha61ebf2f -w pod2-veth.cap

Flannel 同节点通信

pod2.cap

kubectl exec -it cni-test-777bbd57c8-whwcm -- tcpdump -pne -i eth0 -w pod2.cap

Flannel 同节点通信

Flannel 同节点通信

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: Terraform 常用语法(三) 下一篇: Terraform 简介
  1. 分享:
最后一次编辑于 2023年11月14日 0

暂无评论

TEZNKK3IfmPf