Flannel Kubernetes the hard way v2
Flannel
Flannel - один из способов организации оверлейной сети
Зачем это нужно
- В частных случаях когда сеть полностью контролируема и можно назначать любые маршруты и адреса на всех устройствах - не нужно строить никаких оверлейных сетей
- Если сеть не контролируется (например в арендованном датацентре или облаке, и не возможно создание маршрутов между worker-nodes то это один из множества возможных способов обеспечить оверлейную сеть
Как это устроено
"под капотом" используется VxLAN
Подробнее про VxLAN
"VxLAN это не только тунель но и свитч" =) точнее сказать распределенный свитч
VXLAN инкапсулирует кадры Ethernet уровня 2 в пакеты UDP уровня 3, что означает, что виртуальные подсети уровня 2 могут охватывать базовые сети уровня.
Другими словами, это дает возможность строить "продолжение" 2 уровня поверх третьего,
например соединить 2 географически разнесенных сегмента сети, между которыми нет физического
соединения (а только логическое, через интернет или другую сеть с маршрутизацией а не коммутацией) так, что бы с точки зрения подключенных устройств это выглядело бы как-будто они включены а один сегмент (например в один свитч, или для бытового уровня - в один домашний роутер).
"Внутри" VxLAN помешает кадры etherneth внутрь пакета UDP который в свою очередь инкапсулируется (помещается внутрь) в пакет IP. Результирующий пакет IP может быть передан далее по IP-сетям, в том числе и через интернет. На стороне получателя устройство с настроенной поддержкой VxLAN производит обратную процедуру - деинкапсуляцию
Впрочем, процесс инкапсуляция/деинкапсуляция применяется весьма широко и ничего нового в нем нет.
Терминология
VNI
Идентификатор сети VXLAN (VNI) используется для сегментации каждой подсети уровня 2 аналогично традиционным идентификаторам VLAN.
VTEP
Конечная точка туннеля VXLAN (VTEP) — это устройство с поддержкой VXLAN, которое инкапсулирует и деинкапсулирует пакеты.
Это может быть как программная реализация (Linux или OpenVSwitch в котором есть свой механизм для работы с VxLAN) или аппаратная (Коммутаторы с поддержкой VxLAN).
Разбор прохождения пакетов между двумя POD запущенными на разных нодах
ping from pod on worker 3 to pod on worker 1
root@worker3:/home/ubuntu# nsenter -t 16980 -n
root@worker3:/home/ubuntu# #get routes in namespace
root@worker3:/home/ubuntu# traceroute 10.244.1.34
traceroute to 10.244.1.34 (10.244.1.34), 30 hops max, 60 byte packets
1 10.244.3.1 (10.244.3.1) 0.156 ms 0.048 ms 0.040 ms
2 10.244.1.0 (10.244.1.0) 2.451 ms 2.340 ms 2.239 ms
3 10.244.1.34 (10.244.1.34) 2.143 ms 2.051 ms 1.954 ms
root@worker3:/home/ubuntu# ip r
default via 10.244.3.1 dev eth0
10.244.0.0/16 via 10.244.3.1 dev eth0
10.244.3.0/24 dev eth0 proto kernel scope link src 10.244.3.254
#out of namespace
root@worker3:/home/ubuntu# ifconfig cni0
cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
inet 10.244.3.1 netmask 255.255.255.0 broadcast 10.244.3.255
inet6 fe80::f8c6:3aff:fe2b:8a prefixlen 64 scopeid 0x20<link>
ether fa:c6:3a:2b:00:8a txqueuelen 1000 (Ethernet)
RX packets 112 bytes 6220 (6.2 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 76 bytes 6164 (6.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@worker3:/home/ubuntu# ip r
default via 192.168.122.1 dev enp1s0 proto dhcp src 192.168.122.114 metric 100
10.244.0.0/24 via 10.244.0.0 dev flannel.1 onlink
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
10.244.3.0/24 dev cni0 proto kernel scope link src 10.244.3.1
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.122.0/24 dev enp1s0 proto kernel scope link src 192.168.122.114
192.168.122.1 dev enp1s0 proto dhcp scope link src 192.168.122.114 metric 100
root@worker3:/home/ubuntu# arp -n
Address HWtype HWaddress Flags Mask Iface
10.244.1.0 ether a2:99:54:8b:35:bd CM flannel.1
root@worker3:/home/ubuntu# bridge fdb show dev flannel.1
a2:99:54:8b:35:bd dst 192.168.122.88 self permanent
root@worker1:/home/ubuntu# ifconfig flannel.1
flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
inet 10.244.1.0 netmask 255.255.255.255 broadcast 0.0.0.0
inet6 fe80::a099:54ff:fe8b:35bd prefixlen 64 scopeid 0x20<link>
ether a2:99:54:8b:35:bd txqueuelen 0 (Ethernet)
RX packets 38 bytes 2424 (2.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 24 bytes 2088 (2.0 KB)
TX errors 0 dropped 16 overruns 0 carrier 0 collisions 0
root@worker1:/home/ubuntu# ip r
default via 192.168.122.1 dev enp1s0 proto dhcp src 192.168.122.88 metric 100
10.244.0.0/24 via 10.244.0.0 dev flannel.1 onlink
10.244.1.0/24 dev cni0 proto kernel scope link src 10.244.1.1
10.244.2.0/24 via 10.244.2.0 dev flannel.1 onlink
10.244.3.0/24 via 10.244.3.0 dev flannel.1 onlink
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.122.0/24 dev enp1s0 proto kernel scope link src 192.168.122.88
192.168.122.1 dev enp1s0 proto dhcp scope link src 192.168.122.88 metric 100
root@worker1:/home/ubuntu# ip r get 10.244.1.34
10.244.1.34 dev cni0 src 10.244.1.1 uid 0
cache
(edited)
18:00
4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/ether 86:df:93:cc:8e:62 brd ff:ff:ff:ff:ff:ff promiscuity 0
vxlan id 1 local 192.168.122.114 dev enp1s0 srcport 0 0 dstport 8472 nolearning ttl inherit ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535