Translate

понеділок, 1 травня 2017 р.

Cloud Foundry. Part II: BOSH Lite/Cloud Foundry (DEA)

Зовсім нещодавно я написав першу ввідну статтю про PAAS-платформу Cloud Foundry , а зараз я пропоную локально встановити та на практиці оцінити цю платформу.

Є 2 найпростіші способи спробувати Cloud Foundry на локальній системі: PCF Dev та BOSH Lite. У цій статті буде розглянуто останній варіант, як більш гнучкий, проте і складніший. У якості хост-системи буде використано macOS, але звісно з установкою на інших операційних системах проблем не має бути. У кінцевому рахунку це все рівно буде віртуальна машина VirtualBox з Ubuntu 14.04 всередині. Головне - це мати систему з мінімальною кількістю оперативної пам'яті, що рівна 8ГБ.


1. BOSH LITE INSTALLATION (BOSH DIRECTOR)


Отже, до діла. Перш за все установимо BOSH, систему, котра розгортає вузли Cloud Foundry. У випадку Lite-версії, BOSH розповсюджується у вигляді готового образу віртуальної машини, тому Vagrant та VirtualBox мають бути установлені:

$ vagrant --version
Vagrant 1.9.1

$ VBoxManage --version
5.1.18r114002

Для VirtualBox варто також проінсталювати Oracle VM VirtualBox Extension Pack, адже інакше можливі проблеми з мережею між майбутніми компонентами.

Установимо BOSH CLI клієнт, котрий розповсюджується як ruby gem-пакет:

# gem install bosh_cli --no-ri --no-rdoc

$ bosh --version
BOSH 1.3215.4.0

Клонуємо репозиторій BOSH Lite. Тут є все що необхідно для його старту:

$ mkdir ~/workspace
$ cd ~/workspace
$ git clone https://github.com/cloudfoundry/bosh-lite
$ cd bosh-lite

Перебуваючи в директорії bosh-lite запустимо створення BOSH Lite серверу (Director-а):

$ vagrant up --provider=virtualbox
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'cloudfoundry/bosh-lite' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: 9000.137.0
==> default: Loading metadata for box 'cloudfoundry/bosh-lite'
    default: URL: https://atlas.hashicorp.com/cloudfoundry/bosh-lite
==> default: Adding box 'cloudfoundry/bosh-lite' (v9000.137.0) for provider: virtualbox
    default: Downloading: https://atlas.hashicorp.com/cloudfoundry/boxes/bosh-lite/versions/9000.137.0/providers/virtualbox.box
==> default: Successfully added box 'cloudfoundry/bosh-lite' (v9000.137.0) for 'virtualbox'!
==> default: Importing base box 'cloudfoundry/bosh-lite'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'cloudfoundry/bosh-lite' is up to date...
==> default: Setting the name of the VM: bosh-lite_default_1493413924803_26266
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 (guest) => 2200 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2200
    default: SSH username: vagrant
    default: SSH auth method: private key
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Setting hostname...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Users/yuby/workspace/bosh-lite

Vagrant створить окрему віртуальну мережу 192.168.50.0/24 в якій з адресою 192.168.50.4 і буде працювати остання стабільна версія образу BOSH Lite з Vagrant Cloud. З виводу видно, що для роботи мережі, Vagrant створить у Virtualbox-i 2 інтерфейси: один в режимі nat, а інший - в режимі hostonly.

Прив’яжемо клієнта bosh, до щойно створеного сервера, для чого використаємо пароль і логін по-замовчуванню, admin/admin:

$ bosh target 192.168.50.4 lite
Target set to `Bosh Lite Director'
Your username: admin
Enter password: *****
Logged in as `admin'

Додамо нові маршрути на хост машині до підмережі BOSH Lite та майбутньої підмережі контейнерів Cloud Foundry (10.244.0.0/16):

$ bin/add-route
+ old_ips=10.244.0.0/19
+ ips=10.244.0.0/16
+ gw=192.168.50.4
+ echo 'Adding the following route entry to your local route table to enable direct container access: 10.244.0.0/16 via 192.168.50.4. Your sudo password may be required.'
++ uname
+ '[' Darwin = Darwin ']'
+ sudo route delete -net 10.244.0.0/19 192.168.50.4
Password:
route: writing to routing socket: not in table
delete net 10.244.0.0: gateway 192.168.50.4: not in table
+ sudo route delete -net 10.244.0.0/16 192.168.50.4
route: writing to routing socket: not in table
delete net 10.244.0.0: gateway 192.168.50.4: not in table
+ sudo route add -net 10.244.0.0/16 192.168.50.4
add net 10.244.0.0: gateway 192.168.50.4

Інакше, підмережі 10.244.0.0/16 та 192.168.50.0/24 доступними з хост-машини не будуть.

Домени *.bosh-lite.com власником на рівні DNS прив’язані до локальних IP-адрес, тому краще просто погодитись з набором мереж для BOSH Lite.

Якщо установка BOSH Director не пройшла успішно, то можна переглянути вирішення найбільш типових проблем за наступним посиланням https://github.com/cloudfoundry/bosh-lite/blob/master/docs/troubleshooting.md.

2. DEPLOYING CLOUD FOUNDRY


Перейдемо у вже створену на попередньому етапі директорію workspace та зклонуємо репозиторій Cloud Foundry:

$ cd ~/workspace
$ git clone https://github.com/cloudfoundry/cf-release.git

Дозволимо перенаправлення для клонування коду go-пакетів:

$ cd cf-release
$ git config --global http.https://gopkg.in.followRedirects true

Інакше, можна отримати наступну помилку:

...
error: RPC failed; HTTP 301 curl 22 The requested URL returned error: 301

fatal: The remote end hung up unexpectedly

