目次
- bosh-bootloaderとは
- ツールのインストール
- AWSでbosh-bootloader
- GCPでbosh-bootloader
- 環境の削除
- bosh-bootloaderでIaaS設定のみ行う
- 参考資料
bosh-bootloaderとは
BOSHを使ったソフトウェアのデプロイは基本的に以下の手順になります。
- IaaS環境セットアップ
- BOSH Directorのデプロイ(
bosh-init
, CLI v2の場合はbosh create-env
) - 対象のソフトウェア/クラスタのデプロイ (
bosh deploy
)
このうち、1.と2.は初回だけ行えば良いのですが、ここをまとめてやってくれるのがbosh-bootloaderです。
bosh-bootloaderは現時点で
- AWS
- GCP
に対応しています。
ツールのインストール
bosh-bootloaderを使うには
bbl
bosh
v2terraform
のインストールが必要です。
bosh-bootloaderのインストール
wget https://github.com/cloudfoundry/bosh-bootloader/releases/download/v4.0.0/bbl-v4.0.0_osx
install bbl-v4.0.0_osx /usr/local/bin/bbl
本稿で扱うbbl
のバージョンは4.0.0
です。
$ bbl version
bbl 4.0.0 (darwin/amd64)
BOSH CLIのインストール
wget https://s3.amazonaws.com/bosh-cli-artifacts/bosh-cli-2.0.28-darwin-amd64
install bosh-cli-2.0.28-darwin-amd64 /usr/local/bin/bosh
本稿で扱うbosh
のバージョンは2.0.28
です。(2.0.24
以上が必須です)
$ bosh -v
version 2.0.28-cb77557-2017-07-11T23:04:15Z
Succeeded
terraformのインストール
wget https://releases.hashicorp.com/terraform/0.9.11/terraform_0.9.11_darwin_amd64.zip
unzip terraform_0.9.11_darwin_amd64.zip
install terraform /usr/local/bin/terraform
本稿で扱うbosh
のバージョンは0.9.11
です。(0.9.7
以上が必須です)
$ terraform -v
Terraform v0.9.11
AWSでbosh-bootloader
基本的はgetting-started-aws.mdの通り。
bbl
用のIAM作成
mkdir ~/bbl
cd ~/bbl
policy=`cat <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:*",
"cloudformation:*",
"elasticloadbalancing:*",
"route53:*",
"iam:*",
"logs:*",
"kms:*"
],
"Resource": [
"*"
]
}
]
}
EOF`
aws iam create-user --user-name "bbl-user"
aws iam put-user-policy --user-name "bbl-user" \
--policy-name "bbl-policy" \
--policy-document "$policy"
aws iam create-access-key --user-name "bbl-user" > access-key.json
bbl
実行
export BBL_IAAS=aws
export BBL_AWS_ACCESS_KEY_ID=`jq -r .AccessKey.AccessKeyId access-key.json `
export BBL_AWS_SECRET_ACCESS_KEY=`jq -r .AccessKey.SecretAccessKey access-key.json `
export BBL_AWS_REGION=ap-northeast-1
bbl up
ログは
step: checking if keypair "keypair-bbl-env-vanern-2017-07-30t09-13z" exists
step: creating keypair
step: validating whether stack needs to be migrated
step: generating terraform template
step: applied terraform template
step: creating bosh director
Deployment manifest: '/var/folders/15/fww24j3d7pg9sz196cxv_6xm4nvlh8/T/806931787/manifest.yml'
Deployment state: '/var/folders/15/fww24j3d7pg9sz196cxv_6xm4nvlh8/T/806931787/state.json'
Started validating
Downloading release 'bosh'... Finished (00:00:43)
Validating release 'bosh'... Finished (00:00:00)
Downloading release 'bosh-aws-cpi'... Finished (00:00:20)
Validating release 'bosh-aws-cpi'... Finished (00:00:00)
Downloading release 'os-conf'... Finished (00:00:01)
Validating release 'os-conf'... Finished (00:00:00)
Validating cpi release... Finished (00:00:00)
Validating deployment manifest... Finished (00:00:00)
Downloading stemcell... Finished (00:00:06)
Validating stemcell... Finished (00:00:00)
Finished validating (00:01:13)
Started installing CPI
Compiling package 'ruby_aws_cpi/c6ba8a1e1b53b94ee9caf13d2d749c40cecfa038'... Finished (00:02:15)
Compiling package 'bosh_aws_cpi/137cfc70652337ff1d3fca795e6d9ddd6e7e68dd'... Finished (00:00:02)
Installing packages... Finished (00:00:00)
Rendering job templates... Finished (00:00:00)
Installing job 'aws_cpi'... Finished (00:00:00)
Finished installing CPI (00:02:19)
Starting registry... Finished (00:00:00)
Uploading stemcell 'bosh-aws-xen-hvm-ubuntu-trusty-go_agent/3421.9'... Finished (00:00:16)
Started deploying
Creating VM for instance 'bosh/0' from stemcell 'ami-b8faefdf light'... Finished (00:00:29)
Waiting for the agent on VM 'i-065d2b9cfcbcd14d2' to be ready... Finished (00:00:35)
Creating disk... Finished (00:00:13)
Attaching disk 'vol-08de572130113912e' to VM 'i-065d2b9cfcbcd14d2'... Finished (00:00:20)
Rendering job templates... Finished (00:00:04)
Compiling package 'ruby/c1086875b047d112e46756dcb63d8f19e63b3ac4'... Skipped [Package already compiled] (00:00:01)
Compiling package 'mysql/b7e73acc0bfe05f1c6cbfd97bf92d39b0d3155d5'... Skipped [Package already compiled] (00:00:00)
Compiling package 'libpq/661f5817afe24fa2f18946d2757bff63246b1d0d'... Skipped [Package already compiled] (00:00:00)
Compiling package 'ruby_aws_cpi/c6ba8a1e1b53b94ee9caf13d2d749c40cecfa038'... Finished (00:01:56)
Compiling package 'nats/63ae42eb73527625307ff522fb402832b407321d'... Skipped [Package already compiled] (00:00:01)
Compiling package 'registry/d81865cf0ad85fd79cb19aeb565bf622f2a17a83'... Skipped [Package already compiled] (00:00:03)
Compiling package 'director/e9cd35786422e87bd0571a4423bc947e50fe97e6'... Skipped [Package already compiled] (00:00:03)
Compiling package 'davcli/5f08f8d5ab3addd0e11171f739f072b107b30b8c'... Skipped [Package already compiled] (00:00:00)
Compiling package 'postgres-9.4/ded764a075ae7513d4718b7cf200642fdbf81ae4'... Skipped [Package already compiled] (00:00:01)
Compiling package 'health_monitor/e9317b2ad349f019e69261558afa587537f06f25'... Skipped [Package already compiled] (00:00:03)
Compiling package 's3cli/bb1c1976d221fdadf13a6bc873896cd5e2433580'... Skipped [Package already compiled] (00:00:00)
Compiling package 'bosh_aws_cpi/137cfc70652337ff1d3fca795e6d9ddd6e7e68dd'... Finished (00:00:02)
Compiling package 'verify_multidigest/8fc5d654cebad7725c34bb08b3f60b912db7094a'... Skipped [Package already compiled] (00:00:00)
Compiling package 'nginx/2ec2f63293bf6f544e95969bf5e5242bc226a800'... Skipped [Package already compiled] (00:00:00)
Compiling package 'postgres/3b1089109c074984577a0bac1b38018d7a2890ef'... Skipped [Package already compiled] (00:00:00)
Updating instance 'bosh/0'... Finished (00:00:15)
Waiting for instance 'bosh/0' to be running... Finished (00:00:10)
Running the post-start scripts 'bosh/0'... Finished (00:00:00)
Finished deploying (00:04:31)
Stopping registry... Finished (00:00:00)
Cleaning up rendered CPI jobs... Finished (00:00:00)
Succeeded
step: created bosh director
step: generating cloud config
step: applying cloud config
- VPC
- Subnets
- Route Tables
- Security Groups
- EIP
- EC2 (NAT VM / BOSH VM)
が自動で作成されます。
BOSH CLIに設定を反映
export BOSH_ENVIRONMENT=`bbl director-address`
export BOSH_CLIENT=`bbl director-username`
export BOSH_CLIENT_SECRET=`bbl director-password`
export BOSH_CA_CERT=`bbl director-ca-cert`
bosh log-in
これでBOSHのセットアップ(手順の1., 2.)が完了です。
Directorには、bbl
で作られた環境情報がCloud Configに設定済みです
$ bosh cloud-config
最新のStemcellをアップロードしておきます。
bosh upload-stemcell https://bosh.io/d/stemcells/bosh-aws-xen-hvm-ubuntu-trusty-go_agent
ロードバランサの作成
bbl
でIaaSのロードバランサを作成することもできます。
LBの種類は
concourse
cf
の2種類がサポートされています。
前者はConcourseで利用される想定のロードバランサで、HTTP(80), HTTPS(4443)で受付けて8080にフォワード, TCP(2222)で受付けて2222にフォワードするLB一つ作成されます。Concourse以外でも、8080でHTTPを受付ているアプリケーションをデプロイしたい場合には利用可能です。
後者はCloud Foundryで利用される想定のロードバランサで、GoRouter, TCP Router, SSH Proxy用のLB3つができます。
Concourse用途のLB
bbl create-lbs --type concourse --key <YOUR-key.pem> --cert <YOUR-cert.pem>
Concourse用途のロードバランサ(ELB)のリスナーは次のような設定になります。
Cloud Configもアップデートされます。vm_extensions:
に次の内容が設定されます。
$ bosh cloud-config | grep elb -B 1 -A 5
- cloud_properties:
elbs:
- bbl-env-va-05b9c6c-concourse-lb
security_groups:
- sg-27008f41
- sg-fb038c9d
name: lb
ここまでできるとBOSHでソフトウェアのデプロイが可能です。次のサンプルアプリをデプロイしましょう。
sample.yml
に次の内容を設定してください。
---
name: hello-legacy-tomcat
releases:
- name: hello-legacy-tomcat
version: 0.2
url: https://github.com/making-dev/hello-legacy-tomcat-boshrelease/releases/download/0.2/hello-legacy-tomcat-0.2.tgz
sha1: a401254722d4b032f0170b1d17ca3546fd611524
stemcells:
- alias: ubuntu
os: ubuntu-trusty
version: latest
update:
canaries: 2
max_in_flight: 1
canary_watch_time: 5000-60000
update_watch_time: 5000-60000
instance_groups:
- name: hello-legacy-tomcat
azs: [z1]
instances: 1
jobs:
- name: hello-legacy-tomcat
release: hello-legacy-tomcat
properties: {}
vm_type: t2.small
stemcell: ubuntu
persistent_disk_type: default
networks:
- name: private
vm_extensions:
- lb
bosh deploy
でデプロイ
bosh -n deploy -d hello-legacy-tomcat sample.yml
デプロイされたらbosh vms
で状態を確認できます。
$ bosh vms
Task 5. Done
Deployment 'hello-legacy-tomcat'
Instance Process State AZ IPs VM CID VM Type
hello-legacy-tomcat/c0060931-d188-4df6-b843-4b5bcf07f7a8 running z1 10.0.16.4 i-04eaa581f98467111 t2.small
1 vm
ELB経由で8080番にアクセスできます。
$ curl http://<elbのprefix>.ap-northeast-1.elb.amazonaws.com
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
Cloud Foundry用途のLB
bbl create-lbs --type cf --key <YOUR-key.pem> --cert <YOUR-cert.pem>
次のように3つのELBが作成されます。
GCPでbosh-bootloader
後日書く。
環境の削除
bbl destroy
で作成した環境を削除できます。
bosh-bootloaderでIaaS設定のみ行う
bosh-bootloaderは便利ですが、BOSH Directorの設定は自分で行いたい場合があります。
特にBOSH CLI v2からはbosh-deploymentとbosh create-env
で簡単にBOSH Director VMを作成でき、UAA連携、CredHub連携など拡張ポイントがあります。VM typeの選択もしたいです。
bosh-bootloaderではIaaSの設定だけで止めるオプションがあります。手順1.だけbosh-bootloaderで行い、手順2はbosh create-env
で行う形です。
Advanced BOSH Configurationに書かれています。
bbl up --no-director
この場合は、Director VMは作成されません。bosh-deployment-vars
でbosh create-env
に必要な情報を取得できます。
$ bbl bosh-deployment-vars
internal_cidr: 10.0.0.0/24
internal_gw: 10.0.0.1
internal_ip: 10.0.0.6
director_name: bosh-bbl-env-vanern-2017-07-30t11-02z
external_ip: xxx.yyy.zzz.www
az: ap-northeast-1c
subnet_id: subnet-866e4ede
access_key_id: xxxxxxxxxxxxxxxx
secret_access_key: yyyyyyyyyyyyyyyyy
iam_instance_profile: terraform-005e1c7e8182cd3d46208a6399
default_key_name: keypair-bbl-env-vanern-2017-07-30t11-02z
default_security_groups: [sg-c4109fa2]
region: ap-northeast-1
private_key: |-
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
bosh create-env
でDirectorのセットアップ
Directorは標準的なbosh-deploymentで作成します。
git clone https://github.com/cloudfoundry/bosh-deployment.git deploy
AWSの場合、
bosh create-env deploy/bosh.yml \
--state ./state.json \
-o deploy/aws/cpi.yml \
-o deploy/external-ip-with-registry-not-recommended.yml \
--vars-store ./creds.yml \
-l <(bbl bosh-deployment-vars)
でDirectorをセットアップできます。非推奨ではありますが、Directorに直接Public IPを設定するためにexternal-ip-with-registry-not-recommended.yml
も指定します。
せっかくなのでDirectorのVMサイズを変更してみます。次のようなYAMLファイルを作成します。
director-size.yml
- type: replace
path: /resource_pools/name=vms/cloud_properties/instance_type
value: t2.small
このファイルをbosh create-env
の引数に追加します。
bosh create-env deploy/bosh.yml \
--state ./state.json \
-o deploy/aws/cpi.yml \
-o deploy/external-ip-with-registry-not-recommended.yml \
-o director-size.yml \
--vars-store ./creds.yml \
-l <(bbl bosh-deployment-vars)
t2.small
になっていることがわかります。
BOSH Directorの設定、及びCloud Configの設定は次のようになります。
export BOSH_ENVIRONMENT=`bosh int --path /external_ip <(bbl bosh-deployment-vars)`
export BOSH_CLIENT=admin
export BOSH_CLIENT_SECRET=`bosh int creds.yml --path /admin_password`
export BOSH_CA_CERT=`bosh int creds.yml --path /director_ssl/ca`
bosh -n update-cloud-config <(bbl cloud-config)
UAAの追加
bosh create-env
の引数にUAA用のファイルを追加して実行します。
bosh create-env deploy/bosh.yml \
--state ./state.json \
-o deploy/aws/cpi.yml \
-o deploy/uaa.yml \
-o deploy/external-ip-with-registry-not-recommended.yml \
-o deploy/external-ip-not-recommended-uaa.yml \
-o director-size.yml \
--vars-store ./creds.yml \
-l <(bbl bosh-deployment-vars)
BOSH Directorの設定、及びCloud Configの設定は次のようになります(再掲)。
export BOSH_ENVIRONMENT=`bosh int --path /external_ip <(bbl bosh-deployment-vars)`
export BOSH_CLIENT=admin
export BOSH_CLIENT_SECRET=`bosh int creds.yml --path /admin_password`
export BOSH_CA_CERT=`bosh int creds.yml --path /director_ssl/ca`
bosh -n update-cloud-config <(bbl cloud-config)
次のように
--ops-file
オプションでBOSH CLIのように差分だけ適用してBOSHのデプロイをカスタマイズすることもできます。bbl up --ops-file ./bosh-deployment/uaa.yml
CredHubの追加
まずはSecurity GroupにUAAアクセス用の8844ポート許可を追加します。
AWSの場合、
aws ec2 authorize-security-group-ingress --group-id $SECURITY_GROUP --protocol tcp --port 8844 --cidr 0.0.0.0/0
CredHubの設定も同じようにできますが、bosh-deployment
に外部からCredHubにアクセスするためのexternal-ip-not-recommended-credhub.yml
は用意されていないので、次のファイルを自分で作成します。
- type: replace
path: /variables/name=credhub_tls/options/alternative_names/-
value: ((external_ip))
- type: replace
path: /instance_groups/name=bosh/jobs/name=credhub/properties/credhub/authentication/uaa/url
value: "https://((external_ip)):8443"
それからbosh create-env
の引数にCredHub用のファイルを追加して実行します。
bosh create-env deploy/bosh.yml \
-o deploy/aws/cpi.yml \
-o deploy/uaa.yml \
-o deploy/credhub.yml \
-o deploy/external-ip-with-registry-not-recommended.yml \
-o deploy/external-ip-not-recommended-uaa.yml \
-o external-ip-not-recommended-credhub.yml \
-o director-size.yml \
--vars-store ./creds.yml \
-l <(bbl bosh-deployment-vars)
CredHubには次のコマンドでログインできます。
bosh int ./creds.yml --path /uaa_ssl/ca > ~/uaa_ca
bosh int ./creds.yml --path /credhub_ca/ca > ~/credhub_ca
credhub login -s `bosh int --path /external_ip <(bbl bosh-deployment-vars)`:8844 -u credhub-cli -p `bosh int creds.yml --path /credhub_cli_password` --ca-cert ~/uaa_ca --ca-cert ~/credhub_ca
参考資料
CF Summit 2017の次のセッションが参考になります。