designetwork

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

BOSH-Lite in VirtualBoxでブリッジアダプターを使用しリモート接続する

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がマージされれば使用可能となるのだが、放置されているように見える...

github.com

ドキュメントを用意した人もいる。

github.com

しかしマージされておらず、当然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では証明書の検証が必須となっている。

stackoverflow.com

ホスト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が通るのは不思議だが...)

superuser.com

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