fatal: clone of 'https://gopkg.in/yaml.v2' into submodule path
'/Users/engrun/Development/git-repos/cf-release/src/loggregator/src/
gopkg.in/yaml.v2' failed
...

Зклонуємо всі сабмодулі, що необхідні для компіляції Cloud Foundry:

$ cd cf-release
$ ./scripts/update 
===> Uncommitted submodules changes will be clobbered <===

===> Unversioned changes will be clobbered <===

+ git rev-parse '@{u}'
+ git pull
Already up-to-date.
+ git submodule sync --recursive
Synchronizing submodule url for 'src/binary-buildpack-release'
Synchronizing submodule url for 'src/capi-release'
...
Entering 'src/routing-release/src/gopkg.in/yaml.v2'
Entering 'src/ruby-buildpack-release'
Entering 'src/smoke-tests'
Entering 'src/staticfile-buildpack-release'
Entering 'src/uaa-release'
Entering 'src/uaa-release/src/uaa'
+ git clean -ffd
+ set +x
CF Release has been updated

Це може зайняти час, адже їхня кількість дуже серйозна.

Для компіляції релізу Cloud Foundry також необхідний Bundler та Spiff:

# gem install bundler

$ cd /tmp
$ wget https://github.com/cloudfoundry-incubator/spiff/releases/download/v1.0.8/spiff_darwin_amd64.zip
$ unzip https://github.com/cloudfoundry-incubator/spiff/releases/download/v1.0.8/spiff_darwin_amd64.zip
# cp spiff /usr/local/bin

Spiff - це програма командного рядка, спеціально створена для генерації маніфестів розгортання (deployment manifests) BOSH. У релізі BOSH 2, її вже замінено на Spruce.

Створимо маніфест розгортання та призначимо його як поточний маніфест для BOSH:

$ cd cf-release
$ ./scripts/generate-bosh-lite-dev-manifest
Deployment set to '/Users/yuby/workspace/cf-release/bosh-lite/deployments/cf.yml'

Після чого cf.yml буде відображений, як deployment manifests в BOSH:

$ bosh status
Config
             /Users/yuby/.bosh_config

Director
  Name       Bosh Lite Director
  URL        https://192.168.50.4:25555
  Version    260.0.0 (00000000)
  User       admin
  UUID       63ddb6a6-d6fe-40e1-b16b-2ff6b2034c79
  CPI        warden_cpi
  dns        disabled
  compiled_package_cache enabled (provider: local)
  snapshots  disabled

Deployment
  Manifest   /Users/yuby/workspace/cf-release/bosh-lite/deployments/cf.yml

У cf.yml описано купу параметрів, серед яких адреси вузлів майбутньої Cloud Foundry інсталяції (вони були визначені заздалегіть власником репозиторію), параметри цих же вузлів, домени і т.п.

Завантажимо Stemcell. Stemcell - це мінімальний образ операційної системи Linux, котрий використовує BOSH для розгортання всіх вузлів Cloud Foundry. Переглянути список усіх доступних stemcell-ів можна за наступним посиланням https://bosh.io/stemcells. Для нашого випадку (VirtualBox) нам необхідний BOSH Lite Warden stemcell:

$ cd /tmp
$ wget https://s3.amazonaws.com/bosh-core-stemcells/warden/bosh-stemcell-3363.20-warden-boshlite-ubuntu-trusty-go_agent.tgz

Завантажимо його в BOSH:

$ bosh upload stemcell /tmp/bosh-stemcell-3363.20-warden-boshlite-ubuntu-trusty-go_agent.tgz
Acting as user 'admin' on 'Bosh Lite Director'

Verifying stemcell...
File exists and readable                                     OK
Verifying tarball...
Read tarball                                                 OK
Manifest exists                                              OK
Stemcell image file                                          OK
Stemcell properties                                          OK

Stemcell info
-------------
Name:    bosh-warden-boshlite-ubuntu-trusty-go_agent
Version: 3363.20

Checking if stemcell already exists...
No

Uploading stemcell...

bosh-stemcell:  96% |oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo         | 348.3MB  42.6MB/s ETA:  00:00:00
Director task 1
  Started update stemcell
  Started update stemcell > Extracting stemcell archive. Done (00:00:03)
  Started update stemcell > Verifying stemcell manifest. Done (00:00:00)
  Started update stemcell > Checking if this stemcell already exists. Done (00:00:00)
  Started update stemcell > Uploading stemcell bosh-warden-boshlite-ubuntu-trusty-go_agent/3363.20 to the cloud. Done (00:00:11)
  Started update stemcell > Save stemcell bosh-warden-boshlite-ubuntu-trusty-go_agent/3363.20 (cd1193a8-a46f-46e1-5ab1-56a935d4b231). Done (00:00:00)
     Done update stemcell (00:00:14)

Task 1 done

Started 2017-02-21 15:58:44 UTC
Finished 2017-02-21 15:58:58 UTC
Duration 00:00:14
bosh-stemcell:  96% |ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo         | 349.1MB  15.4MB/s Time: 00:00:22

Нарешті можемо приступити до завантаження пакетів, необхідних для установки Cloud Foundry. У процесі створення релізу, BOSH запитає яку назву потрібно для нього обрати (наведено жирним шрифтом). Необхідно просто натиснути Enter, адже назва 'cf' вже активована попереднім скриптом generate-bosh-lite-dev-manifest.

$ cd ~/workspace/cf-release
$ bosh create release
Syncing blobs...
debian_nfs_server/nfs-kernel-server_1%3a1... downloaded
uaa/cloudfoundry-identity-varz-1.0.2.war downloaded
...
java-buildpack/java-buildpack-offline-v3.... downloaded
Please enter development release name: |cf| <just type Enter>

Building DEV release
---------------------------------
Release artifact cache: /Users/yuby/.bosh/cache

