Cloud Foundry Advent Calender 2018 の23日目
BOSH-LiteをVirtualBoxでローカル環境に構築する手順は各所で説明されている。その場合、BOSHオフィシャルにも記載されている通りホストOSから各種操作をすることが基本となっている。ただ、メインのPCでBOSH-Liteを稼働させると、リソース消費が大きく他の作業への影響があったり、PCを停止させた場合に再度BOSHの起動作業が必要となったり面倒である。また、Cloud Foundryなどを構築しても環境を共有できず、アプリを公開できない。
そのため、リモートサーバ上で、VirtualBoxのネットワーク構成を変更してBOSH-Lite Directorにリモート接続できる環境を構築した。
ハードウェア
物理サーバ:DELL PowerEdge T110 II, XeonE3 1220, RAM 24GB
ホストOS:CentOS7.5(vSphere VM) , 1vCPU(4コア), RAM 8GB
PC:MacBookAir 2018, RAM 8GB
前提環境
基本的な流れと前提環境はオフィシャルに記載の通り。
Quick Start - Cloud Foundry BOSH
VirtualBox - Cloud Foundry BOSH
VirtualBoxのネットワークをブリッジに変更する
オフィシャルの手順だと、次のようにホストオンリーアダプタ(vboxnet0)+NATネットワーク(NatNetwork)の構成でBOSH Directorを構築する。
ここで問題となるのは、リモート環境からホストオンリーアダプターの先のVMへの接続をどうするか。後述のNG例に記載した通り、ポートフォワーディング・ルーティングのいずれの方法でもこの問題を解消できない。
そこで、ネットワーク構成を変更し、VirtualBoxのブリッジアダプターの接続方式により、ホストOSのNICを共有し外部NWに直接接続する構成とする。
オフィシャルの対応状況
上記ブリッジ接続だが、2018/12月現在オフィシャルではサポートされていない。次のBranchがマージされれば使用可能となるのだが、放置されているように見える...
ドキュメントを用意した人もいる。
しかしマージされておらず、当然Releaseファイルも更新されていない...
cloneしてReleaseを作成する
既にbridgedのブランチで機能追加はされているので、単純にチェックアウトしてbosh create release
する。
git clone
> git checkout -b bridged remote/origin/bridged
> blob更新 > config/final.yml
,config/private.yml
調整 > bosh create release --final ...
BOSH Releaseの作成方法はこちらの通り。
Creating a Release - Cloud Foundry BOSH
BOSH-Lite Directorをデプロイする
作成したReleaseファイルを使用してBOSH-Lite Directorをデプロイする。BOSH-Lite DirectorのデプロイはVirtualBoxが稼働しているホストOSで実施する。
Operations fileでCPIを置き換え、ブリッジアダプターを使用するようにする。
※下記URLはそのまま使用可能ですが、今後公開停止するかもしれませんのでご了承ください。
ops-files/virtualbox-bridged-network.yml
- type: remove path: /releases/name=bosh-virtualbox-cpi - type: replace path: /releases/- value: name: bosh-virtualbox-cpi version: "0.0.13" url: https://s3-ap-northeast-1.amazonaws.com/d703n-bosh-virtualbox-blobs/bosh-virtualbox-cpi-release-0.0.13-bridged.tgz sha1: beaf2ff627663f7df6a8730c96caf6fd7c0c57bd - type: replace path: /networks/name=default/subnets/0/cloud_properties? value: type: bridged name: ((network_device)) - type: replace path: /networks/name=default/subnets/0/dns value: [((dns_servers))]
network_device, IPアドレスは環境に合わせて要変更。
deploy-bosh.sh
bosh create-env ~/workspace/bosh-deployment/bosh.yml \ --state ./state.json \ -o ~/workspace/bosh-deployment/virtualbox/cpi.yml \ -o ~/workspace/bosh-deployment/bosh-lite.yml \ -o ~/workspace/bosh-deployment/uaa.yml \ -o ~/workspace/bosh-deployment/credhub.yml \ -o ~/workspace/bosh-deployment/jumpbox-user.yml \ --vars-store ./creds.yml \ -o ops-files/virtualbox-bridged-network.yml \ -v director_name=bosh-lite \ -v network_device=ens192 \ -v internal_ip=192.168.1.222 \ -v internal_gw=192.168.1.5 \ -v internal_cidr=192.168.1.0/24 \ -v dns_servers=192.168.1.77
デプロイする。
$ ./deploy-bosh.sh Deployment manifest: '/home/dev/workspace/bosh-deployment/bosh.yml' Deployment state: './state.json' Started validating Downloading release 'bosh'... Started installing CPI Compiling package 'golang-1.8-linux/c97f9a00c26b34a3f59ca15b0f5a079d7f7e27c334cc8100248143c5dc0d4c0a'... Starting registry... Finished (00:00:00) Uploading stemcell 'bosh-vsphere-esxi-ubuntu-xenial-go_agent/170.9'... Finished (00:00:24) Started deploying Creating VM for instance 'bosh/0' from stemcell 'sc-261d9c63-8431-41e5-6396-0068ab24cfdf'... Finished deploying (00:10:06) Stopping registry... Finished (00:00:00) Cleaning up rendered CPI jobs... Finished (00:00:00) Succeeded
リモートからBOSH Directorに接続する
ここからリモート作業が可能となる。ログインに必要となるcreds.yml
を手元にコピーし、次のように環境変数として読み込むようにする。
#BOSH-Lite export BOSH_ENVIRONMENT=192.168.1.222 export BOSH_CA_CERT=`bosh int ~/project/bosh-deployment/creds.yml --path /director_ssl/ca` export BOSH_CLIENT=admin export BOSH_CLIENT_SECRET=`bosh int ~/project/bosh-deployment/creds.yml --path /admin_password`
環境変数を読み込んだ上でbosh vms
などのコマンドの応答があれば接続成功。
$ bosh vms Using environment '192.168.1.222' as client 'admin' Succeeded
Nginx BOSH Releaseをデプロイする
環境が構築できたので、BOSH Releaseをデプロイしてみる。シンプルなNginxをデプロイする。(https://github.com/cloudfoundry-community/nginx-release)
準備としてStemcellとCloud Configをアップロードし、Nginx BOSH Releaseをダウンロードする。
bosh upload-stemcell https://bosh.io/d/stemcells/bosh-warden-boshlite-ubuntu-trusty-go_agent bosh update-cloud-config ~/project/bosh-deployment/warden/cloud-config.yml git submodule add https://github.com/cloudfoundry-community/nginx-release
環境調整のためのOps-fileを作成する。
ops-files/nginx-options.yml
- type: replace path: /releases/name=nginx/url? value: https://github.com/cloudfoundry-community/nginx-release/releases/download/1.13.12/nginx-release-1.13.12.tgz - type: replace path: /releases/name=nginx/sha1? value: c5d767f43a68b89d9603bccac2a60b6a5dc29836 - type: remove path: /instance_groups/name=nginx/networks/name=default/static_ips
デプロイコマンド
deploy-nginx.sh
bosh deploy -d nginx nginx-release/manifests/nginx-lite.yml \ -o ops-files/nginx-options.yml
デプロイする。
$ ./deploy-nginx.sh Using environment '192.168.1.222' as client 'admin' Using deployment 'nginx' Task 2 Task 2 | 17:03:23 | Downloading remote release: Downloading remote release (00:00:04) Task 2 | ... Task 2 done + azs: + - name: z1 ... Continue? [yN]: y Task 3 Task 3 | 17:03:47 | Preparing deployment: Preparing deployment (00:00:01) Task 3 | 17:03:48 | Preparing package compilation: Finding packages to compile (00:00:00) Task 3 | 17:03:48 | Compiling packages: nginx/23c0391f6bb6630cf68ba02c99f93eabdd65839d (00:02:27) Task 3 | 17:06:17 | Creating missing vms: nginx/bd0e9a7f-6aeb-45e0-b5cf-8647c55bd7c7 (0) (00:00:13) Task 3 | 17:06:31 | Updating instance nginx: nginx/bd0e9a7f-6aeb-45e0-b5cf-8647c55bd7c7 (0) (canary) (00:00:24) Task 3 Started Sun Dec 23 17:03:47 UTC 2018 Task 3 Finished Sun Dec 23 17:06:55 UTC 2018 Task 3 Duration 00:03:08 Task 3 done Succeeded $ bosh vms Using environment '192.168.1.222' as client 'admin' Task 4. Done Deployment 'nginx' Instance Process State AZ IPs VM CID VM Type Active nginx/bd0e9a7f-6aeb-45e0-b5cf-8647c55bd7c7 running z1 10.244.0.2 b290ee7a-fa28-4232-500c-54422c6f3eab default true 1 vms Succeeded
アクセス確認する
リモート環境からBOSH環境へアクセスするためにルーティングを追加する必要がある。Macの場合以下の通りルートを追加する。(再起動するとリセットされるため注意)
複数人で共有する場合はデフォルトゲートウェイとなっているルータにスタティックルートを追加しておくと良い。
sudo route add -net 10.244.0.0/16 192.168.1.222
$ curl http://10.244.0.2 <html><head><title>BOSH on IPv6</title> </head><body> <h2>Welcome to BOSH's nginx Release</h2> <h2> My hostname/IP: <b>10.244.0.2</b><br /> Your IP: <b>192.168.1.126</b> </h2> </body></html>
問題なくアクセスできた。
まとめ - BOSH-Lite in VirtualBoxでブリッジアダプターを使用しリモート接続する
bosh-virtualbox-cpi-releaseを拡張し、VirtualBox Bridged Adaptorを使用することにより、リモートからBOSH-Lite環境にアクセスできるようにした。BOSH-Liteをリモートサーバ上で稼働させることにより、作業用PCの停止やリソースなどの影響なく、BOSH Releaseの開発から動作確認までを実施できる。
また、検証用途に限るが、そのままチームへの公開環境として使用することもできる。
NG方法
以下の方法を試してみたが、期待動作とならなかった。
VirtualBoxポートフォワーディング
ホストOS:192.168.1.83
ゲストOS(BOSH Director):192.168.50.6
ポートフォワーディング:192.168.1.83:25555 -> 192.168.50.6:25555
VirtualBoxでポートフォワーディングをするだけでは、以下の通り証明書のエラーで接続できない。
$ bosh vms Fetching info: Performing request GET 'https://192.168.1.83:25555/info': Performing GET request: Retry: Get https://192.168.1.83:25555/info: x509: certificate is valid for 192.168.50.6, not 192.168.1.83 Exit code 1
なお、証明書検証を無効にすれば良いと考えても、残念ながらBOSH CLIv2では証明書の検証が必須となっている。
ホストOSでルーティング
手元のPCでBOSH Directorが所属するサブネット(ホストオンリーアダプター)宛のスタティックルートを設定する。
$ sudo route add -net 192.168.50.6/32 192.168.1.83 Password: add net 192.168.50.6: gateway 192.168.1.83
追加された。
$ netstat -nr Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 192.168.1.5 UGSc 165 0 en0 127 127.0.0.1 UCS 0 0 lo0 127.0.0.1 127.0.0.1 UH 1 1750 lo0 ... 192.168.1.83 x:x:x:xx:xx:xx UHLWIi 2 899 en0 1074 ... 192.168.50.6/32 192.168.1.83 UGSc 0 0 en0 ... 255.255.255.255/32 link#9 UCS 0 0 en0 !
BOSH Directorにもルート追加して戻りパケットがNatNetworkとならないようにする。
$ bosh int creds.yml --path /jumpbox_ssh/private_key > jumpbox.key $ chmod 600 jumpbox.key $ ssh jumpbox@192.168.50.6 -i jumpbox.key bosh/0:~# ip r default via 10.0.2.1 dev eth0 10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.4 192.168.50.0/24 dev eth1 proto kernel scope link src 192.168.50.6 bosh/0:~# route add -net 192.168.1.0/24 dev eth1 gw 192.168.50.1 bosh/0:~# ip r default via 10.0.2.1 dev eth0 10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.4 192.168.1.0/24 via 192.168.50.1 dev eth1 192.168.50.0/24 dev eth1 proto kernel scope link src 192.168.50.6
上記設定の場合、Pingは通るが、TCPの通信ができない。こちらで議論されている通り、ホストオンリーアダプターではルーティングがされない仕様になっているらしい。(Pingが通るのは不思議だが...)
BOSHゲストはブリッジ接続不可
BOSH-LiteではWarden VMでゲストOSを作成し、ゲストのネットワークはVBoxのブリッジアダプターまで延伸できない。
Cloud Configでのネットワークの設定が誤っていると、VMの通信ができずデプロイエラーになる。
Task 6 Task 6 | 18:30:53 | Preparing deployment: Preparing deployment (00:00:01) Task 6 | 18:30:54 | Preparing package compilation: Finding packages to compile (00:00:00) Task 6 | 18:30:54 | Compiling packages: nginx/23c0391f6bb6630cf68ba02c99f93eabdd65839d (00:10:48) L Error: Timed out pinging to 38b8f90b-395b-40d0-8610-ca3de241a0bd after 600 seconds Task 6 | 18:41:42 | Error: Timed out pinging to 38b8f90b-395b-40d0-8610-ca3de241a0bd after 600 seconds Task 6 Started Fri Dec 21 18:30:53 UTC 2018 Task 6 Finished Fri Dec 21 18:41:42 UTC 2018 Task 6 Duration 00:10:49 Task 6 error Updating deployment: Expected task '6' to succeed but state is 'error' Exit code 1