designetwork

ネットワークを軸としたIT技術メモ

OpenStackにBOSH環境を構築する

f:id:daichi703n:20180311193820p:plain

基本的にこちらに記載の通りの手順でOpenStackにBOSHをインストールする。

https://bosh.io/docs/init-openstack.html

なお、OpenStackのホストとして使用しているCentOS等でも作業可能だが、PackStackを使用した私の環境ではOpenSSLの依存関係の問題でうまく動作しなかった。そのため、CentOS7 Minimalを別に作成して作業している。

※本手順はローカル環境で実施しており、セキュリティ等の課題が残っていますのでご注意ください。

OpenStackをインストールする

PackStackを使用してOpenStackの1台構成を構築する。

OpenStackインストール手順はこちらを参照。

designetwork.hatenablog.com

なお、リソース不足のためインストールするコンポーネントは以下の通り少なくしている。

# cat ./answers.cfg | grep INSTALL
CONFIG_MARIADB_INSTALL=y
CONFIG_GLANCE_INSTALL=y
CONFIG_CINDER_INSTALL=y
CONFIG_MANILA_INSTALL=n
CONFIG_NOVA_INSTALL=y
CONFIG_NEUTRON_INSTALL=y
CONFIG_HORIZON_INSTALL=y
CONFIG_SWIFT_INSTALL=n
CONFIG_CEILOMETER_INSTALL=n
CONFIG_AODH_INSTALL=n
CONFIG_PANKO_INSTALL=n
CONFIG_SAHARA_INSTALL=n
CONFIG_HEAT_INSTALL=n
CONFIG_MAGNUM_INSTALL=n
CONFIG_TROVE_INSTALL=n
CONFIG_IRONIC_INSTALL=n
CONFIG_CLIENT_INSTALL=y
# installation was not specified in CONFIG_MARIADB_INSTALL, specify
CONFIG_LBAAS_INSTALL=n
CONFIG_NEUTRON_METERING_AGENT_INSTALL=n
CONFIG_HEAT_CFN_INSTALL=n

事前準備

実行環境としては、CentOS7 Minimalを使用する。

BOSH CLIダウンロード

BOSH CLIをこちらからダウンロードする。

https://bosh.io/docs/cli-v2.html

※最新版をダウンロードしてください

$ curl -OL https://s3.amazonaws.com/bosh-cli-artifacts/bosh-cli-3.0.1-linux-amd64
$ chmod +x ./bosh-cli-3.0.1-linux-amd64
$ sudo mv ./bosh-cli-3.0.1-linux-amd64 /usr/local/bin/bosh
$ bosh -v
version 3.0.1-712bfd7-2018-03-13T23:26:43Z

Succeeded

Yumパッケージインストール

各種パッケージのコンパイルに必要となるパッケージをインストールする。パッケージが不足している場合、後述のエラーが発生する。

依存パッケージはこちらにも記載あり。 https://bosh.io/docs/cli-env-deps.html

(BOSH Docs)
$ sudo yum install -y gcc gcc-c++ ruby ruby-devel mysql-devel postgresql-devel postgresql-libs sqlite-devel libxslt-devel libxml2-devel patch openssl
$ gem install yajl-ruby

(Option)
$ sudo yum install -y git libtool zlib-devel openssl-devel

Rubyのパッケージ不足のエラー対応はこちらが参考になりました。

blog.inouetakuya.info

こちらでも同様のやりとりがなされていた。

https://groups.google.com/a/cloudfoundry.org/forum/#!topic/bosh-dev/isJWhSqLSBY

OpenStack CLIもインストールしておく。

$ sudo yum install -y epel-release python-devel python-pip
$ sudo pip install pip --upgrade setuptools
$ sudo pip install python-openstackclient

BOSH Directorをデプロイする

以下の手順を実行してBOSH Directorをデプロイする。

ネットワーク構成

次のようなネットワークを作成しておく。詳細な内容はBOSHドキュメントに記載の通り。

Step 1: Prepare an OpenStack environment

f:id:daichi703n:20180311191945p:plain

セキュリティルールは以下の通り。ICMPなどは環境に合わせて追加する。

$ cat ./create_security_group.sh
#!/bin/sh
openstack security group create bosh
openstack security group rule create bosh --ingress --protocol tcp --dst-port 22:22 --remote-ip 0.0.0.0/0
openstack security group rule create bosh --ingress --protocol tcp --dst-port 6868:6868 --remote-ip 0.0.0.0/0
openstack security group rule create bosh --ingress --protocol tcp --dst-port 25555:25555 --remote-ip 0.0.0.0/0
openstack security group rule create bosh --egress --ethertype IPv4 --remote-ip 0.0.0.0/0
openstack security group rule create bosh --egress --ethertype IPv6 --remote-ip ::/0
openstack security group rule create bosh --ingress --protocol tcp --dst-port 1:65535 --remote-group bosh

bosh-deploymentをダウンロード

$ mkdir bosh && cd bosh
$ git init
$ git submodule add https://github.com/cloudfoundry/bosh-deployment

Gitサブモジュールとしてbosh-deploymentをダウンロードしておくと、オフィシャルのアップデートを追従しやすくなる。

auth_url, 認証情報を確認する

PackStackでOpenStackをインストールしたサーバのホームディレクトリにOpenStackのクレデンシャル(認証情報)が生成されている。

[root@openstack1 ~]# cat keystonerc_admin
unset OS_SERVICE_TOKEN
    export OS_USERNAME=admin
    export OS_PASSWORD='PASSWORD'
    export OS_AUTH_URL=http://192.168.1.202:5000/v3
    export PS1='[\u@\h \W(keystone_admin)]\$ '

export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_IDENTITY_API_VERSION=3

keystone API v2の場合はこちら https://bosh.io/docs/openstack-keystonev2.html

各パラメータは環境により異なりますが、記事内の一貫性を確保するためにそのまま記載しています。

デプロイコマンドをshellにしておく

引数を含めたコマンドは変更を追えるようにshellスクリプトファイルにしておくと便利。

$ touch deploy_bosh.sh
$ chmod +x ./deploy_bosh.sh

デプロイShellを編集する

$ vi deploy_bosh.sh
bosh create-env bosh-deployment/bosh.yml \
    --state=state.json \
    --vars-store=creds.yml \
    -o bosh-deployment/openstack/cpi.yml \
    -o bosh-deployment/external-ip-with-registry-not-recommended.yml \
    -v director_name=bosh-1 \
    -v internal_cidr=100.64.0.0/24 \
    -v internal_gw=100.64.0.1 \
    -v internal_ip=100.64.0.5 \
    -v external_ip=192.168.1.214 \
    -v auth_url=http://192.168.1.202:5000/v3 \
    -v az=nova \
    -v default_key_name=bosh \
    -v default_security_groups=[bosh] \
    -v net_id=1cdfa900-dfbb-4f95-8571-854bee863e69 \
    --vars-file=openstack_creds.yml \
    -v openstack_domain=Default \
    -v openstack_project=admin \
    -v private_key=../id_rsa_bosh.pem \
    -v region=RegionOne \
    -o operations_file/vm_size.yml \  #option
    -o operations_file/worker_instances.yml  #option

net_idはネットワーク名ではなく、IDで指定する必要あり。

OpenStackの認証情報は別ファイルに記載しておくと、Git管理する際に除外して流出を防げる。

$ cat openstack_creds.yml
openstack_username: admin
openstack_password: 'PASSWORD'

(オプション)また、デフォルトだとインスタンスのFlavorはm1.xlargeとなっているが、私の環境はリソース不足のため、オペレーションズファイルで設定を上書きする。これによりbosh-deployment/openstack/cpi.ymlに記載されている内容を上書きする。

$ cat operations_file/vm_size.yml
- type: replace
  path: /resource_pools/name=vms/cloud_properties?
  value:
    instance_type: m1.medium
    availability_zone: ((az))

あわせて、Workerのインスタンス数をデフォルトの4から1に減らしてリソース節約する。

$ cat ./operations_file/worker_instances.yml
- type: replace
  path: /instance_groups/name=bosh/properties/director/workers
  value: 1

デプロイする

デプロイShellを実行する。私の環境では90分以上かかった...。VMが小さいとruby_openstack_cpiコンパイルに時間がかかる...。

$ ./deploy_bosh.sh
Deployment manifest: '/root/bosh/bosh-deployment/bosh.yml'
Deployment state: 'state.json'

Started validating
  Downloading release 'bosh'... Finished (00:07:40)
  Validating release 'bosh'... Finished (00:00:01)
  Downloading release 'bosh-openstack-cpi'... Finished (00:00:05)
  Validating release 'bosh-openstack-cpi'... Finished (00:00:00)
  Validating cpi release... Finished (00:00:00)
  Validating deployment manifest... Finished (00:00:00)
  Downloading stemcell... Finished (00:30:56)
  Validating stemcell... Finished (00:00:04)
