Настройка внешней сети
Платформа поддерживает варианты сетей:
VLAN.VxLANвнутри тенанта.VxLANс анонсом черезBGP.
В этом разделе приведена краткая инструкция по созданию внешней VLAN-сети с использованием команд OpenStack CLI.
Для реализации данной задачи на уровне Neutron создается связка Network-Subnet, которая будет выходить в корпоративную сеть в виде инкапсулированного VLAN-трафика.
Чтобы создать внешнюю сеть:
-
Измените настройки в конфигурационных файлах, расположенных в директории
<vkcloud>/group_vars/на деплой-ноде:-
В файле
<vkcloud>/vars.ymlзадайте параметры конфигурации для внешней Neutron-сети:external_networks_extend:"172.25.120.0/24": # адрес внешней подсетиvlan: 2013 # Номер VLAN во внешней подсетиproject_id: "e01b26b84caa463f9c1691720fba5d53" # ID проекта "admin"; можно узнать через команду `openstack project show admin`network_name: "ext-net" # Название сети (будет отображаться в веб-интерфейсе под этим именем)shared: "True" # Всегда True -
В следующих файлах задайте настройки мостов для выхода ВМ во внешнюю сеть: br-vlan интерфейс для выхода с VLAN, br-ex интерфейс для выхода без VLAN (создается как дополнение, без какого-либо присвоенного IP):
-
<vkcloud>_compute/vars.yml— файл с настройками вычислительных узлов, на которых будут запускаться ВМ.compute_network_ifcfg_vlan: |DEVICE=br-vlanDEVICETYPE=ovsTYPE=OVSBridgeBOOTPROTO=noneONBOOT=yesNOZEROCONF=yesOVS_EXTRA="add-port br-vlan bond0"compute_network_ifcfg_external: |DEVICE=br-exDEVICETYPE=ovsTYPE=OVSBridgeBOOTPROTO=staticONBOOT=yesNOZEROCONF=yes{% for gw_ip in networks.external | ipaddr('-2') %}IPADDR{{ loop.index }}={{ gw_ip | ipaddr('address') }}NETMASK{{ loop.index }}=255.255.255.255{% endfor %} -
<vkcloud>_dhcp/vars.yml— файл с настройками DHCP:neutron_dhcp_ifcfg_external: |DEVICE=br-exDEVICETYPE=ovsTYPE=OVSBridgeBOOTPROTO=staticONBOOT=yesNOZEROCONF=yes{% for gw_ip in networks.external | ipaddr('-2') %}IPADDR{{ loop.index }}={{ gw_ip | ipaddr('address') }}NETMASK{{ loop.index }}=255.255.255.255{% endfor %}neutron_dhcp_ifcfg_vlan: |DEVICE=br-vlanDEVICETYPE=ovsTYPE=OVSBridgeBOOTPROTO=noneONBOOT=yesNOZEROCONF=yesOVS_EXTRA="add-port br-vlan bond0" -
<vkcloud>_octavia/vars.yml— файл с настройками балансировщика Octavia:octavia_network_ifcfg_external: |DEVICE=br-exDEVICETYPE=ovsTYPE=OVSBridgeBOOTPROTO=staticONBOOT=yesNOZEROCONF=yes{% for gw_ip in networks.external | ipaddr('-2') %}IPADDR{{ loop.index }}={{ gw_ip | ipaddr('address') }}NETMASK{{ loop.index }}=255.255.255.255{% endfor %}octavia_network_ifcfg_vlan: |DEVICE=br-vlanDEVICETYPE=ovsTYPE=OVSBridgeBOOTPROTO=noneONBOOT=yesNOZEROCONF=yesOVS_EXTRA="add-port br-vlan bond0" -
<vkcloud>_network/vars.yml— файл с настройками Neutron-сети:neutron_network_ifcfg_external: |DEVICE=br-exDEVICETYPE=ovsTYPE=OVSBridgeBOOTPROTO=staticONBOOT=yesNOZEROCONF=yes{% for gw_ip in networks.external | ipaddr('-2') %}IPADDR{{ loop.index }}={{ gw_ip | ipaddr('address') }}NETMASK{{ loop.index }}=255.255.255.255{% endfor %}neutron_network_ifcfg_vlan: |DEVICE=br-vlanDEVICETYPE=ovsTYPE=OVSBridgeBOOTPROTO=noneONBOOT=yesNOZEROCONF=yesOVS_EXTRA="add-port br-vlan bond0"
-
-
-
Задайте название окружения и запустите плейбуки:
$ cd ~/inventory/vkcloud/$ ansible-playbook --diff -i vkcloud.yml -e env=vkcloud -e bootstrap=yes ../ansible-openstack/playbooks/neutron-controller-deploy.yml | $ tee ~/neutron-controller-deploy$ ansible-playbook --diff -i vkcloud.yml -e env=vkcloud -e bootstrap=yes ../ansible-openstack/playbooks/neutron-network-deploy.yml | tee ~/neutron-network-deploy$ ansible-playbook --diff -i vkcloud.yml -e env=vkcloud -e bootstrap=yes ../ansible-openstack/playbooks/compute-deploy.yml | tee ~/compute-deploy$ ansible-playbook --diff -i vkcloud.yml -e env=vkcloud -e bootstrap=yes ../ansible-openstack/playbooks/neutron-dhcp-deploy.yml | tee ~/neutron-dhcp-deploy$ ansible-playbook --diff -i vkcloud.yml -e env=vkcloud -e bootstrap=yes ../ansible-openstack/playbooks/octavia-deploy.yml | tee ~/octavia-deploy -
Создайте внешнюю сеть, через которую будет осуществляться взаимодействие приватных пользовательских сетей с внешними сетями организации:
$ openstack network create --provider-network-type vlan --external --provider-physical-network vlan --provider-segment <VLAN_ID> --share <НАЗВАНИЕ_ВНЕШНЕЙ_СЕТИ> -
Создайте подсеть в только что созданной сети:
$ openstack subnet create --network <НАЗВАНИЕ_ВНЕШНЕЙ_СЕТИ> --subnet-range <ПОДСЕТЬ> --allocation-pool <ПУЛ_АДРЕСОВ> --dhcp --gateway <IP_АДРЕС_ШЛЮЗА> --dns-nameserver <АДРЕС_DNS_СЕРВЕРА> <НАЗВАНИЕ_ПОДСЕТИ>Здесь:
<ПОДСЕТЬ>— адрес подсети, которую вам выдали в этом VLAN. Например,172.25.120.0/24.<ПУЛ_АДРЕСОВ>— пул IP-адресов для ВМ (не забудьте оставить место для шлюза и двух DHCP-серверов). Например,start=172.25.120.4,end=172.25.120.245.
Чтобы обеспечить доступ ВМ в пользовательских внутренних сетях во внешнюю сеть, задайте внешнюю сеть как шлюз для маршрутизатора внутренней:
-
Войдите в Портал самообслуживания с использованием учетной записи Администратора Платформы.
-
Перейдите в раздел Виртуальные сети → Маршрутизаторы.
-
Нажмите кнопку Добавить маршрутизатор.
- Укажите название пользовательской сети.
- Включите флажок Подключение к внешней сети.
- Выберите подсеть в раскрывающемся списке Список подсетей.
-
Нажмите кнопку Создать.
-
Перейдите в раздел Виртуальные сети → Сети.
-
Нажмите кнопку Создать.
-
Укажите название сети при необходимости, в списке Маршрутизатор выберите ранее созданный маршрутизатор.
-
В области Список подсетей нажмите на значок ••• справа от названия подсети и выберите пункт Редактировать подсеть. Включите параметр Включить DHCP.
-
Отключите параметр Приватный DNS и укажите используемые DNS-серверы.
-
Нажмите кнопку Создать.
-
Нажмите кнопку Добавить сеть.
После подключения внутренней сети к внешней для ВМ во внутренней сети появится возможность назначения внешнего IP-адреса.
Чтобы пройти аналогичные шаги в OpenStack CLI выполните подготовительные операции для использования OpenStack CLI (подробнее — в разделе Вход для Администратора Платформы), затем — команды:
# openstack router create <НАЗВАНИЕ_РОУТЕРА># openstack network create <НАЗВАНИЕ_ВНУТРЕННЕЙ_СЕТИ># openstack subnet create <НАЗВАНИЕ_ВНУТРЕННЕЙ_ПОДСЕТИ> --network <НАЗВАНИЕ_ВНУТРЕННЕЙ_СЕТИ> --subnet-range 192.168.100.0/24 --dns-nameserver 10.14.0.12# openstack router set <НАЗВАНИЕ_РОУТЕРА> --external-gateway <НАЗВАНИЕ_ВНЕШНЕЙ_СЕТИ># openstack router add subnet <НАЗВАНИЕ_ВНУТРЕННЕЙ_СЕТИ> <НАЗВАНИЕ_ВНУТРЕННЕЙ_ПОДСЕТИ>
Создайте провайдерскую внешнюю сеть, доступную только в рамках одного проекта, одним из способов:
- Внесите изменения вручную в Inventory-файл
vars.ymlи запустите Ansible-плейбуки (подробнее — в разделе Inventory и Ansible). - Используйте команды OpenStack CLI (подробнее — в разделе OpenStack CLI).
-
Отключите использование внешней глобальной сети. В файле
<vkcloud>/group_vars/vkcloud/vars.ymlзадайте параметруcreate_external_networkзначениеfalse. -
В файле
<vkcloud>/group_vars/vkcloud/vars.ymlв переменнойpostdeploy_provider_networkзадайте параметры новых сетей.Пример фрагмента файла `vars.yml`# Описание провайдерских сетей для каждого проектаpostdeploy_provider_network:# Название проекта, в котором будет создана сеть- project_name: "ProjectX"# Имя новой сети в OpenStackname: "projectX_provider_net1"type: "vlan"# VLAN ID новой сетиsegmentation_id: 1001# Сеть будет создана с флагом --external (внешняя)external: true# Сеть будет создана с флагом --shared и не будет доступна для редактирования пользователю Портала самообслуживанияshared: true# Описание подсетиsubnet:name: "provider_subnet1"dns_nameservers: "x.x.x.x" # Адрес внешнего DNS-сервераgateway: "d.d.d.1" # Адрес default gatewaycidr: "d.d.d.0/24" # Блок адресов в формате CIDRallocation_pools:start: "d.d.d.100"end: "d.d.d.200"enable_dhcp: false -
Запустите плейбуки:
$ cd ~/inventory/vkcloud/$ ansible-playbook -i vkcloud.yml --diff -e env=vkcloud -t provider_net ../ansible-openstack/playbooks/post-deploy.yml$ ansible-playbook -i vkcloud.yml --diff -e env=vkcloud -e serial=20 ../ansible-openstack/playbooks/public_haproxy.yml$ ansible-playbook -i vkcloud.yml --diff -e env=vkcloud -e serial=20 ../ansible-openstack/playbooks/private_haproxy.yml
-
Выполните подготовительные операции (подробнее — в разделе Вход для Администратора Платформы).
-
Создайте внешнюю сеть (подробнее — в разделе Создание сети):
$ openstack network create \--project <ID_ПРОЕКТА> \--provider-network-type vlan \--external \--provider-physical-network vlan \--provider-segment <СЕГМЕНТ_СЕТИ> \--no-share \<НАЗВАНИЕ_ВНЕШНЕЙ_СЕТИ> -
Выведите список RBAC-правил созданной сети:
$ openstack network rbac list --long | grep <ID_ВНЕШНЕЙ_СЕТИ> -
Отредактируйте RBAC-правило внешней сети, чтобы выдать доступ нужному проекту:
$ openstack network rbac set --target-project <ID_ПРОЕКТА> <ID_RBAC-ПРАВИЛА> -
Создайте RBAC-правило для внешней сети с параметром
access_as_shared, чтобы сеть и её подсеть были доступны только указанному проекту:$ openstack network rbac create \--target-project <ID_ПРОЕКТА> \--type network \--action access_as_shared \<ID_ВНЕШНЕЙ_СЕТИ>
Чтобы через внешнюю сеть, созданную с помощью OpenStack CLI, работали PaaS-сервисы:
-
Пропишите внешнюю сеть в файл
<vkcloud>/group_vars/vkcloud/vars.yml. -
Запустите плейбуки:
$ ansible-playbook -i vkcloud.yml --diff -e env=vkcloud -e serial=20 ../ansible-openstack/playbooks/public_haproxy.yml$ ansible-playbook -i vkcloud.yml --diff -e env=vkcloud -e serial=20 ../ansible-openstack/playbooks/private_haproxy.yml
Чтобы отредактировать внешнюю сеть, выполните команду OpenStack CLI из раздела Изменение сети.
- В Портале администратора перейдите в раздел Сетевая подсистема → Порты.
- Установите флажки для портов, у которых в столбце Подключенное устройство указано значение compute.
- Нажмите кнопку удаления справа от кнопки Добавить.
Удалять внешние сети можно при помощи OpenStack CLI, выполнив команду из раздела Удаление сети.
Чтобы добавить подсеть адресов во внешнюю сеть, создайте новую подсеть в этой внешней сети (подробнее — в разделе Создание подсети).
$ openstack subnet create --network ext-net --subnet-range 203.0.114.0/24 --allocation-pool start=203.0.114.1,end=203.0.114.253 --gateway 203.0.114.254 ext-net-subnet2