Глава 3. Построение вашей первой сетевой среды Docker

Данная глава описывает практические примеры построения сетей Docker, охватывая множество контейнеров по множеству хостов. Мы охватим следующие темы:

  • Введение в Piperwork

  • Множество контейнеров поверх одного хоста

  • В направлении масштабирования сетевых сред - введение в Open vSwitch

  • Построение сетей с оверлейными сетевыми средами - Flannel

  • Сравнение параметров построения сетей Docker

 Введение в Piperwork

Конвейеризация (Piperwork) позволяет вам соединять воедино контейнеры в произвольных сложных сценарях.

На практике она создаёт унаследованный мост Linux, добавляет новый интерфейс в контейнер, а затем подключает данный интерфейс к этому мосту; контейнеры получают сегмент сетевой среды в котором они взаимодействуют друг с другом.

 Множество контейнеров поверх одного хоста

Piperwork является сценарием оболочки и его установка проста:


#sudo wget -O /usr/local/bin/pipework
https://raw.githubusercontent.com/jpetazzo/pipework/master/pipework && sudo
chmod +x /usr/local/bin/pipework
 	   

Следующий рисунок отображает взаимодействие контейнеров с применением Pipework:

 

Рисунок 3.1. Взаимодействие контейнеров с применением Pipework


Для начала создайте два контейнера:


#docker run -i -t --name c1 ubuntu:latest /bin/bash
root@5afb44195a69:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:10
          inet addr:172.17.0.16  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:10/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:13 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1038 (1.0 KB)  TX bytes:738 (738.0 B)
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

#docker run -i -t --name c2 ubuntu:latest /bin/bash
root@c94d53a76a9b:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:11
          inet addr:172.17.0.17  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:11/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:648 (648.0 B)  TX bytes:738 (738.0 B)
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
 	   

Теперь давайте применим Pipework для соединения с ними:


[root@us-east-1 ~]# s3cmd ls s3://owncloud#sudo pipework brpipe c1 192.168.1.1/24
 	   

Данная команда создаёт на машине хоста мост, brpipe. Она добавляет интефейс eth1 к вашему контейнеру с1 с IP адресом 192.168.1.1 и подключает интерфейс к мосту следующим образом:


root@5afb44195a69:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:10
          inet addr:172.17.0.16  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:10/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:13 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1038 (1.0 KB)  TX bytes:738 (738.0 B)
eth1      Link encap:Ethernet  HWaddr ce:72:c5:12:4a:1a
          inet addr:192.168.1.1  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::cc72:c5ff:fe12:4a1a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:23 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1806 (1.8 KB)  TX bytes:690 (690.0 B)
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

#sudo pipework brpipe c2 192.168.1.2/24
 	   

Эта команда не создаст мост brpipe, так как он уже существует. Она добавит интерфейс eth1 к контейнеру c2 и соединит его с этим мостом следующим образом:


root@c94d53a76a9b:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:11
          inet addr:172.17.0.17  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:11/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:648 (648.0 B)  TX bytes:738 (738.0 B)
eth1      Link encap:Ethernet  HWaddr 36:86:fb:9e:88:ba
          inet addr:192.168.1.2  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::3486:fbff:fe9e:88ba/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:648 (648.0 B)  TX bytes:690 (690.0 B)
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
 	   

Теперь контейнеры соединены и будут способны пинговать друг друга, так как они оба находятся в одной подсети, а именно, 192.168.1.0/24. Pipework предоставляет преимущество добавлления статичных IP адресов вашим контейнерам.

  Переплетение (Weave) ваших контейнеров

Weave (переплетение) создаёт виртуальную сетевую среду, которая способна соединять контейнеры Docker на множестве хостов так, как если бы они соединялись одним комутатором. Маршрутизатор Weave сам по себе выполняется в качестве контейнера Docker и может кодировать обмен для передачи его через Интернет. Предоставляемые сетевой средой Weave контейнеры приложений могут быть сделаны доступными для внешнего мира, в зависимости от того, где эти контейнеры выполняются.