Finished validating (00:38:51)

Started installing CPI
  Compiling package 'ruby_openstack_cpi/ddb0f4a3013923fb1b074454d4314264c47d33c5'... Finished (00:00:00)
  Compiling package 'bosh_openstack_cpi/f4e7f49b87ef90a8c0186602cad189c00bd508ca'... Finished (00:00:00)
  Installing packages... Finished (00:00:03)
  Rendering job templates... Finished (00:00:00)
  Installing job 'openstack_cpi'... Finished (00:00:00)
Finished installing CPI (00:00:03)

Starting registry... Finished (00:00:00)
Uploading stemcell 'bosh-openstack-kvm-ubuntu-trusty-go_agent/3468.21'... Skipped [Stemcell already uploaded] (00:00:00)

Started deploying
  Creating VM for instance 'bosh/0' from stemcell '7c81c288-593b-4b3c-8d62-89037a5de635'... Finished (00:02:04)
  Waiting for the agent on VM '47382065-ac7e-4703-a7f6-edae677f46cf' to be ready... Finished (00:04:23)
  Creating disk... Finished (00:00:08)
  Attaching disk '29f04e0c-0f13-45d8-809f-525272023100' to VM '47382065-ac7e-4703-a7f6-edae677f46cf'... Finished (00:00:59)
  Rendering job templates... Finished (00:00:03)
  Compiling package 'ruby_openstack_cpi/ddb0f4a3013923fb1b074454d4314264c47d33c5'... Finished (01:37:04)
  Compiling package 'ruby-2.4-r3/8471dec5da9ecc321686b8990a5ad2cc84529254'... Skipped [Package already compiled] (00:00:02)
  Compiling package 'mysql/b7e73acc0bfe05f1c6cbfd97bf92d39b0d3155d5'... Skipped [Package already compiled] (00:00:02)
  Compiling package 'libpq/3afb51e921e950abb31e5d039d2144591a41482d'... Skipped [Package already compiled] (00:00:00)
  Compiling package 'postgres/3b1089109c074984577a0bac1b38018d7a2890ef'... Skipped [Package already compiled] (00:00:03)
  Compiling package 'bosh_openstack_cpi/f4e7f49b87ef90a8c0186602cad189c00bd508ca'... Finished (00:01:41)
  Compiling package 'registry/2231e6d61fb5a36afafad82ea6ff49f83334c9bb'... Skipped [Package already compiled] (00:00:05)
  Compiling package 'nginx/3518a530de39c41ec65abf1194c27aadae23b711'... Skipped [Package already compiled] (00:00:01)
  Compiling package 'bosh-gcscli/fce60f2d82653ea7e08c768f077c9c4a738d0c39'... Skipped [Package already compiled] (00:00:01)
  Compiling package 'postgres-9.4/52b3a31d7b0282d342aa7a0d62d8b419358c6b6b'... Skipped [Package already compiled] (00:00:02)
  Compiling package 'davcli/2672d0a96a775f5252fef6ac7bbab3928aa41599'... Skipped [Package already compiled] (00:00:00)
  Compiling package 'verify_multidigest/8fc5d654cebad7725c34bb08b3f60b912db7094a'... Skipped [Package already compiled] (00:00:00)
  Compiling package 'director/06635593362c742ed6027270d6fbe0ddd8439650'... Skipped [Package already compiled] (00:00:07)
  Compiling package 'gonats/866cdc573ac10dd85929abb531923197486ffa95'... Skipped [Package already compiled] (00:00:01)
  Compiling package 's3cli/b6e38c619dd5575e16ea9fcabc4b7c500effdd26'... Skipped [Package already compiled] (00:00:01)
  Compiling package 'health_monitor/81dd0f6b874d009696027d43282893df4c18b2c8'... Skipped [Package already compiled] (00:00:04)
  Updating instance 'bosh/0'... Finished (00:02:07)
  Waiting for instance 'bosh/0' to be running... Failed (01:07:13)
Failed deploying (02:56:28)

Stopping registry... Finished (00:00:00)
Cleaning up rendered CPI jobs... Finished (00:00:00)

Deploying:
  Received non-running job state: 'failing'

Exit code 1

最終的にエラーになっているが、次の通り接続確認ができた。

接続確認

boshコマンドでBOSH Directorにアクセスできることを確認する。以下のように結果が返って来ればOK。

