Статьи

Настройка виртуальной машины OpenStack с несколькими сетевыми картами

[Эта статья написана Бараком Меримовичем .]
OpenStack Neutron - Сеть |  Сетевая Автоматизация |  Сетевая оркестровка

В предыдущих статьях мы подробно обсуждали сетевые возможности OpenStack . В этой статье я хотел бы погрузиться в более продвинутый сетевой сценарий OpenStack.

Многие облачные образы не настроены на автоматическое отображение всех доступных сетевых карт. Обычно на них настроена только одна сетевая карта. Чтобы правильно настроить хост в облаке с несколькими сетевыми картами, войдите на компьютер и откройте дополнительные интерфейсы.

echo $'auto eth1\niface eth1 inet dhcp' | sudo tee /etc/network/interfaces.d/eth1.cfg > /dev/null 
sudo ifup eth1

Сети в облаке

Сложная сетевая архитектура является основой современных облаков IaaS. Понимание того, как настроить облачные сети и хосты, крайне важно для работы вашего приложения в облаке. Это особенно верно для Cloudify, платформы с открытым исходным кодом для облачной оркестровки, над которой я работаю.

Облако, как и мир, раньше было плоским

Не так давно большинство поставщиков IaaS поддерживали только плоские сети — все ваши хосты были в одной большой сети. Разделение между службами, работающими в облаке, осуществлялось программно или с помощью брандмауэров / групп безопасности. Но технически все хосты были подключены к одной сети и видны друг другу.

Модель плоской сети проста, и поэтому легко рассуждать и понимать. Это был хороший выбор для первых дней существования облака IaaS, и он, несомненно, помог в первую очередь получить приложения в облаке. Это было одной из вещей, которые сделали EC2 настолько простым в использовании для любого, кто только начинает «облако». Эта модель на самом деле все еще доступна в Amazon Web Services под названием «EC2-Classic». И для многих приложений плоская сеть достаточно хороша.

Но с ростом облачного распространения все более сложные приложения перемещаются в облака, а такие проблемы, как разделение сетей, безопасность, SLA и широковещательные домены, делают модели более сложных сетей необходимыми. Программно-определяемые сети (SDN) восполняют этот пробел. Сейчас они являются основным продуктом большинства основных облаков IaaS. AWS имеет AWS-VPC , OpenStack имеет проект Neutron и существует множество других реализаций.

Для работы с SDN необходимо знать немного больше о том, как информация перемещается между вашими облачными ресурсами. В этом посте я собираюсь обсудить, как настроить хост в облаке, чтобы он хорошо работал со сложными сетями. Я буду использовать OpenStack, но концепции аналогичны для других облачных инфраструктур.

Конфигурация Openstack
Я собираюсь начать с пустого арендатора, доступна только общедоступная сеть.

Во-первых, давайте настроим сети и маршрутизатор:

neutron router-create demo-router 
neutron net-create demo-network-1 
neutron net-create demo-network-2 
neutron subnet-create --name demo-subnet-1 demo-network-1 10.0.0.0/24 
neutron subnet-create --name demo-subnet-2 demo-network-2 10.0.1.0/24 
neutron router-interface-add demo-router demo-subnet-1 
neutron router-interface-add demo-router demo-subnet-2 
neutron router-gateway-set demo-router public

Обратите внимание на сетевые идентификаторы:

neutron net-list 
| id | name | subnets | 
| 2c33efe2-6204-4125-9716-3bc525630016 | demo-network-1 | 928dafa0-83ef-459c-b20d-71d8ea596fa2 10.0.0.0/24 | 
| aa30627e-c181-4a4b-89bf-5dd7c26c244e | demo-network-2 | 26d573f7-7953-4a54-825b-ed7bbc0661c7 10.0.1.0/24 | 
| e502de8d-929a-4ee0-bd18-efa297875cf6 | public | d40dab51-a729-452c-9ee6-b9ad08d10808 |

Начнем со стандартного облачного образа Ubuntu:

glance image-create --name "Ubuntu 12.04 Standard" --location "http://uec-images.ubuntu.com/precise/current/precise-server-cloudimg-amd64-disk1.img" --disk-format qcow2 --container-format bare

Создайте пару ключей и группу безопасности:

nova keypair-add demo-keypair > demo-keypair.pem

chmod 400 demo-keypair.pem

nova secgroup-create demo-security-group "Security group for demo" 
nova secgroup-add-rule demo-security-group tcp 22 22 0.0.0.0/0

Давайте раскрутим экземпляр, подключенный к обеим нашим сетям:

nova boot -flavor m1.small --image "Ubuntu 12.04 Standard" --nic net-id=2c33efe2-6204-4125-9716-3bc525630016 --nic net-id=aa30627e-c181-4a4b-89bf-5dd7c26c244e --security-groups demo-security-group --key-name demo-keypair demo-vm

И установите плавающие IP-адреса для первой сети:

nova list 
| ID | Name | Status | Task State | Power State | Networks | 2b17588b-8980-4489-9a04-6539a159dc3c | demo-vm | ACTIVE | None | Running | demo-network-1=10.0.0.2; demo-network-2=10.0.1.2 |

neutron floatingip-create public

neutron floatingip-list

| id | fixed_ip_address | floating_ip_address | port_id | 
| 49c8b05e-bb8f-4b07-80ed-3155ab6ffc09 |  | 192.168.15.42 |  |

neutron port-list

| id | name | mac_address | fixed_ips | 
| 1ccfd334-7328-4b22-b93e-24a0888276ab | | fa:16:3e:14:39:39 | {"subnet_id": "94598487-c1fc-4f55-ac1f-ef2545d5cfeb", "ip_address": "10.0.1.3"} | 
| a482c4f6-fa74-476e-b1ce-cd8dd0c70815 | | fa:16:3e:18:92:79 | {"subnet_id": "94598487-c1fc-4f55-ac1f-ef2545d5cfeb", "ip_address": "10.0.1.2"} | 
| b23d7836-30c5-4bff-b873-15c87ba051f6 | | fa:16:3e:3a:28:40 | {"subnet_id": "dec6ec74-cfa9-4a08-8792-54900631b98e", "ip_address": "10.0.0.3"} | 
| d421b447-2adf-406f-876b-142238683344 | | fa:16:3e:9d:fc:7f | {"subnet_id": "dec6ec74-cfa9-4a08-8792-54900631b98e", "ip_address": "10.0.0.2"} | 
| dcf8696b-cc80-4b48-b09c-61c0f8ab02ac | | fa:16:3e:5b:39:fb | {"subnet_id": "94598487-c1fc-4f55-ac1f-ef2545d5cfeb", "ip_address": "10.0.1.1"} | 
| f6a1666e-495a-4d3f-afa3-754b3cb3cfc0 | | fa:16:3e:8a:1b:fb | {"subnet_id": "dec6ec74-cfa9-4a08-8792-54900631b98e", "ip_address": "10.0.0.1"} |

neutron floatingip-associate 49c8b05e-bb8f-4b07-80ed-3155ab6ffc09 d421b447-2adf-406f-876b-142238683344


Обратите внимание, как мы сопоставили IP виртуальной машины с ее портом и связали плавающий IP с портом. Я бы хотел, чтобы был более простой способ сделать это из CLI …

Если все работает правильно, вы должны иметь следующую настройку:

образ

Давайте удостоверимся, что ssh работает правильно:

ssh -i demo-keypair.pem ubuntu@192.168.15.31 hostname
demo-vm

Круто, ssh работает. Теперь у нас должно быть две сетевые карты, верно?

ssh -i demo-keypair.pem ubuntu@192.168.15.31 hostname 
demo-vm

