Статьи

OpenStack Heat и DevStack в облаке HP

[Эта статья была первоначально написана Йорамом Вайнребом.]

Openstack явно делает волны и быстро становится стандартом де-факто в частных облаках.

В последних нескольких выпусках движок оркестровки Heat, который изначально был основан на Amazon CloudFormation, становится все более зрелым с более желаемой функциональностью.

Я хотел поделиться своим опытом настройки собственной игровой площадки Heat в качестве службы оркестровки развертывания Devstack, работающего в виртуальной машине HP Public Cloud.

Я начал с запуска * стандартной большой виртуальной машины под управлением Ubuntu 12.04 (на самом деле я сначала попробовал с 14.04 и увидел несколько проблем, которые привели меня к 12.04) в HP Cloud (очевидно, он может работать в любой облачной среде).

* Фиксированная подсеть по умолчанию для devstack — 10.0.0. Я рекомендую подключать упомянутую выше виртуальную машину к другому диапазону подсетей (хотя вы также можете настроить devstack для другой фиксированной подсети).

Когда виртуальная машина была готова, я вставил в нее SSH и установил git:

sudo apt-get update
sudo apt-get install git

Затем я клонировал git-репозиторий devstack в homedir моей виртуальной машины:

git clone https://github.com/openstack-dev/devstack.git

и перейдите в папку Devstack, которая была только что создана:

cd devstack/

Изучив файл stackrc, я обнаружил, что, хотя служба Neutron была установлена, службой по умолчанию была сеть Nova (n-net).

Чтобы иметь более современный и многофункциональный Neutron, я отключил сеть Nova n-net и включил службы Neutron (q-svc, q-agt, q-dhcp, q-l3, нейтрон) в local.conf. файл конфигурации (вам нужно будет создать его в папке Devstack). Я воспользовался этой возможностью, чтобы также установить пароли администратора в файле local.conf:

[[local|localrc]]
ADMIN_PASSWORD=password
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
SERVICE_TOKEN=a682f596-76f3-11e3-b3b2-e716f9080d50
 
disable_service n-net
enable_service q-svc
enable_service q-agt
enable_service q-dhcp
enable_service q-l3
enable_service q-meta
enable_service neutron

Следующим шагом будет процесс установки Devstack:

./stack.sh

Эти сценарии заботятся об установке, настройке и запуске развертывания Devstack. С файлом local.conf мы создали. На самом деле установка может выполняться без присмотра (это здорово, потому что она занимает более 10 минут, это отличная возможность для перерыва на кофе или переписки по электронной почте…)

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

screen –r stack

Для переключения между различными сервисными окнами наберите Ctrl-A «.

Ctrl-A Ctrl-D отсоединится от него, оставив Devstack работающим.

По умолчанию виртуальные машины, запущенные внутри DevStack и работающие на хосте виртуальных машин, не имеют доступа в Интернет.

To allow Internet, we will need to enable IP forwarding and NATing on the host machine:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

You can access Horizon, its web UI, by typing http://<Your VM public/floating IP>/

The admin user is admin and the password is what we set in the local.conf.

Under Project you will see the orchestration service.

Now that our playground is ready, lets start playing with Heat…

Defining an orchestration (stack) in Heat is done by defining a HOT template (Heat is also compatible with CloudFormation syntax, but I will not go into that).

Templates can be defined in YAML or JSON. I find YAML much easier to read so I will stick with it for my examples.

I started with a basic stack example from the Openstack git repo: https://github.com/openstack/heat-templates/blob/master/hot/F18/WordPress_Native.yaml

This stack template simply provisions a VM, installs the WordPress services (Apache, MySQL and the WordPress web app) and configures it.

There are input parameters such as the user/password and output parameters such as the application URL.

Click the project->Orchestration ->stacks and then Launch Stack.

You can use the actual git URL to create the stack.

The «Environment Source» can be used to initialize the parameters defined in the stack template.

If we leave it empty, Heat will ask us to fill in the parameters in the next dialog box.

After clicking Next, we name the stack and fill in any parameters that were not initialized, and then we can launch the stack.

There are four views to track the deployment status of the stack.:

  1. Topology view that shows the stack resources and their relationships in graph format.
  2. Overview that just gives the basic properties of the stack.
  3. Resources view that lists all of the resources that were deployed.
  4. Events log that shows us the progress of the stack’s deployment.
  5. This was neat, in a few clicks we launched a ready to use WordPress server.

However, in real life deployments, things can get a bit more complicated, so let’s add some typical deployment customizations into the mix:

  1. Let’s separate the MySQL and the Apache from each other.
  2. Let’s build separate networks for the application data and the application’s public access.

These customizations make things more interesting on the Heat side. We need to define additional networks resources such as networks, subnets router and ports.

In addition, we need to create dependencies between the network resources and the VMs.

For example, we need the network provisioned before we can launch the VMs.

We also need a dependency between the Apache VM and the MySQL VM. We then also need to inject the MySQL IP address to the WordPress configuration on the Apache VM.

The dependency graph goes as follows:

First we define the networks and the router. Then we define the subnets, tying them to the networks by the «network_id: { get_resource: network_id/name}.

At the same time we can define the router_gateway tying it to the router «router_id: { get_resource: router }» and the pre-existing public network.

After the networks and the router are defined, we can define the router interface that does the same get_resource to reference both elements.

In parallel, the port, which depends on the network and the subnet, is defined too.

 app_network:
      type: OS::Neutron::Net
      properties:
        admin_state_up: true
        name: app_network
        shared: true
        tenant_id: admin
  app_subnet:
      type: OS::Neutron::Subnet
      properties:
        network_id: { get_resource: app_network }
        cidr: { get_param: app_net_cidr } 
        gateway_ip: { get_param: app_net_gateway }
        dns_nameservers: [8.8.8.8, 8.8.4.4]   #public DNS nameservers are important so that the vms will be able to resolve host to IP addresses
        allocation_pools:
          - start: { get_param: app_net_pool_start }
            end: { get_param: app_net_pool_end }

Lastly, the two servers and the floating IP are defined. The floating IP is dependent on the definition of the server port.

wordpress_apache_app_port:
      type: OS::Neutron::Port
      properties:
        network_id: { get_resource: app_network }
        fixed_ips:
          - subnet_id: { get_resource: app_subnet }
  apache_floatingip:
      type: OS::Neutron::FloatingIP
      properties:
        floating_network_id: { get_param: public_net_id }
        port_id: { get_resource: wordpress_apache_app_port }

The MySQL server VM is dependent on its server data port and a random app network port for outbound Internet access.

The Apache server VM is dependent on its server app port as well as the floating IP, and a random data network port for accessing the MySQL on a separate network.

The template is available at http://s3.amazonaws.com/yoramw/wordpress.yaml

Here is the topology graph that was created when we launched our more sophisticated stack:

Снимок экрана 2014-05-05 15.22.42.png

The network diagram view:

Screenshot 2014-05-05 15.21.53.png

Feel free to let me know in the comments how this tutorial worked out for you.