Воспользуйтесь следующим кодом для установки Weave:


#sudo curl -L git.io/weave -o /usr/local/bin/weave
#sudo chmod a+x /usr/local/bin/weave
 	   

Следующий рисунок изображает взаимодействие с множеством хостов с применением Weave

 

Рисунок 3.2.Взаимодействие с множеством хостов посредством Weave


На $HOST1 мы выполним:


# weave launch
# eval $(weave proxy-env)
# docker run --name c1 -ti ubuntu
 	   

Далее мы повторим аналогичные шаги на $HOST2:


# weave launch $HOST1
# eval $(weave proxy-env)
# docker run --name c2 -ti ubuntu
 	   

В запущенном на $HOST1 контейнере создаётся следующий вывод:


root@c1:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:21
          inet addr:172.17.0.33  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:21/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:38 errors:0 dropped:0 overruns:0 frame:0
          TX packets:34 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:3166 (3.1 KB)  TX bytes:2299 (2.2 KB)
ethwe     Link encap:Ethernet  HWaddr aa:99:8a:d5:4d:d4
          inet addr:10.128.0.3  Bcast:0.0.0.0  Mask:255.192.0.0
          inet6 addr: fe80::a899:8aff:fed5:4dd4/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:65535  Metric:1
          RX packets:130 errors:0 dropped:0 overruns:0 frame:0
          TX packets:74 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:11028 (11.0 KB)  TX bytes:6108 (6.1 KB)
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
 	   

Мы може увидеть интерфейс Weave, ethwe, воспользовавшись командой ifconfig:


root@c2:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:04
          inet addr:172.17.0.4  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:4/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:28 errors:0 dropped:0 overruns:0 frame:0
          TX packets:29 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:2412 (2.4 KB)  TX bytes:2016 (2.0 KB)
ethwe     Link encap:Ethernet  HWaddr 8e:7c:17:0d:0e:03
          inet addr:10.160.0.1  Bcast:0.0.0.0  Mask:255.192.0.0
          inet6 addr: fe80::8c7c:17ff:fe0d:e03/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:65535  Metric:1
          RX packets:139 errors:0 dropped:0 overruns:0 frame:0
          TX packets:74 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:11718 (11.7 KB)  TX bytes:6108 (6.1 KB)
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

#root@c1:/# ping -c 1 -q c2
PING c2.weave.local (10.160.0.1) 56(84) bytes of data.
--- c2.weave.local ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.317/1.317/1.317/0.000 ms
 	   

Аналогично, в запущенном на $HOST2 контейнере создаётся следующий вывод:


#root@c2:/# ping -c 1 -q c1
PING c1.weave.local (10.128.0.3) 56(84) bytes of data.
--- c1.weave.local ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.658/1.658/1.658/0.000 ms
 	   

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

 Open vSwitch

Docker по умолчанию использует мост docker0. Однако, существуют варианты применения, при которых может требоваться Open vSwitch (OVS) вместо моста Linux. Отдельный мост Linux может обрабатывать только 1024 порта- это ограничивает масштабируемость Docker, поскольку мы можем создать только 1024 контейнера, причйм каждый с отдельным сетевым интерфейсом.

  OVS одного хоста

Теперь мы установим OVS на отдельный хост, создадим два контейнера, и соединим их мостом OVS.

Для установки OVS примените эту команду:


# sudo apt-get install openvswitch-switch
 	   

Установите утилиту ovs-docker следующим образом:


# cd /usr/bin
# wget https://raw.githubusercontent.com/openvswitch/ovs/master/utilities/ovsdocker
# chmod a+rwx ovs-docker
 	   

Приводимая ниже схема показывает OVS с одним хостом:

 

Рисунок 3.3. OVS одного хоста


 

Создание моста OVS

Здесь мы добавим новый мост OVS и настроим его таким образом, чтобы он мог достичь контейнеры, присоединённые к различным сетевым средам следующим образом:


# ovs-vsctl add-br ovs-br1
# ifconfig ovs-br1 173.16.1.1 netmask 255.255.255.0 up
 	   

Из моста OVS добавим порт к контейнеру Docker применив следующую последовательность:

  1. Создадим два контейнера Ubuntu Docker:

    
    # docker run -I -t --name container1 ubuntu /bin/bash
    # docekr run -I -t --name container2 ubuntu /bin/bash
     	   
  2. Соединим эти контейнеры с вашим моcтом OVS:

    
    # ovs-docker add-port ovs-br1 eth1 container1 --ipaddress=173.16.1.2/24
    # ovs-docker add-port ovs-br1 eth1 container2 --ipaddress=173.16.1.3/24
     	   
  3. Ппри помощи команды ping проверим соединение между двумя контейнерами, взаимодействующими через мост OVS. Для начала определим их IP адреса:

    
    # docker exec container1 ifconfig
    eth0      Link encap:Ethernet  HWaddr 02:42:ac:10:11:02
              inet addr:172.16.17.2  Bcast:0.0.0.0  Mask:255.255.255.0
              inet6 addr: fe80::42:acff:fe10:1102/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1472  Metric:1
              RX packets:36 errors:0 dropped:0 overruns:0 frame:0
              TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:4956 (4.9 KB)  TX bytes:648 (648.0 B)
    lo        Link encap:Local Loopback
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
    
    # docker exec container2 ifconfig
    eth0      Link encap:Ethernet  HWaddr 02:42:ac:10:11:03
              inet addr:172.16.17.3  Bcast:0.0.0.0  Mask:255.255.255.0
              inet6 addr: fe80::42:acff:fe10:1103/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1472  Metric:1
              RX packets:27 errors:0 dropped:0 overruns:0 frame:0
              TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:4201 (4.2 KB)  TX bytes:648 (648.0 B)
    
    lo        Link encap:Local Loopback
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
     	   

    Теперь, когда мы знаем IP адреса container1 и container2, мы можем пропинговать их:

    
    # docker exec container2 ping 172.16.17.2
    PING 172.16.17.2 (172.16.17.2) 56(84) bytes of data.
    64 bytes from 172.16.17.2: icmp_seq=1 ttl=64 time=0.257 ms
    64 bytes from 172.16.17.2: icmp_seq=2 ttl=64 time=0.048 ms
    64 bytes from 172.16.17.2: icmp_seq=3 ttl=64 time=0.052 ms
    
    # docker exec container1 ping 172.16.17.2
    PING 172.16.17.2 (172.16.17.2) 56(84) bytes of data.
    64 bytes from 172.16.17.2: icmp_seq=1 ttl=64 time=0.060 ms
    64 bytes from 172.16.17.2: icmp_seq=2 ttl=64 time=0.035 ms
    64 bytes from 172.16.17.2: icmp_seq=3 ttl=64 time=0.031 ms
     	   

  OVS множества хостов

Давайте рассмотрим как соединять контейнеры Docker с применением OVS на множестве хостов.

Рассмотрим нашу сборку как это отображено на диаграмме ниже, которая содержит два хоста, Host1 и Host2, работающих под управлением Ubuntu 14.04:

 

Рисунок 3.4. OVS с двумя хостами


На обоих хостах установим Docker и Open vSwitch:


# wget -qO- https://get.docker.com/ | sh
# sudo apt-get install openvswitch-switch
 	   

Установим утилиту ovs-docker:


# cd /usr/bin
# wget https://raw.githubusercontent.com/openvswitch/ovs/master/utilities/ovsdocker
# chmod a+rwx ovs-docker
 	   

По умолчанию, Docker случайным образом выбирает сеть для выполнения в ней контейнеров. Он создаёт мост, docker0 и назначает ему IP адрес (172.17.42.1). Следовательно, у обоих Host1 и Host2 IP адреса моста docker0 являются одинаковыми, что осложняет взаимодействие контейнеров в обоих ваших хостах. Для преодоления этого препятствия, давайте назначим статические IP адреса вашей сетевой среде, а именно: 192.168.10.0/24.

