Ситцевый принцип

Kubernetes

Решения для контейнерных сетей

Контейнерная сеть с несколькими узлами должна решать две проблемы:

  • Как контейнеры назначают IP-адреса

    Flannel разработал механизм глобального распределения сетевых адресов, то есть использует etcd для хранения отношений между сегментами сети и узлами, а затем flannel настраивает Docker (или другие инструменты контейнера) на каждом узле, только в сегменте сети, выделенном текущему узлу. , Выберите IP-адрес контейнера. Это обеспечивает глобальную уникальность назначения IP-адреса.

  • Как маршрутизируются IP-адреса контейнера

    1. оверлейная сеть
      • vxlan
      • udp
    2. прямой маршрут
      • host-gateway

В режиме оверлейной сети, будь то режим UDP или режим VXLAN, пакеты данных, отправляемые контейнером в сеть, будут инкапсулированы, что неизбежно окажет определенное влияние на производительность. В режиме host-hateway flannel сбрасывает информацию о маршрутизации сети контейнеров в таблицу маршрутизации хоста через агент, работающий на каждом узле.IP-адрес хоста целевого контейнера является начальным адресом, но flannel может только изменять маршрутизацию каждого хоста.Как только хост будет разделен другими устройствами маршрутизации, такими как маршрутизаторы уровня 3, пакет будет отброшен на устройстве маршрутизации. Таким образом, режим Host-Gateway можно использовать только для непосредственно доступных сетей уровня 2. Такие сети обычно имеют небольшой масштаб из-за проблем с широковещательным штормом. В этой статье будет представлена ​​еще одна схема контейнерной сети, основанная на прямой маршрутизации.

Calico

Калико основные компоненты

Calico очень похож на режим hots-gateway. Оба реализуют контейнерную сеть, добавляя правила маршрутизации к хосту. Однако Calico не поддерживает информацию о маршрутизации через Etcd и Flanned хоста, как Flannel. Вместо этого он используетПротокол BGP (протокол пограничного шлюза)Распределите информацию о маршрутизации внутри кластера.

Felix

Felix — это демон (развернутый как DeaemonSe в k8s), который работает на хосте в качестве агента и отвечает за обновление информации таблицы маршрутизации хоста, обслуживание сетевых интерфейсов и отчет о состоянии хоста.

BGPClient

Роль BGPClinet заключается в чтении информации о маршрутизации, записанной Felix в ядро, и распространении информации о маршрутизации на другие узлы в кластере.

Как работает Калико

Возьмем, к примеру, доступ контейнера 1 к контейнеру 2. Сначала войдите в контейнер 1, чтобы просмотреть его таблицу маршрутизации и конфигурацию сети.

root@nginx-deployment-6b474476c4-p82xb:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
3: eth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default 
    link/ether f6:64:05:f3:4b:be brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.123.5/32 brd 172.16.123.5 scope global eth0
       valid_lft forever preferred_lft forever
4: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0

Видно, что IP-адрес контейнера 1 — 172.16.123.5/32, а MAC-адрес — ff:ff:ff:ff:ff:ff, что, очевидно, является фиксированным MAC-адресом, потому что Calico не заботится о MAC-адрес второго уровня. Обратите внимание только на IP-адрес уровня 3.

Когда контейнер 1 выполняет Ping 172.16.215.3/32, потому что двое не в одной сети, контейнер 1 проверит свою собственную таблицу маршрутизации.

root@nginx-deployment-6b474476c4-p82xb:/# ip route
default via 169.254.1.1 dev eth0 
169.254.1.1 dev eth0 scope link 

Все пакеты контейнера будут отправлены на следующий переход 169.254.1.1 через eth0.Контейнер должен знать MAC-адрес следующего перехода и куда отправлять запрос ARP. eth0 — это один конец пары veth, так где же ее другой конец. мы можем пройтиethtool -S eth0Перечислите индекс одноранговой сетевой карты.

root@nginx-deployment-6b474476c4-p82xb:/# ethtool -S eth0
NIC statistics:
    peer_ifindex: 4
    rx_queue_0_xdp_packets: 0
    rx_queue_0_xdp_bytes: 0
    rx_queue_0_xdp_drops: 0

Сетевая карта с индексом 4 на хосте