$ bosh alias-env bosh -e 192.168.1.214 --ca-cert <(bosh int creds.yml --path /director_ssl/ca)
Using environment '192.168.1.214' as client 'admin'

Name      bosh-1
UUID      ca43266f-fee1-4627-a96c-f080cc2eab91
Version   264.7.0 (00000000)
CPI       openstack_cpi
Features  compiled_package_cache: disabled
          config_server: disabled
          dns: disabled
          snapshots: disabled
User      admin

Succeeded

BOSHでデプロイする

引き続き検証予定...

まとめ - OpenStackにBOSH環境を構築する

PackStackでインストールしたOpenStackにBOSH環境を構築した。リソース不足が顕著だが、どこまで使えるか引き続き検証を進める。


トラブルシューティング

private_key no such file or directory

private_keyは、デプロイするymlファイルを起点に指定する必要がある。今回はboshディレクトリに格納しているため、一つ上の階層としてファイルを指定する必要がある。

Deployment manifest: '/home/dev/bosh/bosh-deployment/bosh.yml'
Deployment state: 'state.json'

Started validating
Failed validating (00:00:02)

Parsing installation manifest '/home/dev/bosh/bosh-deployment/bosh.yml':
  Reading private key from /home/dev/bosh/bosh-deployment/bosh:
    Opening file /home/dev/bosh/bosh-deployment/bosh:
      open /home/dev/bosh/bosh-deployment/bosh: no such file or directory

Exit code 1

DISK容量不足

$ ./deploy_bosh.sh
Deployment manifest: '/home/dev/bosh/bosh-deployment/bosh.yml'
Deployment state: 'state.json'

Started validating
  Downloading release 'bosh'... Finished (00:07:51)
  Validating release 'bosh'... Finished (00:00:06)
  Downloading release 'bosh-openstack-cpi'... Finished (00:00:09)
  Validating release 'bosh-openstack-cpi'... Finished (00:00:02)
  Validating cpi release... Finished (00:00:00)
  Validating deployment manifest... Finished (00:00:02)
  Downloading stemcell...
 Finished (00:31:36)
  Validating stemcell... Failed (00:00:14)
Failed validating (00:40:03)

Extracting stemcell from '/home/dev/.bosh/downloads/301bb47087fe66403788c852a401f42006426be9-f08706560b67b50654998e46038b6adacc8a4b46':
  reading extracted stemcell manifest in '/home/dev/.bosh/installations/0a6fbed5-08af-4e7b-7e1f-27965a2522ac/tmp/stemcell-manager107784699':
    Extracting stemcell from '/home/dev/.bosh/downloads/301bb47087fe66403788c852a401f42006426be9-f08706560b67b50654998e46038b6adacc8a4b46' to '/home/dev/.bosh/installations/0a6fbed5-08af-4e7b-7e1f-27965a2522ac/tmp/stemcell-manager107784699':
      Shelling out to tar:
        Running command: 'tar --no-same-owner -xzf /home/dev/.bosh/downloads/301bb47087fe66403788c852a401f42006426be9-f08706560b67b50654998e46038b6adacc8a4b46 -C /home/dev/.bosh/installations/0a6fbed5-08af-4e7b-7e1f-27965a2522ac/tmp/stemcell-manager107784699', stdout: '', stderr: 'tar: image: 10240 バイトのうち、9216 バイトのみ書き込みました
tar: stemcell.MF: open 不能: デバイスに空き領域がありません
tar: stemcell_dpkg_l.txt: open 不能: デバイスに空き領域がありません
tar: 前のエラーにより失敗ステータスで終了します
':
          exit status 2

Exit code 1

対策: OpenStackホストのDISKを増やす。Cinderボリュームに空きがあってもrootの容量が上限としてリミットになるのでrootも増やす。

パッケージ不足

次のようなエラーが出る場合は記事中のYumインストールを確認する。なお、OpenStackを稼働させているサーバだとYumインストールしていても読み込みがうまくできないケースがある。回避策としては、別にBOSH Deployようサーバを用意する。

基本的にchecking xxx ...noとなっているパッケージを追加インストールする。

[root@openstack1 bosh]# ./deploy_bosh.sh
Deployment manifest: '/root/bosh/bosh-deployment/bosh.yml'
Deployment state: 'state.json'

Started validating
  Downloading release 'bosh'... Finished (00:07:40)
  Validating release 'bosh'... Finished (00:00:01)
  Downloading release 'bosh-openstack-cpi'... Finished (00:00:05)
  Validating release 'bosh-openstack-cpi'... Finished (00:00:00)
  Validating cpi release... Finished (00:00:00)
  Validating deployment manifest... Finished (00:00:00)
  Downloading stemcell... Finished (00:30:56)
  Validating stemcell... Finished (00:00:04)
