Calico Kubernetes the hard way v2 How tunl0 works

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


Как работает IP-in-IP туннель в Calico

Это один из вариантов конфигурации Calico.
Эта статья появилась так-как настройка туннеля не очень-то очевидна.

Схема сети

  • Показаны только 2 ноды, для простоты.
  • 192.168.122.0/24 - физическая сеть



+----------------------------------------+                      +----------------------------------------+ 
| Host: worker1                          |                      | Host:  worker2                         |
|    +---------------------+             |                      |    +---------------------+             |
|    | POD1                |             |                      |    | POD2                |             |
|    |                     |             |                      |    |                     |             |
|    |  10.244.235.132/32  |             |                      |    |  10.244.189.171/32  |             |
|    +---eth0--------------+             |                      |    +---eth0--------------+             |
|         |                              |                      |         |                              |
|         |                              |                      |         |                              | 
|    caliXXXX                            |                      |    caliYYYY                            |
|     На этом интерфейсе НЕТ ip адреса   |                      |     На этом интерфейсе НЕТ ip адреса   |
|                                        |                      |                                        |
|  [ tunl0 ] 10.244.235.136/32           |                      |  [ tunl0 ] 10.244.189.71/32            |
|                                        |                      |                                        |
+--[ eth0  ]-----------------------------+                      +--[ eth0  ]-----------------------------+
    192.168.122.2/24                                                 192.168.122.3/24
      |                                                               |
      +---------------------------------------------------------------+


Настройки интерфейса tunl0

Если не особо вдумываться, то в настройке интерфейса (одинаковом на всех нодах, с одинаковыми настройками) нет ничего необычного

ip -d link show dev tunl0
2: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0 promiscuity 0
    ipip remote any local any ttl inherit nopmtudisc addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535

Однако, если смотреть внимательно то вызывает вопрос вот эта часть конфигурации

link/ipip 0.0.0.0 brd 0.0.0.0 promiscuity 0
ipip remote any local any 
<PRE>

Поясню: обычно <code>ipip</code> туннели представляют собой соединения точка-точка, при этом в настройках туннеля указываются адреса концов туннеля.<br>

Например классический туннель создается командой
<PRE>
ip tunnel add mytun mode ipip remote 251.4.92.217 local 240.101.83.2

IP адреса тут взяты "из головы" и приведены только для примера.
Соответственно, в настройках туннеля можно видеть "оба конца" туннеля.

3: mytun@NONE: <POINTOPOINT,NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ipip 240.101.83.2 peer 251.4.92.217 promiscuity 0
    ipip remote 251.4.92.217 local 240.101.83.2 ttl inherit pmtudisc numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535

Подчеркну, что это именно "транспортные" адреса, между которыми должна быть L3 связность, и это не те адреса которые настроены на интерфейсе mytun

Совершенно не понятно как работает туннель не имеющих определенных "концов" - что с чем связывает туннель с ipip remote any local any
Этот вопрос и разбирается в этой статье.

tunl0 и его особенности

Как показало длительное чтение документации и еще более длительный поиск в интернетах, у модуля ядра ipip есть хоть и документированная, но мало кому известная особенность, а именно.



Обратите внимание на то, что когда загружен модуль ipip, или когда впервые создано IPIP-устройство, ядро Linux создаст в каждом пространстве имён устройство по умолчанию tunl0 с атрибутами local=any и remote=any. Получая IPIP-пакеты, ядро, в определённых случаях, будет перенаправлять их на tunl0 как на устройство, используемое по умолчанию. Это происходит тогда, когда ядро не может найти другого устройства, атрибуты local/remote которого более точно соответствуют адресам источника и приёмника пакетов.

Ссылки