Flannel Kubernetes the hard way v2

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску


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