Finished validating (00:38:51)

Started installing CPI
  Compiling package 'ruby_openstack_cpi/ddb0f4a3013923fb1b074454d4314264c47d33c5'... Failed (00:00:01)
Failed installing CPI (00:00:01)

Installing CPI:
  Compiling job package dependencies for installation:
    Compiling job package dependencies:
      Compiling package:
        Running command: 'bash -x packaging', stdout: 'Installing yaml
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for gcc... no
checking for cc... no
checking for cl.exe... no
', stderr: '+ set -e -x
...
+ ./configure --prefix=/root/.bosh/installations/05c8688b-3c66-4365-7a4a-d0d7eee3902c/packages/ruby_openstack_cpi --disable-shared
configure: error: in `/root/.bosh/installations/05c8688b-3c66-4365-7a4a-d0d7eee3902c/tmp/bosh-release-pkg026788788/yaml-0.1.7':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
':
          exit status 1

Exit code 1
[root@openstack1 bosh]#
+ echo 'Installing rubygems'
+ tar zxvf ruby_openstack_cpi/rubygems-2.7.3.tar.gz
+ pushd rubygems-2.7.3
+ /root/.bosh/installations/05c8688b-3c66-4365-7a4a-d0d7eee3902c/packages/ruby_openstack_cpi/bin/ruby setup.rb
/root/.bosh/installations/05c8688b-3c66-4365-7a4a-d0d7eee3902c/tmp/bosh-release-pkg077630227/rubygems-2.7.3/lib/rubygems/core_ext/kernel_require.rb:59:in `require': cannot load such file -- zlib (LoadError)
creating stemcell (bosh-openstack-kvm-ubuntu-trusty-go_agent 3468.21):
  Executing external CPI command: '/root/.bosh/installations/05c8688b-3c66-4365-7a4a-d0d7eee3902c/jobs/openstack_cpi/bin/cpi':
    Running command: '/root/.bosh/installations/05c8688b-3c66-4365-7a4a-d0d7eee3902c/jobs/openstack_cpi/bin/cpi', stdout: 'bundler: failed to load command: /root/.bosh/installations/05c8688b-3c66-4365-7a4a-d0d7eee3902c/packages/bosh_openstack_cpi/bin/openstack_cpi (/root/.bosh/installations/05c8688b-3c66-4365-7a4a-d0d7eee3902c/packages/bosh_openstack_cpi/bin/openstack_cpi)
', stderr: 'LoadError: cannot load such file -- openssl

プロセス多重起動?

Waiting for instance 'bosh/0' to be running... が完了しないためインスタンスSSHして確認したところ、同一プロセスが複数起動しているように見えた。CPU処理が競合して非効率に思えたので、一つを残してkillした。影響は不明。

$ ssh vcap@192.168.1.214 -i ./id_rsa_bosh.pem
bosh/0:~$ ps auxf
<snip>
root     21166  0.0  0.0  19616  3308 ?        S<   06:12   0:00 /bin/bash /var/vcap/jobs/director/bin/director_ctl start
vcap     21251 11.3  1.1 142288 47684 ?        R<l  06:14   2:06  \_ ruby /var/vcap/packages/director/bin/bosh-director-migrate -c /var/vcap/jobs/director/config/director.yml
root     21238  0.0  0.0  19616  3316 ?        S<   06:14   0:00 /bin/bash /var/vcap/jobs/director/bin/director_ctl start
vcap     21318 11.3  1.1 140184 45452 ?        R<l  06:15   1:57  \_ ruby /var/vcap/packages/director/bin/bosh-director-migrate -c /var/vcap/jobs/director/config/director.yml
root     21335  0.0  0.0  19616  3372 ?        S<   06:15   0:00 /bin/bash /var/vcap/jobs/director/bin/director_ctl start
vcap     21402 11.3  1.0 136236 43620 ?        R<l  06:17   1:47  \_ ruby /var/vcap/packages/director/bin/bosh-director-migrate -c /var/vcap/jobs/director/config/director.yml
vcap     21357 10.5  0.9 132160 39820 ?        R<l  06:16   1:44 ruby /var/vcap/packages/director/bin/bosh-director-worker -c /var/vcap/jobs/director/config/worker_1.yml -i 1

bosh/0:~$ kill -9 21402 21318