В universe-репозиторий Ubuntu 11.10 будут входить пакеты с реализацией
поддержки серверной и клиентской части PaaS-платформы (Platform as a Service) [[http://www.opennet.dev/opennews/art.shtml?num=30241
CloudFoundry]], развиваемой компанией VMware и доступной в исходных текстах под
лицензией Apache.
Платформа позволяет сформировать инфраструктуру для выполнения в облачных
окружениях конечных приложений на Java (Spring), Grails, Ruby (Rails, Sinatra),
JavaScript (Node.js), Scala и других языках, работающих поверх JVM. Из СУБД
поддерживаются СУБД MySQL, Redis и MongoDB. PaaS-платформа, в отличие от IaaS,
работает на более высоком уровне, чем выполнение готовых образов операционных
систем, избавляя потребителя от необходимости обслуживания ОС и системных
компонентов, таких как СУБД, языки программирования, программные фреймворки и
т.п. В PaaS от пользователя требуется только загрузка приложения, которое будет
запущено в готовом окружении, предоставляемом платформой.
Устанавливаем необходимые серверные пакеты из отдельного PPA-репозитория:
sudo apt-add-repository ppa:cloudfoundry/ppa
sudo apt-get update
sudo apt-get install cloudfoundry-server
В процессе установки потребуется ответить на несколько вопросов debconf, таких как пароль к MySQL.
Устанавливаем клиентские пакеты для тестирования сервера:
sudo apt-get install cloudfoundry-client
В итоге имеем сервер "vcap" и клиент "vmc".
Настройка
По умолчанию vmc-клиент настроен для работы с внешним сервисом
CloudFoundry.com. Для того, чтобы обеспечить его работу с локальным сервером
потребуется настроить сопутствующие локальных службы.
Во первых требуется обеспечить автоматическое сопоставление для выполняемых
приложений IP-адреса cloud-окружения с доменным именем. Самым типичным способом
является использование готовых DNS-сервисов, таких как DynDNS.com, настроить
автоматическую отправку обновлений на сервис SynDNS.com можно запустив:
dpkg-reconfigure cloudfoundry-server
В более простом случае, для проведения экспериментов можно обойтись правкой
/etc/hosts на стороне клиента и сервера.
Смотрим внешний IP-адрес сервера. Если сервер запущен не на локальной машине, а
в сервисе Amazon EC2 адрес можно посмотреть через обращение к API Amazon командой:
wget -q -O- http://169.254.169.254/latest/meta-data/public-ipv4
174.129.119.101
Соответственно, в /etc/hosts на сервере и клиентских машинах добавляем
управляющий хост api.vcap.me, а также хост для тестового приложения (в нашем
случае приложение будет называться testing123):
echo "174.129.119.101 api.vcap.me testing123.vcap.me" | sudo tee -a /etc/hosts
Привязываем vmc-клиент к серверу vcap (CloudFoundry):
vmc target api.vcap.me
Succesfully targeted to [http://api.vcap.me]
Добавляем на сервер нового пользователя:
vmc add-user
Email: test@example.com
Password: ********
Verify Password: ********
Creating New User: OK
Successfully logged into [http://api.vcap.me]
Заходим на сервер:
vmc login
Email: test@example.com
Password: ********
Successfully logged into [http://api.vcap.me]
Размещаем своё приложение на сервере. В качестве примера, загрузим простую
программу на языке Ruby, использующую фреймворк Sinatra. Примеры можно найти в
директории /usr/share/doc/ruby-vmc/examples.
Переходим в директорию с приложением:
cd /usr/share/doc/ruby-vmc/examples/ruby/hello_env
Копируем его на сервер:
vmc push
Would you like to deploy from the current directory? [Yn]: y
Application Name: testing123
Application Deployed URL: 'testing123.vcap.me'?
Detected a Sinatra Application, is this correct? [Yn]: y
Memory Reservation [Default:128M] (64M, 128M, 256M, 512M, 1G or 2G)
Creating Application: OK
Would you like to bind any services to 'testing123'? [yN]: n
Uploading Application:
Checking for available resources: OK
Packing application: OK
Uploading (0K): OK
Push Status: OK
Staging Application: OK
Starting Application: OK
Все готово! Теперь можно открыть в браузере http://testing123.vcap.me/ и
насладиться результатом работы загруженной программы.
Пример развертывания приложения в сервисе CloudFoundry.com
Подкоючаем vmc-клиент к сервису CloudFoundry.com:
vmc target https://api.cloudfoundry.com
Succesfully targeted to [https://api.cloudfoundry.com]
Входим, предварительно зарегистрировавшись на сайте CloudFoundry.com:
vmc login
Email: test@example.com
Password: **********
Successfully logged into [https://api.cloudfoundry.com]
Размещаем NodeJS-приложение:
cd /usr/share/doc/ruby-vmc/examples/nodejs/hello_env
vmc push
Would you like to deploy from the current directory? [Yn]: y
Application Name: example102
Application Deployed URL: 'example102.cloudfoundry.com'?
Detected a Node.js Application, is this correct? [Yn]: y
Memory Reservation [Default:64M] (64M, 128M, 256M, 512M or 1G) 64M
Creating Application: OK
Would you like to bind any services to 'example102'? [yN]: n
Uploading Application:
Checking for available resources: OK
Packing application: OK
Uploading (0K): OK
Push Status: OK
Staging Application: OK
Starting Application: OK
Открываем в браузере http://example102.cloudfoundry.com/ и видим результат работы
Размещаем программу на Java:
Переходим в директорию с примером:
cd /usr/share/doc/ruby-vmc/examples/springjava/hello_env
Собираем JAR-архив:
sudo apt-get install openjdk-6-jdk maven2
...
cd $HOME
cp -r /usr/share/doc/ruby-vmc/examples/springjava .
cd springjava/hello_env/
mvn clean package
...
cd target
Загружаем на сервер:
vmc push
Would you like to deploy from the current directory? [Yn]: y
Application Name: example103
Application Deployed URL: 'example103.cloudfoundry.com'?
Detected a Java Web Application, is this correct? [Yn]: y
Memory Reservation [Default:512M] (64M, 128M, 256M, 512M or 1G) 512M
Creating Application: OK
Would you like to bind any services to 'example103'? [yN]: n
Uploading Application:
Checking for available resources: OK
Packing application: OK
Uploading (4K): OK
Push Status: OK
Staging Application: OK
Starting Application: OK
Открываем в браузере http://example103.cloudfoundry.com/.
Размещаем более сложное готовое web-приложение Drawbridge, требующее для
своей работы СУБД MySQL (параметры подключаемого сервиса mysql-4a958 задаются
отдельно, в web-интерфейсе cloudfoundry.com):
cd $HOME
bzr branch lp:~kirkland/+junk/drawbridge
cd drawbridge
vmc push
Would you like to deploy from the current directory? [Yn]: y
Application Name: example104
Application Deployed URL: 'example104.cloudfoundry.com'?
Detected a Node.js Application, is this correct? [Yn]: y
Memory Reservation [Default:64M] (64M, 128M, 256M or 512M) 128M
Creating Application: OK
Would you like to bind any services to 'example104'? [yN]: y
Would you like to use an existing provisioned service [yN]? n
The following system services are available:
1. mongodb
2. mysql
3. redis
Please select one you wish to provision: 2
Specify the name of the service [mysql-4a958]:
Creating Service: OK
Binding Service: OK
Uploading Application:
Checking for available resources: OK
Processing resources: OK
Packing application: OK
Uploading (77K): OK
Push Status: OK
Staging Application: OK
Starting Application: OK
Открываем http://example104.cloudfoundry.com
Просмотр размещенных приложений и доступных сервисов.
Выводим список приложений:
vmc apps
| Application | # | Health | URLS | Services |
| example102 | 1 | RUNNING | example102.cloudfoundry.com | |
| example103 | 1 | RUNNING | example103.cloudfoundry.com | |
| example101 | 1 | RUNNING | example101.cloudfoundry.com | |
| example104 | 1 | RUNNING | example104.cloudfoundry.com | mysql-4a958 |
Выводим список доступных сервисов:
vmc services
| Service | Version | Description |
| redis | 2.2 | Redis key-value store service |
| mongodb | 1.8 | MongoDB NoSQL store |
| mysql | 5.1 | MySQL database service |
== Provisioned Services ==
| Name | Service |
| mysql-4a958 | mysql |
| mysql-5894b | mysql |
Выводим список доступных фреймворков:
vmc frameworks
| Name |
| rails3 |
| sinatra |
| lift |
| node |
| grails |
| spring |
Изменение выделенных для приложения ресурсов
Увеличение доступной памяти:
vmc mem example101
Update Memory Reservation? [Current:128M] (64M, 128M, 256M or 512M) 512M
Updating Memory Reservation to 512M: OK
Stopping Application: OK
Staging Application: OK
Starting Application: OK
Проверяем, какие ресурсы доступны:
vmc stats example101
| Instance | CPU (Cores) | Memory (limit) | Disk (limit) | Uptime |
| 0 | 0.1% (4) | 16.9M (512M) | 40.0K (2G) | 0d:0h:1m:22s |
Увеличение числа одновременно выполняемых окружений для приложения example104 до 4:
vmc instances example104 4
Scaling Application instances up to 4: OK
Проверяем, какие ресурсы доступны:
vmc stats example104
| Instance | CPU (Cores) | Memory (limit) | Disk (limit) | Uptime |
| 0 | 0.0% (4) | 21.0M (128M) | 28.0M (2G) | 0d:0h:19m:33s |
| 1 | 0.0% (4) | 15.8M (128M) | 27.9M (2G) | 0d:0h:2m:38s |
| 2 | 0.0% (4) | 16.3M (128M) | 27.9M (2G) | 0d:0h:2m:36s |
| 3 | 0.0% (4) | 15.8M (128M) | 27.9M (2G) | 0d:0h:2m:37s |
|