Cool, ssh works. Now, we should have two network cards, right? 
ssh -i demo-keypair.pem ubuntu@192.168.15.31 ifconfig 
eth0 Link encap:Ethernet HWaddr fa:16:3e:5f:a2:5f 
inet addr:10.0.0.4 Bcast:10.0.0.255 Mask:255.255.255.0 
inet6 addr: fe80::f816:3eff:fe5f:a25f/64 Scope:Link 
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
RX packets:230 errors:0 dropped:0 overruns:0 frame:0 
TX packets:224 errors:0 dropped:0 overruns:0 carrier:0 
collisions:0 txqueuelen:1000 
RX bytes:46297 (46.2 KB) TX bytes:31130 (31.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:16436 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)

Да ?! ВМ имеет только один рабочий сетевой интерфейс! Где мой второй NIC? Была ли проблема с настройкой сети OpenStack? Ответ здесь:

ssh -i demo-keypair.pem ubuntu@192.168.15.31 ifconfig -a 
eth0 Link encap:Ethernet HWaddr fa:16:3e:5f:a2:5f 
inet addr:10.0.0.4 Bcast:10.0.0.255 Mask:255.255.255.0 
inet6 addr: fe80::f816:3eff:fe5f:a25f/64 Scope:Link 
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
RX packets:324 errors:0 dropped:0 overruns:0 frame:0 
TX packets:332 errors:0 dropped:0 overruns:0 carrier:0 
collisions:0 txqueuelen:1000 
RX bytes:69973 (69.9 KB) TX bytes:47218 (47.2 KB)

eth1 Link encap:Ethernet HWaddr fa:16:3e:29:6d:22 
BROADCAST MULTICAST MTU:1500 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:1000 
RX bytes:0 (0.0 B) TX bytes:0 (0.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:16436 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)

Второй NIC существует, но не работает.

Проблема не в конфигурации сети OpenStack, а в образе. Сам образ должен быть настроен для правильной работы с несколькими сетевыми картами. Все, что нам нужно сделать, это вызвать NIC. Итак, мы ssh в экземпляр:

ssh -i demo-keypair.pem ubuntu@192.168.15.31

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

echo $'auto eth1\niface eth1 inet dhcp' | sudo tee /etc/network/interfaces.d/eth1.cfg > /dev/null 
sudo ifup eth1

Теперь должен быть запущен второй сетевой адаптер:

ifconfig eth1

eth1 Link encap:Ethernet HWaddr fa:16:3e:18:92:79 
inet addr:10.0.1.2 Bcast:10.0.1.255 Mask:255.255.255.0 
inet6 addr: fe80::f816:3eff:fe18:9279/64 Scope:Link 
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
RX packets:81 errors:0 dropped:0 overruns:0 frame:0 
TX packets:45 errors:0 dropped:0 overruns:0 carrier:0 
collisions:0 txqueuelen:1000 
RX bytes:15376 (15.3 KB) TX bytes:3960 (3.9 KB)

И все — ваша виртуальная машина может получить доступ к обеим сетям.

Эта проблема может усложнить жизнь при настройке сложного или даже не очень сложного приложения. Когда этот вопрос повредит вам? Хорошо, представьте себе сценарий, в котором у вас есть веб-сервер и сервер базы данных. Веб-сервер подключен к сети1 и сети2, а сервер базы данных подключен только к сети2. Сеть 1 подключена к внешнему миру через маршрутизатор, а Сеть 2 полностью внутренняя, добавляя еще один уровень безопасности для сервера критически важной базы данных. Так что же произойдет, если веб-сервер имеет только одну сетевую карту? Если подключен только сетевой адаптер для Network1, веб-сервер не сможет получить доступ к базе данных. Если подключен только сетевой адаптер для Network2, веб-сервер не может быть доступен из внешнего мира. Еще хуже, если этот веб-сервер доступен через плавающий IP-адрес, этот IP-адрес также не будет работать,так что вы не сможете получить доступ к веб-серверу и решить проблему. Tricky.

In conclusion

The above commands will bring up your additional network card. You will of-course need to repeat this process for each additional network card, and for each VM. You can use a start-up script (a.k.a. user-data script) or system service to run these commands, but there are better ways. I’ll discuss how to automate the network setup in a follow-up post.

This was originally posted at Barak’s blog Head in the Clouds, find it here.