11 мая 2015

Настройка работы Docker и OpenStack


Первое с чего мы начнем — это установка Docker и необходимых пакетов. Обращаю внимание, что этот вариант установки подходит только для тестовых сред. Для «боевой установки» следует собрать rpm-пакет с драйвером Docker и не устанавливать на вычислительные узлы средства, применяемые при разработке. Действия выполняем на вычислительном узле:
[root@os2 ~]# yum -y install net-tools docker-io
python-pip git

Также обратите внимание на то, что мы устанавливаем пакет net-tools, который в современных дистрибутивах при установке по умолчанию заменен на iproute,а утилиты из его состава имеют статус устаревших. Нам он понадобится ради команды ifconfig, которая используется драйвером Docker.
Теперь забираем с Github исходный код драйвера и устанавливаем:

[root@os2 ~]# git clone
https://github.com/stackforge/nova-docker.git 
[root@os2 ~]# cd nova-docker 
[root@os2 nova-docker]# git checkout -b pre-i18n
9045ca43b645e72751099491bf5f4f9e4bddbb91
[root@os2 nova-docker]# python setup.py install 
[root@os2 nova-docker]# pip install pbr 

Команду git checkout мы выполняем до обновления исходного кода, который «ломает» совместимость с релизом OpenStack Juno. Следующим шагом запускаем и включаем сервис Docker и выполняем не очень «чистый» обходной прием с правами, для того чтоб в CentOS драйвер получил доступ к Docker:


[root@os2 ~]# systemctl start docker 
[root@os2 ~]# systemctl enable docker 
[root@os2 ~]# chmod 660  /var/run/docker.sock 


Нам необходимо в соответствии с инструкцией на Github настроить драйвер. Создаем файл с инструкциями по настройки сети для Docker:


[root@os2 ~]# mkdir /etc/nova/rootwrap.d 
[root@os2 ~]# vi
/etc/nova/rootwrap.d/docker.filters 

и в файл docker.filters копируем следующие содержимое:
#nova-rootwrap command filters for setting up
network in the docker driver 
# This file should be owned by (and
only-writeable by) the root user 
[Filters] 
# nova/virt/docker/driver.py: 'ln', '-sf',
'/var/run/netns/.*' 
ln: CommandFilter, /bin/ln, root 


Наконец на узле Glance добавляем к форматам контейнеров docker:


[root@os1 ~]# crudini --set
/etc/glance/glance-api.conf DEFAULT container_formats
ami,ari,aki,bare,ovf,ova,docker 
[root@os1 ~]#  systemctl restart
openstack-glance-api


А на вычислительном узле os2 в качестве драйвера указываем драйвер Docker. Других изменений производить не надо:

[root@os2 ]# crudini --set /etc/nova/nova.conf
DEFAULT compute_driver novadocker.virt.docker.DockerDriver 
[root@os2 ]# systemctl restart
openstack-nova-compute


Теперь тестируем нашу конфигурацию. Для начала ограничимся работоспособностью контейнеров Docker. Попробуем запустить контейнер с дистрибутивом Fedora:
 
[root@os2 ~]# docker run -i -t fedora /bin/bash 
Unable to find image 'fedora:latest' locally 
Trying to pull repository docker.io/fedora ... 
... 
Status: Downloaded newer image for
docker.io/fedora:latest 
bash-4.3# cat /etc/redhat-release 
Fedora release 21 (Twenty One) 

Как мы видим, из репозитория docker.io был скачен последний образ Fedora и запущен. Если посмотреть на список контейнеров, мы также это уведем:
[root@os2 ~]# docker ps 
CONTAINER ID  IMAGE         COMMAND      CREATED
      STATUS       PORTS NAMES 
cb7b37a3a1b2  fedora:latest "/bin/bash"
 9 minutes ago Up 9 minutes      heisenberg


Теперь скачаем образ с минимальным http-сервером thttpd, который будем использовать для проверки работы:
 
[root@os2 ~]# docker pull larsks/thttpd 
Trying to pull repository
docker.io/larsks/thttpd ... 
...
Status: Downloaded newer image for
docker.io/larsks/thttpd:latest 


После этого загрузим его в Glance:
 
[root@os2 ~]# source keystonerc_admin 
[root@os2 ~]# docker save larsks/thttpd | glance
image-create --is-public True --container-format docker --disk-format
raw --name larsks/thttpd 
+------------------+--------------------------------------+
| Property         | Value                      
         | 
+------------------+--------------------------------------+
| checksum         |
c98dcd00b284eaf35ba8d10e1bff941c     | 
| container_format | docker                     
         | 
| created_at       | 2015-05-09T19:42:23        
         | 
| deleted          | False                      
         | 
| deleted_at       | None                       
         | 