Building license
----------------
Building license...
  Using final version '4e1a2befc59356ae086af33a56949bdb6d4f95ef'
  Downloading from blobstore (id=48626067-cd8a-4da9-9c44-01ec785c08d7)...


Building packages
-----------------
Building acceptance-tests...
  Using final version '211610bf8ba4e024fe595602ebaa441abd1a040b'
  Downloading from blobstore (id=55cbf83f-7b46-41dc-837f-595cb183a86e)...
...
Building warden...
  Using final version '9c26e453d63bceb97e4b87c11526e8854a5b63e4'
  Downloading from blobstore (id=02e14781-7d4a-4e9d-ba93-5c4e83edb887)...

Resolving dependencies
----------------------
Dependencies resolved, correct build order is:
- binary-buildpack
- capi_utils
...
- warden

Building jobs
-------------
Building acceptance-tests...
  Using final version 'd3bc77d74e3b6584a82cbb7be392cc0d484f03ff'
...
Building uaa...
  Using final version 'e0a7ce76682be8a4c732473e053402098b0904d1'


Building release
----------------

Generating manifest...
----------------------
Writing manifest...

Release summary
---------------
License
+---------+------------------------------------------+-------+
| Name    | Version                                  | Notes |
+---------+------------------------------------------+-------+
| license | 4e1a2befc59356ae086af33a56949bdb6d4f95ef |       |
+---------+------------------------------------------+-------+

Packages
+-------------------------------+------------------------------------------+-------+
| Name                          | Version                                  | Notes |
+-------------------------------+------------------------------------------+-------+
| acceptance-tests              | 211610bf8ba4e024fe595602ebaa441abd1a040b |       |
| binary-buildpack              | d9dc7ff39da8a7ee2157e91c2cedb4dfb3508ba8 |       |
...
| tps                           | 0eace0b29d9c2a177c5e2ae36c7b3c1e5628f96b |       |
| uaa                           | c90e18bfa8ab9ac7c71fc89ab6b3f2d83aa3abc3 |       |
| uaa_utils                     | 20557445bf996af17995a5f13bf5f87000600f2e |       |
| warden                        | 9c26e453d63bceb97e4b87c11526e8854a5b63e4 |       |
+-------------------------------+------------------------------------------+-------+

Jobs
+-------------------------------+------------------------------------------+-------+
| Name                          | Version                                  | Notes |
+-------------------------------+------------------------------------------+-------+
| acceptance-tests              | d3bc77d74e3b6584a82cbb7be392cc0d484f03ff |       |
| binary-buildpack              | e2753ad7c384717801a27475b99bdea16669685d |       |
| blobstore                     | 9448f84995133f1f742136d7b51644a018d6a985 |       |
...
| tps                           | 696f332e29ccd2d1f5488d3035cb574a6aefd81c |       |
| uaa                           | e0a7ce76682be8a4c732473e053402098b0904d1 |       |
+-------------------------------+------------------------------------------+-------+

Release name: cf
Release version: 258+dev.1
Release manifest: /Users/yuby/workspace/cf-release/dev_releases/cf/cf-258+dev.1.yml

Виконання цієї команди також може зайняти дуже пристойну кількість часу (біля 2 годин на Intel Core i7). Реліз маніфест - це список пакетів та їх версій, що підуть в реліз Cloud Foundry.

Завантажуємо щойно згенерований реліз до BOSH Director:

$ bosh upload release
Acting as user 'admin' on 'Bosh Lite Director'

Copying packages
----------------
acceptance-tests
binary-buildpack
blobstore_url_signer
...
syslog_drain_binder
tps
uaa
uaa_utils
warden


Copying jobs
------------
acceptance-tests
binary-buildpack
blobstore
cc_uploader
...
stager
staticfile-buildpack
statsd-injector
syslog_drain_binder
tps
uaa


Copying license
---------------
license

Generated /var/folders/5x/5rzfjp5x6b17wb9rk_j85p8w0000gp/T/d20170222-34548-1y2nco7/d20170222-34548-1q87khk/release.tgz
Release size: 2.9G

Verifying manifest...
Extract manifest                                             OK
Manifest exists                                              OK
Release name/version                                         OK


Uploading release
release.tgz:    96% |ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo         |   2.8GB  44.6MB/s ETA:  00:00:02
Director task 2
  Started extracting release > Extracting release. Done (00:00:25)

  Started verifying manifest > Verifying manifest. Done (00:00:00)

  Started resolving package dependencies > Resolving package dependencies. Done (00:00:00)

  Started creating new packages
  Started creating new packages > acceptance-tests/211610bf8ba4e024fe595602ebaa441abd1a040b. Done (00:00:01)
  Started creating new packages > binary-buildpack/d9dc7ff39da8a7ee2157e91c2cedb4dfb3508ba8. Done (00:00:00)
  ...
     Done creating new packages (00:01:31)
  ...
  Started creating new jobs > tps/696f332e29ccd2d1f5488d3035cb574a6aefd81c. Done (00:00:00)
  Started creating new jobs > uaa/e0a7ce76682be8a4c732473e053402098b0904d1. Done (00:00:00)
     Done creating new jobs (00:00:00)

  Started release has been created > cf/258+dev.1. Done (00:00:00)

Task 2 done

Started 2017-02-22 10:36:26 UTC
Finished 2017-02-22 10:38:22 UTC
Duration 00:01:56
release.tgz:    96% |oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo         |   2.8GB  15.7MB/s Time: 00:03:02

Release uploaded

Після успішного завантаження, запускаємо деплой Cloud Foundry (компіляцію, раніше завантажених пакетів):

$ bosh deploy
Acting as user 'admin' on deployment 'cf-warden' on 'Bosh Lite Director'
Getting deployment properties from director...

Detecting deployment changes
----------------------------
resource_pools:
- cloud_properties:
    name: random
  env:
    bosh:
...
Please review all changes carefully

Deploying
---------
Are you sure you want to deploy? (type 'yes' to continue): yes