Давайте взглянем на то, как изменится подсеть Docker по умолчанию.

Выполним на Host1 следующие команды:


# service docker stop
# ip link set dev docker0 down
# ip addr del 172.17.42.1/16 dev docker0
# ip addr add 192.168.10.1/24 dev docker0
# ip link set dev docker0 up
# ip addr show docker0
# service docker start
 	   

Добавим мост br0 OVS:


# ovs-vsctl add-br br0
 	   

Создадим туннель к другому хосту и подключимся к нему:


# add-port br0 gre0—set interface gre0 type=gre
options:remote_ip=30.30.30.8
 	   

Добавим мост br0 к мосту docker0:


# brctl addif docker0 br0
 	   

На Host2 выполним следующие команды:


# service docker stop
# iptables -t nat -F POSTROUTING
# ip link set dev docker0 down
# ip addr del 172.17.42.1/16 dev docker0
# ip addr add 192.168.10.2/24 dev docker0
# ip link set dev docker0 up
# ip addr show docker0
# service docker start
 	   

Добавим OVS мост br0:


# ip link set br0 up
# ovs-vsctl add-br br0
 	   

Создадим туннель к другому хосту и присоединимся к нему:


# br0 bridge ovs-vsctl add-port br0 gre0—set interface gre0 type=gre options:remote_ip=30.30.30.7
 	   

Добавим мост br0 к нашему мосту docker0:


# brctl addif docker0 br0
 	   

Мост docker0 подключён к другому мосту, br0. В то же время, это мост OVS. Это означает, что весь обмен между мостами также маршрутизируется через br0.

Кроме того, нам необходимо соединить вместе сети с двух хостов, в которых выполняются контейнеры. Для этой цели применяется туннель GRE. Этот туннель присоединяется к мосту OVS br0 и, в результате, к docker0.

После выполнения предыдущих команд на обоих хостах, у вас должна быть возможность пинговать адреса моста docker0 с обоих хостов.

При применении команды ping на Host1 создаётся следующий вывод:


# ping 192.168.10.2
PING 192.168.10.2 (192.168.10.2) 56(84) bytes of data.
64 bytes from 192.168.10.2: icmp_seq=1 ttl=64 time=0.088 ms
64 bytes from 192.168.10.2: icmp_seq=2 ttl=64 time=0.032 ms
^C

--- 192.168.10.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.032/0.060/0.088/0.028 ms
 	   

Когда мы используем команду ping на Host2, мы получаем:


# ping 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.088 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.032 ms
^C

--- 192.168.10.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.032/0.060/0.088/0.028 ms
 	   

Давайте посмотрим как создавать контейнеры на обоих наших хостах:

На Host1 воспользуемся следующим кодом:


# docker run -t -i --name container1 ubuntu:latest /bin/bash
 	   

На Host2 применим:


# docker run -t -i --name container2 ubuntu:latest /bin/bash
 	   

Теперь мы можем пинговать container2 из container1. Таким образом, мы соединили контейнеры Docker на множестве хостов при помощи Open vSwitch.

 Построение сетей с оверлейными сетевыми средами - Flannel

Flannel является уровнем виртуальной сетевой среды, который предоставляет подсеть каждому хосту для её применения контейнерами Docker. Он поставляется в пакете с CoreOS, однако также может быть настроен с прочими ОС Linux. Flannel создаёт оверлеи на самом деле соединяясь с мостом Docker, к которому, в свою очередь, присоединены контейнеры, как это показано на рисунке ниже. Для установки Flannel необходимы две машины хостов или ВМ, которые могут быть как CoreOS, что более предпочтительно, ОС Linux, как это ображено на данном рисунке:

 

Рисунок 3.5. Flannel с двумя хостами


Код Flannel может быть клонирован с GitHub и собран локально, если это необходимо, на различных предпочтениях ОС Linux, как показано здесь. В качестве предустановленного он поставляется в CoreOS:


# git clone https://github.com/coreos/flannel.git
Cloning into 'flannel'...
remote: Counting objects: 2141, done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 2141 (delta 6), reused 0 (delta 0), pack-reused 2122
Receiving objects: 100% (2141/2141), 4.
Checking connectivity… done.

# sudo docker run -v `pwd`:/opt/flannel -i -t google/golang /bin/bash -c
"cd /opt/flannel && ./build"
Building flanneld…
 	   

Машины CoreOs могут быть легко настроены с применением Vagrant и VirtualBox, как это оговаривается в руководстве по следующей ссылке: https://coreos.com/os/docs/latest/booting-on-vagrant.html.

После того как машина создана и на ней выполнена регистрация, мы увидим мост Flannel, автоматически создающийся с применением настройки etcd:


# ifconfig flannel0
flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1472
          inet 10.1.30.0 netmask 255.255.0.0 destination 10.1.30.0
          unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 
txqueuelen 500 (UNSPEC)
          RX packets 243  bytes 20692 (20.2 KiB)
          RX errors 0  dropped 0  overruns 0  frame 0
          TX packets 304 bytes 25536 (24.9 KiB)
          TX errors 0  dropped 0  overruns 0  carrier 0  collisions 0
 	   

Среда Flannel может быть проверена просмотром subnet.env:


# cat /run/flannel/subnet.env
FLANNEL_NETWORK=10.1.0.0/16
FLANNEL_SUBNET=10.1.30.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=true
 	   

Демон Docker должен быть перезапущен с применением следующей команды для переустановки сетевой среды с параметрами подсети от моста Flannel:


# source /run/flannel/subnet.env
# sudo rm /var/run/docker.pid
# sudo ifconfig docker0 ${FLANNEL_SUBNET}
# sudo docker -d --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU} & INFO[0000]
[graphdriver] using prior storage driver "overlay"
INFO[0000] Option DefaultDriver: bridge
INFO[0000] Option DefaultNetwork: bridge
INFO[0000] Listening for HTTP on unix (/var/run/docker.sock)
INFO[0000] Firewalld running: false
INFO[0000] Loading containers: start.
..............
INFO[0000] Loading containers: done.
INFO[0000] Daemon has completed initialization
INFO[0000] Docker daemon
commit=cedd534-dirty execdriver=native-0.2 graphdriver=overlay
version=1.8.3
 	   

Для вторго хоста среда Flannel может быть проверена просмотром subnet.env:


# cat /run/flannel/subnet.env
FLANNEL_NETWORK=10.1.0.0/16
FLANNEL_SUBNET=10.1.31.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=true
 	   

На втором хосте размещается другая подсеть. Служба Docker также может быть перезапущена на этом хосте с указанием моста Flannel:


# source /run/flannel/subnet.env
# sudo ifconfig docker0 ${FLANNEL_SUBNET}
# sudo docker -d --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU} & INFO[0000]
[graphdriver] using prior storage driver "overlay"
INFO[0000] Listening for HTTP on unix (/var/run/docker.sock)
INFO[0000] Option DefaultDriver: bridge
INFO[0000] Option DefaultNetwork: bridge
INFO[0000] Firewalld running: false
INFO[0000] Loading containers: start.
....
INFO[0000] Loading containers: done.
INFO[0000] Daemon has completed initialization
INFO[0000] Docker daemon
commit=cedd534-dirty execdriver=native-0.2 graphdriver=overlay
version=1.8.3
 	   

Контейнеры Docker могут быть созданы на соответствующих хостах и они могут быть протестированы с применением команды ping для проверки связности оверлейной сетевой среды Flannel:


#docker run -it ubuntu /bin/bash
INFO[0013] POST /v1.20/containers/create
INFO[0013] POST
/v1.20/containers/1d1582111801c8788695910e57c02fdba593f443c15e2f1db9174ed9078db809/attach?stderr=1&stdin=1&stdout=1&stream=1
INFO[0013] POST
/v1.20/containers/1d1582111801c8788695910e57c02fdba593f443c15e2f1db9174ed9078db809/start
INFO[0013] POST
/v1.20/containers/1d1582111801c8788695910e57c02fdba593f443c15e2f1db9174ed9078db809/resize?h=44&w=80

root@1d1582111801:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:0a:01:1e:02
          inet addr:10.1.30.2  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::42:aff:fe01:1e02/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1472  Metric:1
          RX packets:11 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:969 (969.0 B)  TX bytes:508 (508.0 B)
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
 	   

Для Host2 воспользуйтесь следующими командами:


# docker run -it ubuntu /bin/bash
root@ed070166624a:/# ifconfig
eth0       Link encap:Ethernet  HWaddr 02:42:0a:01:1f:02
           inet addr:10.1.31.2  Bcast:0.0.0.0  Mask:255.255.255.0
           inet6 addr: fe80::42:aff:fe01:1f02/64 Scope:Link
           UP BROADCAST RUNNING MULTICAST  MTU:1472  Metric:1
           RX packets:18 errors:0 dropped:2 overruns:0 frame:0
           TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0
           RX bytes:1544 (1.5 KB)  TX bytes:598 (598.0 B)
lo         Link encap:Local Loopback
           inet addr:127.0.0.1  Mask:255.0.0.0
           inet6 addr: ::1/128 Scope:Host
           UP LOOPBACK RUNNING  MTU:65536  Metric:1
           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0
           RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
root@ed070166624a:/# ping 10.1.30.2
PING 10.1.30.2 (10.1.30.2) 56(84) bytes of data.
64 bytes from 10.1.30.2: icmp_seq=1 ttl=60 time=3.61 ms
64 bytes from 10.1.30.2: icmp_seq=2 ttl=60 time=1.38 ms
64 bytes from 10.1.30.2: icmp_seq=3 ttl=60 time=0.695 ms
64 bytes from 10.1.30.2: icmp_seq=4 ttl=60 time=1.49 ms
 	   

Таким образом, в предыдущем примере мы увидели уменьшение сложности с применением Flannel при выполнении агента flanneld на каждом хосте, который отвечает за выделение подсети, сдаваемой в аренду из предварительно настроенного простанства адресов. Flannel внутренне применяет etcd для сохранения настроек сетевой среды и прочих подробностей таких, как IP хоста и выделяемая подсеть. Перенаправление пакетов достигается применением лежащей в основе стратегии.

Flannel также имеет целью решение проблемы развёртывания Kubernetes в поставщиках облачных решений, отличных от GCE, в которых оверлеи ячеек сетевых сред Flannel могут облегчить проблему назначения уникального IP адреса каждому соединению путём создания подсети для каждого сервера.

 Заключение

В этой главе мы изучили как контейнеры Docker взаимодейтсвуют на множестве хостов с применением различных параметров сетевой среды, таких как {Pipework}, Weave, OVS и Flannel. Pipework использует наследуемый мост Linux, Weave создаёт виртуальную сетевую среду, OVS применяет технологию туннелирования GRE, а Flannel обеспечивает отдельные подсети для каждого хоста для соединения контейнеров на множестве хостов. Некоторые из реализаций, такие как Pipeworks, являются наследуемыми и остаются абсолютными на всём промежутке времени, в то время как другие разрабатываются для применения в контексте определённых ОС, например, Flannel с CoreOS.

Следующий рисунок показывает базовое сопоставление параметров построения сетевых сред Docker:

 

Рисунок 3.6. Сопоставление параметров построения сети Docker


В следующей главе мы обсудим то, как контейнеры Docker выстраивают сетевые среды с применением таких инфраструктур, как Kubernetes, Docker Swarm и Mesosphere.