| disk_format      | raw                        
         | 
| id               |
7133ae58-03aa-4d80-af98-adf5e1c02a5e | 
| is_public        | True                       
         |  
| name             | larsks/thttpd              
         | 
| owner            |
a5c42139ce154b4d945b4ed806cbee81     | 
| protected        | False                      
         | 
| size             | 1083392                    
         | 
| status           | active                     
         | 
| updated_at       | 2015-05-09T19:42:25        
         | 
| virtual_size     | None                       
         | 
+------------------+--------------------------------------+


Проверяем список образов:


[root@os2 ~]# glance image-list 
+------+---------------------+-------------+------------------+----------+--------+
| ID   | Name                | Disk Format |
Container Format | Size     | Status | 
+------+---------------------+-------------+------------------+----------+--------+
| bc.. | cirros-0.3.3-x86_64 | qcow2       |
bare             | 13200896 | active | 
| 71.. | larsks/thttpd       | raw         |
docker           | 1083392  | active | 
+------+---------------------+-------------+------------------+----------+--------+


И в графическом интерфейсе Horizon:



Наконец, можно попробовать создать экземпляр контейнера:


$ source keystonerc_demo 
$ nova boot --image larsks/thttpd --flavor
m1.small test1 
+--------------------------------------+-------------------------------------+
| Property                             | Value  
                            | 
+--------------------------------------+-------------------------------------+
| OS-DCF:diskConfig                    | MANUAL 
                            | 
| OS-EXT-AZ:availability_zone          | nova   
                            | 
| OS-EXT-STS:power_state               | 0      
                            | 
| OS-EXT-STS:task_state                |
scheduling                          | 
| OS-EXT-STS:vm_state                  |
building                            |  
| adminPass                            |
Y6htpjH5xe2X                        |  
| created                              |
2015-05-09T20:05:08Z                | 
| flavor                               |
m1.small (2)                        | 
| id                                   |
65de57d0-f033-4818-a522-2c3291dc..  | 
| image                                |
larsks/thttpd (7133ae58-03aa-4d8..) |  
| metadata                             | {}     
                            | 
| name                                 | test1  
                            | 
| os-extended-volumes:volumes_attached | []     
                            | 
| security_groups                      | default
                            |
| status                               | BUILD  
                            | 
| tenant_id                            |
9c1c71f2c0f243b7a3b1d0d1880820e9    | 
| updated                              |
2015-05-09T20:05:08Z                | 
| user_id                              |
f3aabe457c2c4fe5912a0f90e569e04d    | 
+--------------------------------------+-------------------------------------+
 


Проверяем, что контейнер запущен:


[root@os2 ~]# docker ps 
CONTAINER ID        IMAGE                 
COMMAND                CREATED             STATUS              PORTS 
             NAMES 
4680097f2cc0        larsks/thttpd:latest  
"/thttpd -D -l /dev/   13 minutes ago      Up 13 minutes        
                  nova-65de57d0-f033-4818-a522-2c3291dc516b   
В графическом интерфейсе это выглядит следующим образом:



Для доступа к http-серверу присвоим экземпляру внешний floating IP:
[root@os1 ~]# nova floating-ip-associate test1
10.100.1.101 


Проверяем:


[root@os1 ~]# nova list 
+------+-------+--------+------------+-------------+-----------------------+
| ID   | Name  | Status | Task State | Power
State | Networks              | 
+------+-------+--------+------------+-------------+-----------------------+
| 65.. | test1 | ACTIVE | -          | Running  
  | demo-net=172.16.0.14, | 
|      |       |        |            |          
  |          10.100.1.101 | 
+------+-------+--------+------------+-------------+-----------------------+


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


$ curl http://10.100.1.101 


  ____                            _         _   
   _   _ 
 / ___|___  _ __   __ _ _ __ __ _| |_ _   _| |