Director task 3
Deprecation: Ignoring cloud config. Manifest contains 'networks' section.

  Started preparing deployment > Preparing deployment. Done (00:00:01)

  Started preparing package compilation > Finding packages to compile > Downloading 'consul/43cd9f9edb9b3929902b2bf0ca081ec2dd3f31a1' from global cache > Downloading 'confab/d2e83a5470f84c960be9152a25039862463f9136' from global cache > Downloading 'golang1.7/46105d4480ca083a6cafb8ca307d5e5084c655c4' from global cache > Downloading 'loggregator_common/0fce24a169a51b745965d683f436121c2086c9bd' from global cache > Downloading 'nats-common/6b42bb6d70f8fb60a8e097162259f0df7100b903' from global cache > ...
     Done preparing package compilation > Finding packages to compile (00:00:07)

  Started compiling packages
  Started compiling packages > acceptance-tests/edccb45bc514973fb76f5ff9f97d87b273f11d4f
  Started compiling packages > gorouter/0cc2bc843d45b6bd9af484bc94af6ce46a4227d2
  Started creating missing vms > blobstore_z1/4167ff32-a00a-47b5-afcd-6449855e017d (0)
  ...
  Started updating instance router_z1 > router_z1/c68c1027-5b4d-4913-be29-dbcc13c867de (0) (canary)
  ...
  Done updating instance router_z1 > router_z1/c68c1027-5b4d-4913-be29-dbcc13c867de (0) (canary) (00:00:55)

Task 8 done

Started   2017-04-29 07:34:36 UTC
Finished  2017-04-29 07:53:27 UTC
Duration  00:18:51

Deployed 'cf-warden' to 'Bosh Lite Director'.

Врешті-решт можна переглянути всі контейнери вузлів Cloud Foundry. Ці вузли емулюються на VirtualBox машині BOSH Lite за допомогою контейнеризації Warden, яка в свою чергу також використовується для розмежовування додатків в Cloud Foundry:

$ bosh vms
Acting as user 'admin' on 'Bosh Lite Director'
Deployment `cf-warden'

Director task 15

Task 15 done

+-------------------------------------+---------+-----+-----------+--------------+
| VM                                  | State   | AZ  | VM Type   | IPs          |
+-------------------------------------+---------+-----+-----------+--------------+
| api_z1/0                            | running | n/a | large_z1  | 10.244.0.138 |
| blobstore_z1/0                      | running | n/a | medium_z1 | 10.244.0.130 |
| consul_z1/0                         | running | n/a | small_z1  | 10.244.0.54  |
| doppler_z1/0                        | running | n/a | medium_z1 | 10.244.0.146 |
| etcd_z1/0                           | running | n/a | large_z1  | 10.244.0.42  |
| ha_proxy_z1/0                       | running | n/a | router_z1 | 10.244.0.34  |
| hm9000_z1/0                         | running | n/a | medium_z1 | 10.244.0.142 |
| loggregator_trafficcontroller_z1/0  | running | n/a | small_z1  | 10.244.0.150 |
| nats_z1/0                           | running | n/a | medium_z1 | 10.244.0.6   |
| postgres_z1/0                       | running | n/a | medium_z1 | 10.244.0.30  |
| router_z1/0                         | running | n/a | router_z1 | 10.244.0.22  |
| runner_z1/0                         | running | n/a | runner_z1 | 10.244.0.26  |
| uaa_z1/0                            | running | n/a | medium_z1 | 10.244.0.134 |
+-------------------------------------+---------+-----+-----------+--------------+

VMs total: 13

$ bosh releases
Acting as user 'admin' on 'Bosh Lite Director'

+------+------------+-------------+
| Name | Versions   | Commit Hash |
+------+------------+-------------+
| cf   | 258+dev.1* | 6851f46a    |
+------+------------+-------------+
(*) Currently deployed

Releases total: 1

Це інсталяція вузлів DEA-архітектури: runner - DEA-агенти, hm9000 - підсистема Health Manager і т.д. Про призначення інших вузлів можна прочитати у статті, на котру я вже посилався

Надалі ці вузли можна маштабувати до більшої кількості, звісно за допомогою BOSH-a. Останній також веде історію всіх операцій, котрі можна вивести наступною командою:

$ bosh tasks recent

Всі активні задачі також можна переглянути, прибравши аргумент 'recent':

$ bosh tasks

У разі наявності проблемної задачі - її роботу можна припинити:

$ bosh cancel task task_id

де 'task_id' - номер задачі, з виводу 'bosh task'. Проте попередньо краще спробувати розібратись, чому задача зависла:

$ bosh task task_id --debug

Команда вище покаже debug журнал задачі з вказаним id.

Зробимо базові перевірки коректності виливки Cloud Foundry, для чого запитаємо сервісну інформацію через API-вузол:

$ curl -s api.bosh-lite.com/info | jq .
{
  "allow_debug": true,
  "token_endpoint": "https://uaa.bosh-lite.com",
  "authorization_endpoint": "https://login.bosh-lite.com",
  "description": "",
  "version": 0,
  "support": "http://support.cloudfoundry.com",
  "build": "",
  "name": ""
}

$ curl -s api.bosh-lite.com | jq .
{
  "links": {
    "self": {
      "href": "https://api.bosh-lite.com"
    },
    "cloud_controller_v2": {
      "href": "https://api.bosh-lite.com/v2",
      "meta": {
        "version": "2.80.0"
      }
    },
    "cloud_controller_v3": {
      "href": "https://api.bosh-lite.com/v3",
      "meta": {
        "version": "3.15.0"
      }
    },
    "uaa": {
      "href": "https://uaa.bosh-lite.com"
    }
  }
}

Посилання https://uaa.bosh-lite.com та https://login.bosh-lite.com відкриваються в браузері, але за ними, насправді, не знаходиться нічого цікавого:


Більш детальну перевірку нового релізу можна провести, виконавши acceptance чи smoke тести, доступ до яких відбувається через меню "run errand":

$ bosh run errand
1. acceptance_tests
2. smoke_tests
Choose an errand: 2
Acting as user 'admin' on deployment 'cf-warden' on 'Bosh Lite Director'
...
Errand 'smoke_tests' completed successfully (exit code 0)

Після чого буде створений новий вузол, з якого і будуть проходити тестування.

Доступ і управління вузлами Cloud Foundry, деплой додатків та управління ними відбувається через клієнт cf_cli. Його необхідно проінсталювати, приклад його установки для усіх популярних ОС описаний за посиланням https://docs.cloudfoundry.org/cf-cli/install-go-cli.html

$ cf -v
cf version 6.26.0+9c9a261fd.2017-04-06

Використовуючи логін/пароль admin/admin, пройдемо аутентифікацію Cloud Foundry:

$ cf login -a https://api.bosh-lite.com --skip-ssl-validation -u admin -p admin
API endpoint: https://api.bosh-lite.com
Authenticating...
OK

Targeted org system

API endpoint:   https://api.bosh-lite.com (API version: 2.80.0)
User:           admin
Org:            system
Space:          No space targeted, use 'cf target -s SPACE'

Cтворимо нову організацію (org) та простір (space) в CF:

$ cf create-org org
Creating org org as admin...
OK
Assigning role OrgManager to user admin in org org ...
OK

TIP: Use 'cf target -o org' to target new org

$ cf create-space space -o org
Creating space space in org org as admin...
OK
Assigning role RoleSpaceManager to user admin in org org / space space as admin...
OK
Assigning role RoleSpaceDeveloper to user admin in org org / space space as admin...
OK

TIP: Use 'cf target -o "org" -s "space"' to target new space

Як і порадили, перемикаємось в новостворений space та org:

$ cf target -o org -s space
api endpoint:   https://api.bosh-lite.com
api version:    2.80.0
user:           admin
org:            org
space:          space

Ці поняття необхідні для управління правами користувачів, що можуть, наприклад, володіти доступом лише до окремих просторів/організацій, читати сервісну інформацію додатків і т.п. Детальніше з темою доступів можна ознайомитись за наступним посиланням https://docs.cloudfoundry.org/concepts/roles.html

Наразі все готово для деплою додатків. Зклонуємо репозиторій тестового додатку spring-music:

$ cd ~/workspace
$ git clone https://github.com/cloudfoundry-samples/spring-music.git
$ cd spring-music

Проінсталюємо Java на хост-машині.

$ java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

Правила, за якими буде вилито додаток spring-music, описані в manifest.yml, котрий і буде читати CF cli:

$ cat manifest.yml
---
applications:
- name: spring-music
  memory: 1G
  random-route: true
  path: build/libs/spring-music.jar

Отже, додатку буде виділено 1Gb оперативної пам'яті, завдяки опції 'random-route: true', додаток отримає випадкове доменне ім'я (його можна буде побачити вже після створення додатку), а 'path' вказує на адресу jar-файлу. Сюди ж одразу можна додати інформацію про кількість необхідних одиниць програми.

Про подробиці написання маніфестів деплою додатків можна прочитати в офіційній документації Cloud Foundry.

Наразі лишилось скомпілювати spring-music.jar, для чого і потрібно було інсталювати Java-у:

$ ./gradlew clean assemble

Запуститимо деплой цього додатку в Cloud Foundry:

$ cf push
Using manifest file /Users/yuby/workspace/spring-music/manifest.yml

Creating app spring-music in org org / space space as admin...
OK

Creating route spring-music-stratocratic-bronzite.bosh-lite.com...
OK

Binding spring-music-stratocratic-bronzite.bosh-lite.com to spring-music...
OK

Uploading spring-music...
Uploading app files from: /var/folders/5x/5rzfjp5x6b17wb9rk_j85p8w0000gp/T/unzipped-app148108414
Uploading 38.9M, 234 files
Done uploading
OK

Starting app spring-music in org org / space space as admin...
-----> Downloaded app package (39M)
-----> Java Buildpack Version: v3.16 | https://github.com/cloudfoundry/java-buildpack.git#2110750
-----> Downloading Open Jdk JRE 1.8.0_131 from https://java-buildpack.cloudfoundry.org/openjdk/trusty/x86_64/openjdk-1.8.0_131.tar.gz (28.3s)
       Expanding Open Jdk JRE to .java-buildpack/open_jdk_jre (1.1s)
-----> Downloading Open JDK Like Memory Calculator 2.0.2_RELEASE from https://java-buildpack.cloudfoundry.org/memory-calculator/trusty/x86_64/memory-calculator-2.0.2_RELEASE.tar.gz (0.4s)
       Memory Settings: -Xmx681574K -XX:MaxMetaspaceSize=104857K -Xss349K -Xms681574K -XX:MetaspaceSize=104857K
-----> Downloading Container Certificate Trust Store 2.1.0_RELEASE from https://java-buildpack.cloudfoundry.org/container-certificate-trust-store/container-certificate-trust-store-2.1.0_RELEASE.jar (0.8s)
       Adding certificates to .java-buildpack/container_certificate_trust_store/truststore.jks (0.4s)
-----> Downloading Spring Auto Reconfiguration 1.10.0_RELEASE from https://java-buildpack.cloudfoundry.org/auto-reconfiguration/auto-reconfiguration-1.10.0_RELEASE.jar (2.6s)

-----> Uploading droplet (85M)

0 of 1 instances running, 1 starting
1 of 1 instances running

App started

OK

App spring-music was started using this command `CALCULATED_MEMORY=$($PWD/.java-buildpack/open_jdk_jre/bin/java-buildpack-memory-calculator-2.0.2_RELEASE -memorySizes=metaspace:64m..,stack:228k.. -memoryWeights=heap:65,
...
org.springframework.boot.loader.JarLauncher`

Showing health and status for app spring-music in org org / space space as admin...
OK

requested state: started
instances: 1/1
usage: 1G x 1 instances
urls: spring-music-stratocratic-bronzite.bosh-lite.com
last uploaded: Sat Apr 29 20:10:58 UTC 2017
stack: cflinuxfs2
buildpack: container-certificate-trust-store=2.1.0_RELEASE java-buildpack=v3.16-https://github.com/cloudfoundry/java-buildpack.git#2110750 java-main open-jdk-like-jre=1.8.0_131 open-jdk-like-memory-calculator=2.0.2_RELEASE spring-auto-reconfiguration=1.10.0_RELEASE

     state     since                    cpu      memory         disk      details
#0   running   2017-04-29 11:12:23 PM   231.4%   570.5M of 1G   0 of 1G 

Додаток spring-music буде працювати за посиланням http://spring-music-stratocratic-bronzite.bosh-lite.com.

Всі додатки та базову сервісну інформацію про їх роботу в Cloud Foundry можна переглянути наступним чином:

$ cf apps
Getting apps in org org / space space as admin...
OK

name           requested state   instances   memory   disk   urls
spring-music   started           1/1         1G       1G     spring-music-stratocratic-bronzite.bosh-lite.com

Масштабувати spring-music також неважка справа, виконаємо наступне:

$ cf scale spring-music -m 2G -k 2G -i 2

$ cf apps
Getting apps in org org / space space as admin...
OK

name           requested state   instances   memory   disk   urls
spring-music   started           2/2         2G       2G     spring-music-stratocratic-bronzite.bosh-lite.com

Перейшовши за URL-адресою цього додатку, можна побачити його веб-інтерфейс:


Наразі spring-music працює в режимі 'in-memory', адже поки відсутня будь-яка база даних в нашому релізі CF. Щоб виправити цю прогалину, ми встановимо Redis і налаштуємо цей додаток на його використання.


3. INSTALLATION REDIS BROKER/SERVICE


Для установки Redis спершу необхідно зклонувати репозиторій:

$ cd ~/workspace
$ git clone https://github.com/pivotal-cf/cf-redis-release

Для успішного відпрацювання подальших скриптів необхідні: ruby 2.3.0 (ця версія, чомусь, захардкожена в Gemfile), Qt-фреймворк версії не вище за 5.5 (інакше можуть бути проблеми з установкою capybara-webkit), ruby bundler.

Для установки Ruby ліпше за все скористатись rbenv, детальніше про це можна почитати за наступним посиланням https://gorails.com/setup/osx/10.12-sierra.

Qt/Qmake можна встановити з репозиторіїв brew:

$ brew install qt@5.5
$ cd /usr/local/Cellar/qt@5.5/5.5.1_1/bin
$ PATH=`pwd`:$PATH

Після чого базово перевіримо роботу qmake:

$ qmake -v
QMake version 3.0
Using Qt version 5.5.1 in /usr/local/Cellar/qt@5.5/5.5.1_1/lib

Оновлюємо/завантажуємо сабмодулі, необхідні для збірки Redis-релізу, скориставшись update-release скриптом, що поширюється в тому ж репозиторії:

$ cd ~/workspace/cf-redis-release
$ ./scripts/update-release
+ git submodule update --init --recursive
+ bundle install
Using rake 11.1.2
Using CFPropertyList 2.3.2
Using i18n 0.7.0
Using json 1.8.3
Using minitest 5.9.0
...
Using bosh_cli 1.3215.4.0
Using ops_manager_ui_drivers 2.10.9
Using ruby_vcloud_sdk 0.7.4
Using vm_shepherd 3.1.7
Using opsmgr 0.34.20
Using prof 0.31.11
Bundle complete! 13 Gemfile dependencies, 125 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.

Реліз Redis-у залежить від релізу cf-routing, його ми встановимо вже у готовому зібраному вигляді:

$ bosh upload release https://bosh.io/d/github.com/cloudfoundry-incubator/cf-routing-release\?v\=0.143.0
Acting as user 'admin' on 'Bosh Lite Director'
Using remote release `https://bosh.io/d/github.com/cloudfoundry-incubator/cf-routing-release?v=0.143.0'

Director task 40
  Started downloading remote release > Downloading remote release. Done (00:00:33)

  Started extracting release > Extracting release. Done (00:00:01)
  ...
  Started creating new jobs > tcp_router/c8ba8ed129c93d4329a2acbe42938624103d5e73. Done (00:00:00)
     Done creating new jobs (00:00:00)

  Started processing 1 existing job > Processing 1 existing job. Done (00:00:00)

  Started release has been created > routing/0.143.0. Done (00:00:00)

Task 40 done

Started   2017-03-22 10:25:16 UTC
Finished  2017-03-22 10:25:50 UTC
Duration  00:00:34

Release uploaded

Виключно для прикладу збільшимо кількість майбутніх вузлів redis, що будуть тримати корисні дані:

$ vim templates/sample_stubs/meta-warden.yml
...
  redis:
    broker:
      name: redis
      subdomain: redis-broker
...
    dedicated_plan:
      instance_count: 3

Тепер згенеруємо deployment маніфест:

$ ./scripts/generate-deployment-manifest warden templates/sample_stubs/infrastructure-warden.yml > cf-redis-lite.yml

Укажемо uuid BOSH інстансу:

$ vim cf-redis-lite.yml
...
director_uuid: 63ddb6a6-d6fe-40e1-b16b-2ff6b2034c79
...

Uuid можна дізнатись, виконавши команду:

# bosh status --uuid
63ddb6a6-d6fe-40e1-b16b-2ff6b2034c79

Зробимо його активним в BOSH:

$ bosh deployment cf-redis-lite.yml
Deployment set to `/Users/yuby/workspace/cf-redis-release/cf-redis-lite.yml'

Завантажимо реліз Redis:

$ bosh upload release releases/cf-redis/cf-redis-429.0.0.yml
Acting as user 'admin' on 'Bosh Lite Director'
...
Downloading from blobstore (id=c0e06e06-64ab-4ee9-8fe9-f54288e7d568)...

Copying packages
----------------
cf-cli
cf-redis-broker
cf-redis-nginx
cf-redis-smoke-tests
ginkgo
go
redis-common
redis
ruby


Copying jobs
------------
broker-deregistrar
broker-registrar
cf-redis-broker
dedicated-node
smoke-tests
syslog-configurator


Copying license
---------------
license

Generated /var/folders/5x/5rzfjp5x6b17wb9rk_j85p8w0000gp/T/d20170430-65736-zas9d7/d20170430-65736-1ez2coj/release.tgz
Release size: 109.5M

Verifying manifest...
Extract manifest                OK
Manifest exists                 OK
Release name/version            OK


Uploading release
release.tgz:    96% |oooooooooooooooooooooooooooooooooooooooooooooooo     | 105.1MB  27.0MB/s ETA:  00:00:00
Director task 46
  Started extracting release > Extracting release. Done (00:00:00)

  Started verifying manifest > Verifying manifest. Done (00:00:00)

  Started resolving package dependencies > Resolving package dependencies. Done (00:00:00)

  Started creating new packages
  Started creating new packages > cf-cli/33a64fb1b0ca68b3403fe5b0254e86ec7d672dba. Done (00:00:00)
...
  Started creating new packages > ruby/9b59d2f2700da81a98c38c73cd27b6ccf26f188c. Done (00:00:00)
     Done creating new packages (00:00:02)

  Started creating new jobs
  Started creating new jobs > broker-deregistrar/fd74f060a430d793ed734328638db0a5fee34395. Done (00:00:00)
...
  Started creating new jobs > syslog-configurator/d0da02b5001631bd43b90bd86af093f2cd695aab. Done (00:00:00)
     Done creating new jobs (00:00:00)

  Started release has been created > cf-redis/429.0.0. Done (00:00:00)

Task 46 done

Started   2017-04-30 12:54:33 UTC
Finished  2017-04-30 12:54:35 UTC
Duration  00:00:02
release.tgz:    96% |oooooooooooooooooooooooooooooooooooooooooooooooooo     | 105.3MB  14.9MB/s Time: 00:00:07

Release uploaded

У разі успішного виконання попередніх команд, деплоїмо реліз Redis для BOSH Lite:

$ bosh deploy
Acting as user 'admin' on deployment 'bosh-lite-redis' on 'Bosh Lite Director'
Getting deployment properties from director...
Unable to get properties list from director, trying without it...

Detecting deployment changes
----------------------------
resource_pools:
- cloud_properties:
    name: bosh-lite-redis
    ram: 1024
...
  syslog_aggregator:
    address: "<redacted>"
    port: "<redacted>"
Please review all changes carefully

Deploying
---------
Are you sure you want to deploy? (type 'yes' to continue): yes

Director task 47
Deprecation: Ignoring cloud config. Manifest contains 'networks' section.

  Started preparing deployment > Preparing deployment. Done (00:00:00)

  Started preparing package compilation > Finding packages to compile. Done (00:00:00)

  Started compiling packages
  Started compiling packages > cf-redis-smoke-tests/6aec054413f46621d3bd6130203509da36bdeec7
     Done compiling packages > cf-redis-smoke-tests/6aec054413f46621d3bd6130203509da36bdeec7 (00:00:09)
...
  Started compiling packages > cf-redis-broker/9a6e7f1aede494f7bf50910bb3958028f7f077fa. Done (00:00:16)
     Done compiling packages (00:01:53)

  Started creating missing vms
  Started creating missing vms > cf-redis-broker/aa7b6e0e-24e0-44cb-8399-92a736531b16 (0)
...
     Done updating instance dedicated-node > dedicated-node/b61fd4a4-1943-4f0e-a929-a52b20d5b4b3 (2) (00:01:05)
     Done updating instance dedicated-node (00:02:10)

Task 47 done

Started   2017-04-30 13:09:45 UTC
Finished  2017-04-30 13:15:07 UTC
Duration  00:05:22

Deployed `bosh-lite-redis' to `Bosh Lite Director'

Після успішного деплою, новий реліз redis має з’явитись у меню 'bosh vms'.

$ bosh vms 'bosh-lite-redis'
Acting as user 'admin' on deployment 'bosh-lite-redis' on 'Bosh Lite Director'

Director task 57

Task 57 done

+--------------------+---------+-----+----------+-------------+
| VM                 | State   | AZ  | VM Type  | IPs         |
+--------------------+---------+-----+----------+-------------+
| cf-redis-broker/0  | running | n/a | redis_z1 | 10.244.3.2  |
| dedicated-node/0   | running | n/a | redis_z1 | 10.244.3.6  |
| dedicated-node/1   | running | n/a | redis_z1 | 10.244.3.10 |
| dedicated-node/2   | running | n/a | redis_z1 | 10.244.3.14 |
+--------------------+---------+-----+----------+-------------+

VMs total: 4

Реліз складається із 3-ох вузлів Redis (dedicated-node), як і було вказано в meta-warden.yml, та одного брокера. Коректність його роботи можна перевірити запустивши вже інтегровані в реліз тести.

Як альтернатива, можна скористатись 'scripts/deploy-release' для виливки релізу (як і радить офіційна документація), котрий виконує всі ті ж дії, разом зі зборкою cf-networking.

Зареєструємо новий сервіс:

$ bosh run errand broker-registrar

Acting as user 'admin' on deployment 'bosh-lite-redis' on 'Bosh Lite Director'

Director task 14
  Started preparing deployment > Preparing deployment. Done (00:00:01)

  Started preparing package compilation > Finding packages to compile. Done (00:00:00)
  Started creating missing vms > broker-registrar/33b0f475-c49d-40aa-a43a-9ff885c3c64f (0). Done (00:00:07)
  Started updating instance broker-registrar > broker-registrar/33b0f475-c49d-40aa-a43a-9ff885c3c64f (0) (canary). Done (00:00:47)
  Started running errand > broker-registrar/0. Done (00:00:07)
  Started fetching logs for broker-registrar/33b0f475-c49d-40aa-a43a-9ff885c3c64f (0) > Finding and packing log files. Done (00:00:01)
  Started deleting errand instances broker-registrar > broker-registrar/33b0f475-c49d-40aa-a43a-9ff885c3c64f (0). Done (00:00:02)

Task 14 done

Started 2017-05-01 19:27:12 UTC
Finished 2017-05-01 19:28:17 UTC
Duration 00:01:05

[stdout]
cf version 6.21.1+6fd3c9f-2016-08-10
Setting api endpoint to https://api.bosh-lite.com...
OK


API endpoint:   https://api.bosh-lite.com (API version: 2.80.0)
Not logged in. Use 'cf login' to log in.
API endpoint: https://api.bosh-lite.com
Authenticating...
OK
Use 'cf target' to view or set your target org and space
Creating service broker redis as admin...
OK
Disabling access to all plans of service redis for all orgs as admin...
OK
Enabling access to all plans of service redis for all orgs as admin...
OK
...
Errand `broker-registrar' completed successfully (exit code 0)

Як і планували, використаємо redis у якості бекенду для додатку spring-music, котрий ми задеплоїли раніше.

Переглянемо, чи присутній сервіс redis-у в marketplace:

$ cf marketplace
Getting services from marketplace in org org / space space as admin...
OK

service   plans                     description
redis     shared-vm, dedicated-vm   Redis service to provide a key-value store

TIP:  Use 'cf marketplace -s SERVICE' to view descriptions of individual plans of a given service.

Створимо новий інстанс сервісу redis для додатку spring-music:

$ cf create-service redis shared-vm spring_music_redis
Creating service instance spring_music_redis in org org / space space as admin...
OK

Переглянемо всі наявні інстанси сервісів і з якими додатками вони пов’язані:

$ cf services
Getting services in org org / space space as admin...
OK

name                 service   plan        bound apps   last operation
spring_music_redis   redis     shared-vm                create succeeded

Щойно створений інстанс spring_music_redis поки не пов’язаний із жодним додатком, про що і свідчить пусте поле навпроти 'bound apps'. Виконаємо цю прив’язку:

$ cf bind-service spring-music spring_music_redis
Binding service spring_music_redis to app spring-music in org org / space space as admin...
OK
TIP: Use 'cf restage spring-music' to ensure your env variable changes take effect

Щоб зміни вступили в силу необхідно зробити restage вже працюючому додатку:

$ cf restage spring-music
Restaging app spring-music in org org / space space as admin...

0 of 1 instances running, 1 starting
1 of 1 instances running

App started

OK

App spring-music was started
...

Showing health and status for app spring-music in org org / space space as admin...
OK

requested state: started
instances: 1/1
usage: 1G x 1 instances
urls: spring-music-uneternized-torridness.bosh-lite.com
last uploaded: Tue Mar 21 12:43:30 UTC 2017
stack: cflinuxfs2
buildpack: container-certificate-trust-store=2.0.0_RELEASE java-buildpack=v3.13-https://github.com/cloudfoundry/java-buildpack.git#03b493f java-main open-jdk-like-jre=1.8.0_121 open-jdk-like-memory-calculator=2.0.2_RELEASE spring-auto-reconfiguration=1.10.0_RELEASE

     state     since                    cpu      memory       disk      details
#0   running   2017-03-22 12:58:42 PM   239.9%   570M of 1G   0 of 1G

І вже після вивід команди 'cf services' виглядатиме наступним чином:

$ cf services
Getting services in org org / space space as admin...
OK

name                 service   plan        bound apps     last operation
spring_music_redis   redis     shared-vm   spring-music   create succeeded

Тестовий додаток spring-music також відображає, що наразі він використовує сервіс spring_music_redis у якості бази даних:



Посилання:
https://mariash.github.io/learn-bosh/#introduction
https://github.com/cloudfoundry-community/bosh-lite-demo
http://docs.cloudfoundry.org/deploying/boshlite/index.html
http://stackoverflow.com/a/36757764/2971192
http://www.starkandwayne.com/blog/running-cloud-foundry-locally-with-bosh-lite/
https://vyatkins.wordpress.com/2015/02/13/how-to-deploy-cloud-foundry-on-your-local-machine/
https://specify.io/how-tos/install-cloud-foundry-with-bosh
https://www.altoros.com/blog/how-to-install-cloud-foundry-locally-with-bosh-lite/
https://www.evoila.de/2015/04/27/howto-fix-bosh-lite-deployment-with-error-error-100-permission-denied-dir_s_mkdir-vagranttmp/?lang=en
https://github.com/cloudfoundry-samples/test-app
https://github.com/cloudfoundry-samples/spring-music
https://github.com/pivotal-cf/cf-redis-release
https://github.com/cloudfoundry-community/redis-boshrelease
https://github.com/pivotal-cf/pcfdev
https://pivotal.io/platform/pcf-tutorials/getting-started-with-pivotal-cloud-foundry/introduction
https://github.com/cloudfoundry/bosh-lite/blob/master/docs/bosh-cck.md
https://github.com/cloudfoundry/bosh-lite/blob/master/docs/troubleshooting.md

Немає коментарів:

Дописати коментар