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