Описание DevStack
Назначение DevStack — предоставить набор инструментов, используемых для установки главных сервисов OpenStack из исходников, необходимых для разработки и тестирования. DevStack так же показывает и описывает примеры конфигураций и запусков сервисов, а также использование клиента командной строки (CLI).
wiki.openstack.org/wiki/DevStack
Словарик:
Инстанс (instance) — виртуальная машина, созданная при помощи инструментов DevStack.
Подготовка к установке
Для установки DevStack желательно сначала создать пользователя с правами root:
sudo useradd -G sudo -m -U -s /bin/bash -p stack stack
Теперь переключаемся под только-что созданного пользователя и выкачиваем DevStack из репозитория:
su stack cd ~ git clone https://github.com/openstack-dev/devstack.git
Если у Git ещё не установлен, поставим его командой
sudo apt-get install git -y
Немного о версиях DevStack. Всего на момент написания статьи для скачивания было доступно четыре стабильных релиза:
- -b stable/kilo
- -b stable/liberty
- -b stable/mitaka
- master
Наиболее свежие из которых master и mitaka. Однако если не указывать скачиваемый бранч, то выкачается последняя версия DevStack из репозитория (HEAD), которая может содержать ошибки.
Установка
После того, как выбранная версия будет выкачана на диск, в корневом каталоге пользователя stack появится директория devstack:
stack@host:$ls devstack
Перейдем в новую директорию и создадим в ней файл local.conf:
stack@host:$cd devstack touch local.conf
Этот файл будет содержать конфигурацию, позволяющую нам работать с DevStack. Все параметры конфигурации должны быть описаны в секции [[local|localrc]]:
nano local.conf [[local|localrc]]
Для того, чтобы не вводить пароли (и не забыть, что вводили) в процессе установки, зададим пароли для используемых сервисов:
############################################################ # Customize the following HOST_IP based on your installation ############################################################ ADMIN_PASSWORD=admin # Пароль от Horizon & Keystone MYSQL_PASSWORD=admin RABBIT_PASSWORD=admin SERVICE_PASSWORD=admin SERVICE_TOKEN=admin
а также IP адрес машины, на которой будет устанавливаться DevStack:
HOST_IP=10.0.2.15
Вообще в DevStack используются два типа сетей: PUBLIC и PRIVATE, в которых используются разные типы адресов (floating и fixed соответственно). Если коротко, то Floating-адреса используются для доступа к созданному инстансу из внешней сети. При этом сам инстанс ничего о нем не знает, и вся маршрутизация трафика осуществляется средствами DevStack. Fixed адреса используются для работы внутри виртуальной сети (подробнее здесь).
Итак, сначала добавим секцию, отвечающую за распределение floating-адресов:
#PUBLIC NETWORK CONFIGURATION Q_USE_PROVIDERNET_FOR_PUBLIC=False FLOATING_RANGE=10.0.2.0/24 Q_FLOATING_ALLOCATION_POOL="start=10.0.2.150,end=10.0.2.201" PUBLIC_NETWORK_NAME=external PUBLIC_NETWORK_GATEWAY=10.0.2.1 PUBLIC_PHYSICAL_NETWORK=public # Required for l3-agent to connect to external-network-bridge PUBLIC_BRIDGE=br-ext
И секцию для fixed-адресов:
#PRIVATE NETWORK CONFIGURATION NETWORK_GATEWAY=${NETWORK_GATEWAY:-15.0.0.1} FIXED_RANGE=${FIXED_RANGE:-15.0.0.0/24}
Сохраняем файл local.conf и запускаем DevStack:
./stack.sh
Если все сделано правильно, то в результате увидим такую картину:
This is your host IP address: 10.0.2.15 This is your host IPv6 address: ::1 Horizon is now available at http://10.0.2.15/dashboard Keystone is serving at http://10.0.2.15/identity/ The default users are: admin and demo The password: admin
Настройка DevStack
DevStack предоставляет ряд инструментов, которые позволяют просматривать и конфигурировать систему в самых широких диапазонах. Уже сейчас можно зайти на WEB-сервер HORIZON, и, используя графический интерфейс, запустить инстанс в нужной конфигурации. При этом для запуска будет доступна всего одна операционная система CirrOS в минимальном наполнении.
Если вы хотите запустить что-то более существенное, потребуется более тонкая настройка, которая и описана ниже. Чтобы работать с DevStack, надо ввести команду:
. openrc admin admin
Настройка сети
Для того, чтобы посмотреть доступные конфигурации сетей, надо сделать следующее:
stack@host:~/devstack$ nova secgroup-list +----+---------+-------------+ | Id | Name | Description | +----+---------+-------------+ | 1 | default | default | +----+---------+-------------+
Nova — это менеджер виртуальных машин, который так же отвечает за работоспособность виртуальной сети. Вообще в DevStack можно получить одну и ту же (а точнее, разного уровня детализации) информацию от различных служб, что будет показано ниже.
В данном случае мы получили список доступных групп, состоящий всего из одного элемента. В дальнейшем мы будем работать именно с этим элементом, т.к. некоторые инструменты, например, Rally, работают только с профилями по умолчанию.
Каждая сетевая группа состоит из правил, которые определяют поведение этой группы. Чтобы посмотреть, какие правила установлены в группе default, надо ввести команду secgroup-list-rules:
stack@host:~/devstack$ nova secgroup-list-rules default +-------------+-----------+---------+----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+----------+--------------+ +-------------+-----------+---------+----------+--------------+
Как видим, в настоящий момент список правил пуст. В таком виде наши инстансы не смогут общаться с внешним миром. Для того, чтобы исправить ситуацию, надо добавить несколько правил, а именно:
- Правило для доступа по SSH
- Правило для протокола ICMP (обеспечивает работу команды ping)
- Правило для доступа интернет-трафика по протоколу http
- Правило для доступа интернет-трафика по протоколу https
Правила добавляются по шаблону: secgroup-add-rule <group_name> <procol_name> <port_from> <port_to> .
stack@host:~/devstack$ nova secgroup-add-rule default tcp 22 22 0.0.0.0/0 +-------------+-----------+---------+-----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-----------+--------------+ | tcp | 22 | 22 | 0.0.0.0/0 | | +-------------+-----------+---------+-----------+--------------+ stack@host:~/devstack$ nova secgroup-add-rule default icmp -1 255 0.0.0.0/0 +-------------+-----------+---------+-----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-----------+--------------+ | icmp | -1 | 255 | 0.0.0.0/0 | | +-------------+-----------+---------+-----------+--------------+ stack@host:~/devstack$ nova secgroup-add-rule default tcp 80 80 0.0.0.0/0 +-------------+-----------+---------+-----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-----------+--------------+ | tcp | 80 | 80 | 0.0.0.0/0 | | +-------------+-----------+---------+-----------+--------------+ stack@host:~/devstack$ nova secgroup-add-rule default tcp 443 443 0.0.0.0/0 +-------------+-----------+---------+-----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-----------+--------------+ | tcp | 443 | 443 | 0.0.0.0/0 | | +-------------+-----------+---------+-----------+--------------+
Проверим, что получилось:
nova secgroup-list-rules default +-------------+-----------+---------+-----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-----------+--------------+ | tcp | 22 | 22 | 0.0.0.0/0 | | | icmp | -1 | 255 | 0.0.0.0/0 | | | tcp | 80 | 80 | 0.0.0.0/0 | | | tcp | 443 | 443 | 0.0.0.0/0 | | +-------------+-----------+---------+-----------+--------------+
Создание ключа SSH
Для работы с операционными системами, отличными от CirrOS, нам понадобится ключ шифрования SSH. Специально для этих целей DevStack предоставляет всю необходимую функциональность. Если ввести команду keypair-list, то мы увидим таблицу всех доступных нам ключей:
stack@host:~/devstack$ nova keypair-list +-------+------+-------------------------------------------------+ | Name | Type | Fingerprint | +-------+------+-------------------------------------------------+ +-------+------+-------------------------------------------------+
Сгенерировать так нужный нам ключ можно с помощью команды ssh-keygen:
$ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/stack/.ssh/id_rsa): cloud.key
После создания ключа у нас в текущей директории появятся два файла: cloud.key и cloud.key.pub. Для файла cloud.key надо сразу выставить корректные права:
$sudo chmod 600 cloud.key
Теперь надо добавить созданный ключ в список доступных:
stack@host:~/devstack$ nova keypair-add --pub-key cloud.key.pub cloud stack@host:~/devstack$ nova keypair-list +-------+------+-------------------------------------------------+ | Name | Type | Fingerprint | +-------+------+-------------------------------------------------+ | cloud | ssh | 6f:a7:c2:11:f0:e9:9c:77:43:fc:61:37:b4:e5:f9:b2 | +-------+------+-------------------------------------------------+
Добавление образа ОС через glance
Теперь самое время посмотреть, какие операционные системы нам доступны в установке по умолчанию. Сделать это можно с помощью команды image-list:
$nova image-list +--------------------------------------+---------------------------------+--------+--------+ | ID | Name | Status | Server | +--------------------------------------+---------------------------------+--------+--------+ | cc5fedc0-8331-4cfe-b2f0-27f264a81dde | cirros-0.3.4-x86_64-uec | ACTIVE | | | bc0d3c78-d48b-4b41-872d-5106e3392a3c | cirros-0.3.4-x86_64-uec-kernel | ACTIVE | | | 26bfbc17-1ea9-4a50-9075-5064a2b3d0ad | cirros-0.3.4-x86_64-uec-ramdisk | ACTIVE | | +--------------------------------------+---------------------------------+--------+--------+
Как и было сказано выше, по умолчанию нам доступна только одна операционная система. За управление доступными образами отвечает отдельный инструмент glance:
$glance image-list +--------------------------------------+---------------------------------+ | ID | Name | +--------------------------------------+---------------------------------+ | cc5fedc0-8331-4cfe-b2f0-27f264a81dde | cirros-0.3.4-x86_64-uec | | bc0d3c78-d48b-4b41-872d-5106e3392a3c | cirros-0.3.4-x86_64-uec-kernel | | 26bfbc17-1ea9-4a50-9075-5064a2b3d0ad | cirros-0.3.4-x86_64-uec-ramdisk | +--------------------------------------+---------------------------------+
Как видно, выводы команды image-list практически идентичны как у glance, так и у nova, за тем исключением, что nova предоставляет дополнительную информацию.
В качестве рабочей ОС будем использовать Ubuntu 15.10, которую можно взять с cloud-images.ubuntu.com/vivid/current. Полный список поддерживаемых ОС можно посмотреть здесь: docs.openstack.org/image-guide/obtain-images.html. Там же говорится, что в некоторых (конкретно в нашем) случае нам понадобится ключ SSH для того, чтобы залогиниться на созданный инстанс.
Сначала надо выкачать образ диска из сети:
stack@host:~/devstack$ wget https://cloud-images.ubuntu.com/vivid/current/vivid-server-cloudimg-amd64-disk1.img
После чего можно залить новый образ на сервер glance:
stack@host:~/devstack$ glance image-create --name ubuntu_vivid --visibility public --container-format ami --file vivid-server-cloudimg-amd64-disk1.img --disk-format ami
Где name — имя образа в БД, которое будет выводиться по командам nova image-list или glance image-list.
Запуск инстанса
Теперь все готово к запуску нашего первого инстанса. Для этого воспользуемся командой openstack server create:
stack@host:~/devstack$ openstack server create srv1 --flavor=m1.small --image=ubuntu --key-name=cloud +--------------------------------------+-----------------------------------------------+ | Field | Value | +--------------------------------------+-----------------------------------------------+ | OS-DCF:diskConfig | MANUAL | | OS-EXT-AZ:availability_zone | | | OS-EXT-SRV-ATTR:host | None | | OS-EXT-SRV-ATTR:hypervisor_hostname | None | | OS-EXT-SRV-ATTR:instance_name | instance-00000001 | | OS-EXT-STS:power_state | NOSTATE | | OS-EXT-STS:task_state | scheduling | | OS-EXT-STS:vm_state | building | | OS-SRV-USG:launched_at | None | | OS-SRV-USG:terminated_at | None | | accessIPv4 | | | accessIPv6 | | | addresses | | | adminPass | SJZYQRUgoo3k | | config_drive | | | created | 2016-06-06T06:50:41Z | | flavor | m1.small (2) | | hostId | | | id | 706e906a-eb62-4927-afdf-e9a30b29c17f | | image | ubuntu (beb392b7-de7f-4fef-9afa-2cc5c2a38a13) | | key_name | cloud | | name | srv1 | | os-extended-volumes:volumes_attached | [] | | progress | 0 | | project_id | 7784247e5055485bb43c9f3311332d9a | | properties | | | security_groups | [{u'name': u'default'}] | | status | BUILD | | updated | 2016-06-06T06:50:41Z | | user_id | e54b731c7e1f40f4a5ad16d64be383bd | +--------------------------------------+-----------------------------------------------+
Где srv1 — имя нового инстанса, m1.small — H/W конфигурация инстанса, ubuntu — имя образа, и cloud — имя пары ключей SSH во внутренней таблице DevStack.
Т.к. мы пытаемся запустить полноценную ОС, то нам надо выделить под неё соответствующие ресурсы, поэтому конфигурация m1.small является минимальной. Для инстанса с CirrOS достаточно конфигурации m1.tiny. Разницу в конфигурациях можно посмотреть командой flavor-list:
stack@host:~/devstack$ nova flavor-list +----+-----------+-----------+------+-----------+------+-------+-------------+-----------+ | ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public | +----+-----------+-----------+------+-----------+------+-------+-------------+-----------+ | 1 | m1.tiny | 512 | 1 | 0 | | 1 | 1.0 | True | | 2 | m1.small | 2048 | 20 | 0 | | 1 | 1.0 | True | | 3 | m1.medium | 4096 | 40 | 0 | | 2 | 1.0 | True | | 4 | m1.large | 8192 | 80 | 0 | | 4 | 1.0 | True | +----+-----------+-----------+------+-----------+------+-------+-------------+-----------+
Если вы устанавливали DevStack из HEAD, то возможно будут доступны дополнительные конфигурации. Наш инстанс будет готов к работе, когда его статус изменится из состояния BUILD в ACTIVE:
stack@host:~/devstack$ nova list +--------------------------------------+------+--------+------------+-------------+------------------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------+------+--------+------------+-------------+------------------+ | 706e906a-eb62-4927-afdf-e9a30b29c17f | srv1 | ACTIVE | - | Running | private=15.0.0.2 | +--------------------------------------+------+--------+------------+-------------+------------------+
Как видно, сейчас у нашего инстанса есть только IP-адрес из диапазона fixed-адресов. Однако, если все сделано правильно, мы можем выполнить команду ping:
stack@host:~/devstack$ ping 15.0.0.2 PING 15.0.0.2 (15.0.0.2) 56(84) bytes of data. 64 bytes from 15.0.0.2: icmp_seq=1 ttl=64 time=5.31 ms 64 bytes from 15.0.0.2: icmp_seq=2 ttl=64 time=0.470 ms 64 bytes from 15.0.0.2: icmp_seq=3 ttl=64 time=0.409 ms
И попробовать залогиниться по SSH, используя в качестве имени пользователя ubuntu (почему — написано здесь):
stack@host:~/devstack$ ssh ubuntu@15.0.0.2 The authenticity of host '15.0.0.2 (15.0.0.2)' can't be established. ED25519 key fingerprint is 0e:56:2d:b0:d7:5f:27:bc:cd:39:ff:85:e6:84:a4:ef. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '15.0.0.2' (ED25519) to the list of known hosts. Permission denied (publickey).
Подтвердив создание ключа, получаем отказ в доступе. То же самое будет, если не указывать параметр --key-name при создании инстанса. Для того, чтобы все-таки попасть на наш инстанс, используем ключ, созданный ранее:
stack@host:~/devstack$ ssh -i cloud.key ubuntu@15.0.0.2 Welcome to Ubuntu 15.04 (GNU/Linux 4.2.0-36-generic x86_64) … ubuntu@srv1:~$ pwd /home/ubuntu
Добавление Floating-IP
Посмотреть все доступные в настоящий момент floating-адреса можно так:
stack@host:~/devstack$ nova floating-ip-list +----+----+-----------+----------+------+ | Id | IP | Server Id | Fixed IP | Pool | +----+----+-----------+----------+------+ +----+----+-----------+----------+------+
Как и стоило ожидать, он пуст. Создадим парочку адресов:
stack@astarove-VirtualBox:~/devstack$ nova floating-ip-create +----+----------+-----------+----------+----------+ | Id | IP | Server Id | Fixed IP | Pool | +----+----------+-----------+----------+----------+ | 1 | 10.0.2.1 | - | - | external | +----+----------+-----------+----------+----------+ stack@host:~/devstack$ nova floating-ip-create +----+----------+-----------+----------+----------+ | Id | IP | Server Id | Fixed IP | Pool | +----+----------+-----------+----------+----------+ | 2 | 10.0.2.2 | - | - | external | +----+----------+-----------+----------+----------+ stack@host:~/devstack$ nova floating-ip-list +----+----------+-----------+----------+----------+ | Id | IP | Server Id | Fixed IP | Pool | +----+----------+-----------+----------+----------+ | 1 | 10.0.2.1 | - | - | external | | 2 | 10.0.2.2 | - | - | external | +----+----------+-----------+----------+----------+
И добавим один из этих адресов к нашему серверу:
stack@host:~/devstack$ nova add-floating-ip srv1 10.0.2.1 stack@host:~/devstack$ nova list +--------------------------------------+------+--------+------------+-------------+----------------------------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------+------+--------+------------+-------------+----------------------------+ | 706e906a-eb62-4927-afdf-e9a30b29c17f | srv1 | ACTIVE | - | Running | private=15.0.0.2, 10.0.2.1 | +--------------------------------------+------+--------+------------+-------------+----------------------------+
Как видим, у инстанса srv1 появился дополнительный адрес, по которому так же можно выполнить команды ping и ssh (для нового IP потребуется создать новый ключ):
stack@host:~/devstack$ ping 10.0.2.1 PING 10.0.2.1 (10.0.2.1) 56(84) bytes of data. 64 bytes from 10.0.2.1: icmp_seq=1 ttl=64 time=1.86 ms 64 bytes from 10.0.2.1: icmp_seq=2 ttl=64 time=0.410 ms ^C --- 10.0.2.1 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 0.410/1.136/1.863/0.727 ms stack@host:~/devstack$ ssh -i cloud.key ubuntu@10.0.2.1 The authenticity of host '10.0.2.1 (10.0.2.1)' can't be established. ED25519 key fingerprint is 0e:56:2d:b0:d7:5f:27:bc:cd:39:ff:85:e6:84:a4:ef. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.0.2.1' (ED25519) to the list of known hosts. … ubuntu@srv1:~$
Чтобы удалить floating-ip у инстанса, надо выполнить команду remove-floating-ip (при этом сам IP остается в списке доступных floating-адресов):
stack@host:~/devstack$ nova remove-floating-ip srv1 10.0.2.1 stack@host:~/devstack$ nova list +--------------------------------------+------+--------+------------+-------------+------------------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------+------+--------+------------+-------------+------------------+ | 706e906a-eb62-4927-afdf-e9a30b29c17f | srv1 | ACTIVE | - | Running | private=15.0.0.2 | +--------------------------------------+------+--------+------------+-------------+------------------+
Заключение
В статье подробно рассмотрен процесс установки, настройки и запуска виртуальных машин (инстансов) с использованием пакета виртуализации DevStack. Были рассмотрены основные команды, используемые при работе с DevStack из CLI. Стоит сказать, что практически все шаги, описанные в статье, можно выполнить через графический интерфейс, называемый neutron. Спасибо за комментарии и удачи!
На заметку
Повторный запуск DevStack после перезагрузки системы. Сначала удалим все, что относилось к предыдущей сессии:
stack@host:~/devstack$ ./unstack.sh stack@host:~/devstack$ ./clean.sh
включая то, что обычно не удаляется:
stack@host:~/devstack$ sudo rm -rf /opt/stack/*
После чего перезапускаем DevStack:
stack@host:~/devstack$ ./stack.sh
Возможные проблемы
Симптом
При попытке запустить команду из-под sudo появляется сообщение:
sudo: unable to resolve host
Возможное решение
Выполнить команду:
cat /etc/hostname
Результат скопировать в файл /etc/hosts в первую строку:
nano /etc/hosts
Удаление сохраненных ключей
Симптом
stack@host:~/devstack$ ssh -i cloud.key ubuntu@15.0.0.3 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ED25519 key sent by the remote host is c9:8e:70:27:1d:3b:c8:9c:b3:db:df:c2:a4:07:92:a1. Please contact your system administrator. Add correct host key in /home/stack/.ssh/known_hosts to get rid of this message. Offending ED25519 key in /home/stack/.ssh/known_hosts:2 remove with: ssh-keygen -f "/home/stack/.ssh/known_hosts" -R 15.0.0.3 ED25519 host key for 15.0.0.3 has changed and you have requested strict checking. Host key verification failed.
Возможное решение
Как вариант удалить файл /home/stack/.ssh/known_hosts:
stack@host:~/devstack$ sudo rm /home/stack/.ssh/known_hosts