Описание DevStack
Назначение DevStack — предоставить набор инструментов, используемых для установки главных сервисов OS из исходников, необходимых для разработки и тестирования. DevStack так же показывает и описывает примеры конфигураций и запусков сервисов, а также использование клиента командной строки (CLI).
Словарик:
Инстанс (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
- -b stable/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
Автор: Староверов Антон