root@work2:/home/work2/Desktop# ip addr
4: cali85354e41ec1@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP group default 
   link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 0
   inet6 fe80::ecee:eeff:feee:eeee/64 scope link 
      valid_lft forever preferred_lft forever

Эта сетевая карта не имеет IP-адреса.При получении ARP-пакета с запросом 169.254.1.1 она «подхватит», то есть сообщит контейнеру 1 свой MAC-адрес, а последующие пакеты будут перенаправлены на хост для обработки .

root@work2:/home/work2/Desktop# cat /proc/sys/net/ipv4/conf/cali85354e41ec1/proxy_arp
1

После того, как сетевая карта calixx на хосте получает пакет, она пересылает его в соответствии с таблицей маршрутизации.

root@work2:/home/work2/Desktop# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.2     0.0.0.0         UG    100    0        0 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 ens33
172.16.123.0    0.0.0.0         255.255.255.192 U     0      0        0 *
172.16.123.5    0.0.0.0         255.255.255.255 UH    0      0        0 cali85354e41ec1
172.16.123.6    0.0.0.0         255.255.255.255 UH    0      0        0 cali35e3a5cb80b
172.16.215.0    192.168.2.132   255.255.255.192 UG    0      0        0 tunl0
172.16.243.192  192.168.2.131   255.255.255.192 UG    0      0        0 tunl0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.2.0     0.0.0.0         255.255.255.0   U     100    0        0 ens33

Далее пакет данных будет отправлен на следующий переход через устройство tun0, которым является хост 192.168.2.132/32 контейнера 2. Когда пакет приходит на хост, он сначала проходит через правила iptables, если он перехватывается iptables, то пакет отбрасывается. Затем вперед через таблицу маршрутизации, затем изcali34af9914629Карта, отправленная в контейнер 2.

# 容器2宿主机路由表
root@work1:/home/work1/Desktop# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.2     0.0.0.0         UG    100    0        0 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 ens33
172.16.123.0    192.168.2.133   255.255.255.192 UG    0      0        0 tunl0
172.16.215.0    0.0.0.0         255.255.255.192 U     0      0        0 *
172.16.215.3    0.0.0.0         255.255.255.255 UH    0      0        0 cali34af9914629
172.16.243.192  192.168.2.131   255.255.255.192 UG    0      0        0 tunl0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.2.0     0.0.0.0         255.255.255.0   U     100    0        0 ens33

Описанный выше процесс показан на рисунке ниже

IPIP-режим

Из приведенного выше анализа видно, что calico и хост требуют, чтобы одна и та же сеть уровня 2 была доступна, но в фактическом развертывании сеть кластера обычно делится на разные сетевые сегменты, как calico обрабатывает связь между сегментами сети. . В этом случае для Calico необходимо включить режим IPIP.

В режиме IPIP calico будет использоватьtunl0Устройство, tunl0, является устройством IP-туннеля.С помощью приведенной выше таблицы маршрутизации обнаружено, что IP-пакет будет передан устройству tunl0. Устройство tunl0 будет инкапсулировать IP-пакеты как хост-IP-пакеты. Инкапсулированный IP-пакет показан на следующем рисунке.

Таким образом, новый IP-пакет может быть отправлен через хост-маршрутизатор, как показано на следующем рисунке.

Cailco в режиме IPIP Packet будет привести к тому, что какое-то влияние на производительность, но относительно фланелевой режим VXLAN лучше.

BGP Route Reflector

В конфигурации по умолчанию BGPClient каждого хоста должен установить соединение со всеми BGPClients в кластере для обмена информацией о маршрутизации.По мере расширения масштаба кластера сеть кластера будет сталкиваться с огромным давлением и таблицей маршрутизации хоста. тоже изменится.слишком большой. Поэтому в крупномасштабных кластерах отражатель маршрутов BGP обычно используется в качестве центральной точки для клиентских подключений BGP, что позволяет избежать взаимодействия с каждым клиентом BGP в Интернете. Calico использует BGP Route Reflector, чтобы сократить количество подключений между данным клиентом BGP и другими клиентами BGP в кластере. Пользователи также могут развернуть несколько служб BGP Route Reflector для достижения высокой доступности. Рефлекторы маршрутов помогают только в управлении сетями BGP, и пакеты рабочей нагрузки не проходят через них.