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 


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

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

Комментариев нет: