[ English | русский | Deutsch | Indonesia | English (United Kingdom) ]

Управление сетями

Эксплуатационные соображения, такие как гибкость, могут привести к необходимости управления сетями. Например, добавление новых сетей провайдера в управляемое облако OpenStack-Ansible. В следующих разделах приведены наиболее распространенные административные задачи, изложенные для выполнения этих задач.

Более общую информацию об устранении неполадок в сети см. в главе «Устранение неполадок в сети» <https://wiki.openstack.org/wiki/OpsGuide/Network_Troubleshooting> в Руководстве по эксплуатации.

Более подробную информацию о работе в сети см. в `Руководстве по работе в сети<https://docs.openstack.org/neutron/latest/admin/>`_.

Добавьте мосты провайдера, используя новые сетевые интерфейсы

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

Конфигурация OpenStack-Ansible

Все сети провайдера необходимо добавить в конфигурацию OpenStack-Ansible.

Отредактируйте файл /etc/openstack_deploy/openstack_user_config.yml и добавьте новый блок под разделом provider_networks:

Параметр container_bridge определяет физический сетевой мост, используемый для соединения пары veth от физического хоста к контейнеру. Внутри контейнера параметр container_interface определяет имя, по которому будет доступна физическая сеть. Параметр container_interface не требуется, когда агенты Neutron развертываются на «голом» железе. Убедитесь, что оба параметра определены уникально в сетях их провайдеров и что сетевой интерфейс правильно настроен в вашей операционной системе. group_binds определяет, к чему должна быть подключена эта сеть, к контейнерам или физическим хостам, и в конечном итоге зависит от используемого сетевого стека. Например, Linuxbridge или OVS. Конфигурация range определяет ID физической сегментации Neutron, которые автоматически используются пользователями при создании сетей в основном через Horizon и API Neutron. То же самое справедливо и для конфигурации net_name, которая определяет адресуемое имя внутри конфигурации Neutron. Эта конфигурация также должна быть уникальной в сетях других провайдеров.

Для получения дополнительной информации см. Конфигурация развертывания в Руководстве по развертыванию OpenStack-Ansible.

Обновление узла с новой конфигурацией

Запустите соответствующие сценарии в зависимости от раздела group_binds.

Например, если вы обновляете сети, требующие изменения всех узлов с помощью агента Linux bridge, предполагая, что у вас есть инфраструктурные (control) узлы с именами infra01, infra02 и infra03, выполните:

# openstack-ansible containers-deploy.yml --limit localhost,infra01,infra01-host_containers
# openstack-ansible containers-deploy.yml --limit localhost,infra02,infra02-host_containers
# openstack-ansible containers-deploy.yml --limit localhost,infra03,infra03-host_containers

Затем обновите конфигурацию neutron.

# openstack-ansible os-neutron-install.yml --limit localhost,infra01,infra01-host_containers
# openstack-ansible os-neutron-install.yml --limit localhost,infra02,infra02-host_containers
# openstack-ansible os-neutron-install.yml --limit localhost,infra03,infra03-host_containers

Затем при необходимости обновите вычислительные узлы.

Удалить мосты провайдера из OpenStack

Подобно добавлению сети провайдера, процесс удаления использует ту же процедуру, но в обратном порядке. Порты Neutron необходимо будет удалить перед удалением конфигурации OpenStack-Ansible.

  1. Отменить назначение всех плавающих IP-адресов Neutron:

    Примечание

    Экспортируйте сеть Neutron, которая будет удалена, как один UUID.

    export NETWORK_UUID=<uuid>
    for p in $( neutron port-list -c id --device_owner compute:nova --network_id=${NETWORK_UUID}| awk '/([A-Fa-f0-9]+-){3}/ {print $2}' ); do
      floatid=$( neutron floatingip-list -c id --port_id=$p | awk '/([A-Fa-z0-9]+-){3}/ { print $2 }' )
      if [ -n "$floatid" ]; then
        echo "Disassociating floating IP $floatid from port $p"
        neutron floatingip-disassociate $floatid
      fi
    done
    
  2. Удалить все порты Neutron из инстансов:

    export NETWORK_UUID=<uuid>
    for p in $( neutron port-list -c id -c device_id --device_owner compute:nova --network_id=${NETWORK_UUID}| awk '/([A-Fa-f0-9]+-){3}/ {print $2}' ); do
      echo "Removing Neutron compute port $p"
      neutron port-delete $p
    done
    
  3. Удалить порты маршрутизатора Neutron и DHCP-агенты:

    export NETWORK_UUID=<uuid>
    for line in $( neutron port-list -c id -c device_id --device_owner network:router_interface --network_id=${NETWORK_UUID}| awk '/([A-Fa-f0-9]+-){3}/ {print $2 "+" $4}' ); do
      p=$( echo "$line"| cut -d'+' -f1 ); r=$( echo "$line"| cut -d'+' -f2 )
      echo "Removing Neutron router port $p from $r"
      neutron router-interface-delete $r port=$p
    done
    
    for agent in $( neutron agent-list -c id --agent_type='DHCP Agent' --network_id=${NETWORK_UUID}| awk '/([A-Fa-f0-9]+-){3}/ {print $2}' ); do
      echo "Remove network $NETWORK_UUID from Neutron DHCP Agent $agent"
      neutron dhcp-agent-network-remove "${agent}" $NETWORK_UUID
    done
    
  4. Удалить сеть Neutron:

    export NETWORK_UUID=<uuid>
    neutron net-delete $NETWORK_UUID
    
  5. Удалите сеть провайдера из конфигурации provider_networks конфигурации OpenStack-Ansible /etc/openstack_deploy/openstack_user_config.yml и повторно запустите следующие плейбуки:

    # openstack-ansible lxc-containers-create.yml --limit infra01:infra01-host_containers
    # openstack-ansible lxc-containers-create.yml --limit infra02:infra02-host_containers
    # openstack-ansible lxc-containers-create.yml --limit infra03:infra03-host_containers
    # openstack-ansible os-neutron-install.yml --tags neutron-config
    

Перезапустите контейнер сетевого агента

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

Это можно сделать с помощью нескольких команд:

  1. Пример перезагрузки все еще доступных контейнеров.

    В этом примере будет выполнена перезагрузка контейнера с именем neutron_agents_container_hostname_name изнутри:

    # ansible -m shell neutron_agents_container_hostname_name -a 'reboot'
    
  2. Пример перезагрузки одного контейнера за раз с интервалом в 60 секунд:

    # ansible -m shell neutron_agents_container -a 'sleep 60; reboot' --forks 1
    
  3. Если контейнер не отвечает, его можно перезапустить с физического сетевого хоста:

    # ansible -m shell network_hosts -a 'for c in $(lxc-ls -1 |grep neutron_agents_container); do lxc-stop -n $c && lxc-start -d -n $c; done' --forks 1