Flannel Kubernetes the hard way v2: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 67: Строка 67:
 
# ip route show
 
# ip route show
 
</PRE>
 
</PRE>
  +
<PRE>
 
default via 10.244.3.1 dev eth0
 
default via 10.244.3.1 dev eth0
 
10.244.0.0/16 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
 
10.244.3.0/24 dev eth0 proto kernel scope link src 10.244.3.254
<PRE>
+
</PRE>
  +
 
Из этого видно что первый хоп (первый адрес в трейсе) это адрес шлюза для '''pod3''' (10.244.3.1), это адрес интерфейса cni0 на ноде '''worker3''', на которой и запущен pod
 
Из этого видно что первый хоп (первый адрес в трейсе) это адрес шлюза для '''pod3''' (10.244.3.1), это адрес интерфейса cni0 на ноде '''worker3''', на которой и запущен pod
   

Версия 21:32, 21 ноября 2022


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 запущенными на разных нодах

Далее разберем работу Flannel на примере прохождения пакетов из одного POD запущенного на worker3 на другой запущенный на ноде worker1 Для простоты буду называть

  • pod запущенный на ноде worker3 - pod3
  • pod запущенный на ноде worker1 - pod1


Проверяем как идет маршрутизация из pod3 к адресу pod1: 10.244.1.34

# 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

Из этого маршрута видно три "маршрутизатора"


Проверяем таблицу маршрутизации внутри pod3

# ip route show
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 

Из этого видно что первый хоп (первый адрес в трейсе) это адрес шлюза для pod3 (10.244.3.1), это адрес интерфейса cni0 на ноде worker3, на которой и запущен pod


В этом можно убедиться, запустив ifconfigна ноде worker3 за пределами контейнера

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