__ _| |_(_) ___  _ __  ___
| |   / _ \| '_ \ / _` | '__/ _` | __| | | | |/
_` | __| |/ _ \| '_ \/ __|
| |__| (_) | | | | (_| | | | (_| | |_| |_| | |
(_| | |_| | (_) | | | \__ \
\____\___/|_| |_|\__, |_| 
\__,_|\__|\__,_|_|\__,_|\__|_|\___/|_| |_|___/
                  |___/ 

Все работает, можно наградить себя
чашечкой кофе. 

10 мая 2015

Пара новых статей про OpenStack и СПО

В журнале "Системный администратор" 5/2015 опубликована вторая статья из моего цикла про OpenStack. Полная версия в печатной версии журнала. http://samag.ru/archive/article/2936

Также вышла небольшая заметка в журнале "Бизнес и Информационные технологии" (БИТ). Тема номера - свободное программное обеспечение http://bit.samag.ru/archive/more/151

01 апреля 2015

Заметки по поиску неисправностей в сервисах Swift


Сервисы Swift пишут сообщения об ошибках в системный журнал /var/log/messages. Как правило там могут быть trace-сообщения Python. 


Проверьте что все сервисы запущенны при помощи команды lsof -i и что они работают на правильных портах. Если вы не нашли в списке одну из служб, вы можете попытаться запустить ее вручную, указав исполнимому файлу ваш конфигурационный файл. Например: 

[root@sw3 ~]# swift-object-server
/etc/swift/object-server.conf 
Traceback (most recent call last): 
  File "/usr/bin/swift-object-server",
line 27, in  
 ...
LookupError: No loader given in section
'filter:recon' 


Сервис не запускается и из вывода видно, что в данном случае имеется ошибка конфигурационного файла в секции recon.
В случае возникновения ошибок типа 503 Service Unavailable в первую очередь проверьте конфигурационные ошибки на опечатки, затем корректность имени и пароля в Keystone, а также корректность заведения URI точик входа в API сервиса.
В принципе, недоступность любого сервиса (Keystone, RabbitMQ или бэкенда Ceph или GlusterFS) может вызвать ошибку 503 Service Unavailable. Проверьте соответствующие сервисы.
Ошибки в создании кольца нельзя исправить выполнением еще одной команды swift-ring-builder add. Предварительно необходимо отдать команду swift-ring-builder remove.

21 марта 2015

OpenStackClient — новый официальный проект OpenStack


Недавно список официальных проектов OpenStack пополнился еще одним проектом — OpenStackClient

Утилита командной строки openstack представляет собой единый унифицированный клиент для доступа к OpenStack API. В целом, OpenStackClient позволяет делать тоже самое, что и утилиты каждого сервиса (nova, neutron, keystone-manage и др.),  но при помощи единой команды и унифицированного формата.

Добавление утилиты в RDO сводится к установке пакета:

[root@os1 ~]# yum -y install  python-openstackclient

Для аутентификации клиент использует ту же схему, что и другие утилиты, за исключением замены устаревших  «тенантов» (OS_TENANT_NAME) на «проекты». Пример моего keystonerc тестовой среды:

unset OS_USERNAME OS_TENANT_NAME OS_PASSWORD OS_AUTH_URL SERVICE_TOKEN SERVICE_ENDPOINT
export OS_AUTH_URL=http://os1.test.local:35357/v2.0/
export OS_USERNAME=admin
export OS_PROJECT_NAME=admin
export OS_PASSWORD=openstack


И можно пользоваться:

[root@os1 ~]# openstack project create demo2
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | None                             |
| enabled     | True                             |
| id          | 4f33784c2a7a487fa8e7b5b8a2c0af87 |
| name        | demo2                            |
+-------------+----------------------------------+
[root@os1 ~]# openstack project list
+----------------------------------+---------+
| ID                               | Name    |
+----------------------------------+---------+
| 4b0971bf0f5e4835a87af1d21121def5 | service |
| 4f33784c2a7a487fa8e7b5b8a2c0af87 | demo2   |
| 9c1c71f2c0f243b7a3b1d0d1880820e9 | demo    |
| a5c42139ce154b4d945b4ed806cbee81 | admin   |
+----------------------------------+---------+


Команда  openstack help -h выведет подсказку по командам или можно ввести help в интерактивном режиме. Команды строятся по принципу: взять объект1 и произвести над ним действие при помощи объекта2

Ну и наглядный пример, который приводит один из разработчиков:

Замена

$ nova boot --flavor='2G' -- image='Gentoo' # Nova talks to Glance
$ cinder give-me-a-10G-volume
$ nova attach-that-volume-to-my-computer # nova talks to cinder
$ neutron give-me-an-ip
$ nova attach-that-floating-ip-to-my-computer # nova talks to neutron
$ designate call-that-ip 'example.com' --reverse-dns # designate to neutron

всего на одну строку

$ openstack boot gentoo on-a 2G-VM with-a publicIP with-a 10G-volume call-it example.com

Пакет python-openstackclient-doc устанавливает в /usr/share/doc/ документацию на клиент с сайта:


17 марта 2015

Курсы и экзамены по облачным технологиям в ближайшие месяцы

В ближайшие месяцы читаю в Инвенте курсы:

Ну и до кучи экзамены:

20 апреля - EX401
21 апреля - EX436
22 мая - EX318
27 мая - EX236
28 мая - EX442
29 мая - EX210
5 июня - EX436
11 июня - EX280
17 июня - EX413

Желающие могут за апрель-май сдать RHCA :) Можно выбрать пять желаемых из восьми. Записывайтесь на сайте Инвенты.