boshで始めるimmutable infrastructure
DESCRIPTION
分散環境の構築に特化した環境構成ツールBOSHをつかってImmutable Infrastructureを実践するには。TRANSCRIPT
BOSHで始める
Immutable Infrastructure
岩嵜 雄大 @ i_yudai
NTT Laboratory
Software Innovation Center
2013-11-29
Twitter: https://twitter.com/i_yudai
Cloud Foundryの運用面を主に担当
– Nise BOSH – cf_nise_installer – cf_aio_installer – 現在はBOSHのCloudStack対応を主に担当
自己紹介
Immutable Infrastructureの概要
– BlueGreen Deployment
BOSHが可能にしてくれること
Cloud Foundryとの違い
BOSHの課題
発表の内容
3
Immutable Infrastructureの概要
動いている環境はそのままに 新しい環境に切り替えよう
既存環境
既存の環境を
壊さないように
新機能はそっと乗せる
昔の更新作業
既存の機能
新しい機能
差分更新と新規構築で別手順が必要 環境ごとに必死にテストをして最後はお祈り
継ぎ足し継ぎ足し作られた秘伝の環境はしばしば爆発する
既存環境
既存環境を壊さないように
環境構成ツールが気を使っ
てくれるようになった
最近の更新作業
既存の機能
新しい機能
構築手順も一本化された Chef、Puppet、etc.
Photo by State Farm (http://www.flickr.com/photos/statefarm/10994875346/)
既存環境
Immutable Infrastructureでの更新作業
既存の機能
新規環境
既存の機能
新しい機能 そのまま
常に新しい環境を構築する(強制)
Photo by Chika Watanabe (http://www.flickr.com/photos/chikawatanabe/192112067/)
BlueGreen Deployment
既存環境
既存の機能
新規環境
既存の機能
新しい機能 さわらない
ルーター ロードバランサー
切り替え
新環境がダメそうな場合も切り戻しがしやすい
Photo by 松林 L(http://www.flickr.com/photos/axio/5577620081/)
でも大変じゃないの?
Photo by Tsahi Levent-Levi (http://www.flickr.com/photos/axio/5577620081/)
BOSHが可能にしてくれること
環境のライフサイクルマネージメント
分散環境構成ツール
–最初はCloud Foundryの構成用に作られた
–ほかの分散システム構築にも使える
環境構築に必要な作業を全てCLIで制御
– VMのライフサイクルマネジメント
•作成・削除・監視・etc.
–ソースコードの保存・コンパイル・配布
–環境の追加・更新・削除
BOSHとはなにか
15
BOSHの簡単な仕組み
AWS、OpenStack、Linux コンテナ (CloudStack、Google Cloud Platform)
BOSH
ソースコード 構成情報
環境C
CLI
環境B
環境A
VM VM VM VM
VM VM VM VM
VM VM VM VM
VM VM VM VM
VM VM VM VM
VM VM VM VM
VM VM VM VM
VM VM VM VM
VM VM VM VM
VM生成 バイナリ配布 設定適用
構成情報をコピーするだけで 別環境をゼロから構築できる
BOSHの簡単な仕組み
AWS、OpenStack、Linux コンテナ (CloudStack、Google Cloud Platform)
BOSH
ソースコード 構成情報
環境C
CLI
環境B
環境A
VM VM VM VM
VM VM VM VM
VM VM VM VM
VM VM VM VM
VM VM VM VM
VM VM VM VM
VM VM VM VM
VM VM VM VM
VM VM VM VM
VM生成 バイナリ配布 設定適用
構成情報をコピーするだけで 別環境をゼロから構築できる
IaaSの力を借りて
BlueGreen Deployment
Stemcell
– ベースとなるVMイメージ
Release
– ソースコードをまとめたGitレポジトリ
Deployment
– 個別の環境の構成情報
• Manifestファイル
3つの概念
VM
Stemcell
Job A
Package A
Package B
Package C
Agent
Release
最低限のライブラリとツールが
入ったVMイメージ
– Stemcell は幹細胞という意味
– Ubuntuベース(CentOSも開発中) • 後述の理由によりディストリビューションはあまり関係ない
BOSH Agentも含まれている
– 設定適用などを行うプログラム
– Monitも同梱
ファイルとして配布されている
– AWSではAMI
Stemcell
VM
Stemcell
Job A
Package A
Package B
Package C
Agent
Release
ソースコードをまとめたリポジトリ
– Gitで管理すること前提
– リリース番号管理も可能
Package:
– ソースコードのファイルリスト
– パッケージングスクリプト
Job:
– Packageのリスト
– 設定ファイルのテンプレート(ERB)
• Deploy時にManifestの値が代入される
– 起動スクリプト
• MonitがStartするスクリプト
Release
VM
Stemcell
Job A
Package A
Package B
Package C
Agent
Release
個別の環境と構成情報
– Deployment Manifestと紐付いている
Deployment単位で操作する
– 構築・削除・更新
複数Releaseの混載も可能
設定項目の例:
– 環境名
– 使用するReleaseとStemcellのバージョン
– Jobごとのリリース量(VMサイズ、数)
– ネットワーク設定(セキュリティグループ、Floating IP)
– Jobのテンプレートファイルに代入する値
Deployment
環境A
VM VM VM VM
VM VM VM VM
VM VM VM VM
Manifest B
環境B
VM VM VM VM
VM VM VM VM
VM VM VM VM
Manifest A
Getting deployment properties from director... Unable to get properties list from director, trying without it... Compiling deployment manifest... Cannot get current deployment information from director, possibly a new deployment Please review all changes carefully Deploying `blue.yml' to `firstbosh' (type 'yes' to continue): yes Director task 6 Preparing deployment binding deployment (00:00:00) binding releases (00:00:00) binding existing deployment (00:00:00) binding resource pools (00:00:00) binding stemcells (00:00:00) binding templates (00:00:00) binding properties (00:00:00) binding unallocated VMs (00:00:00) binding instance networks (00:00:00) Done 9/9 00:00:00 Preparing package compilation Preparing DNS binding DNS (00:00:00) Done 1/1 00:00:00 Creating bound missing VMs common/3 (00:00:47) common/1 (00:00:52) common/0 (00:00:56) common/2 (00:01:02) Done 4/4 00:01:02 Binding instance VMs mysql/0 (00:00:01) nginx/0 (00:00:01) nfs/0 (00:00:01) wordpress/0 (00:00:01) Done 4/4 00:00:01 Preparing configuration binding configuration (00:00:00) Done 1/1 00:00:00 Updating job mysql mysql/0 (canary) (00:01:19) Done 1/1 00:01:19 Updating job nfs nfs/0 (canary) (00:00:38) Done 1/1 00:00:38 Updating job wordpress wordpress/0 (canary) (00:01:42) Done 1/1 00:01:42 Updating job nginx nginx/0 (canary) (00:00:25) Done 1/1 00:00:25 Task 6 done Started 2013-11-28 17:32:55 UTC Finished 2013-11-28 17:38:02 UTC Duration 00:05:07 Deployed `blue.yml' to `firstbosh'
環境構築のライフサイクル
# Stemcell をアップロードしておく
bosh upload stemcell bosh-stemcell-3-cloudstack-kvm-ubuntu.tgz # ソースコードが準備出来たらリリース番号を振る # リリース番号を振るとリリース情報ファイルが作られる
bosh create release --final # ソースコードをアップロード # リリース情報ファイルを与えると対応するソースコードがアップロードされる
bosh upload release releases/wordpress-3.yml # 使用するマニフェストを指定して環境切り替え # 適宜マニフェストファイルを環境に合わせて編集しておく
bosh deployment ~/deployments/blue.yml # 環境を構成
bosh deploy
開発
デプロイ
新しい環境を増やす
# マニフェストをコピーして編集
cp ~/deployments/{blue,green}.yml vi ~/deployments/green.yml # 環境切り替え
bosh deployment ~/deployments/green.yml # 環境を構成
bosh deploy
--- name: green director_uuid: 12de20b6-56e1-40d1-3939 release: name: wordpress version: latest
配備済みの環境を確認
bosh deployments +-------+-------------+------------------------------+ | Name | Release(s) | Stemcell(s) | +-------+-------------+------------------------------+ | blue | wordpress/3 | bosh-cloudstack-kvm-ubuntu/3 | +-------+-------------+------------------------------+ | green | wordpress/3 | bosh-cloudstack-kvm-ubuntu/3 | +-------+-------------+------------------------------+ Deployments total: 2
配備済みの環境を削除
bosh delete deployment blue
Photo by Jessica Merz (http://www.flickr.com/photos/94953676@N00/61994800/)
簡単
MariaDB
– https://github.com/cloudfoundry-community/mariadb-boshrelease
ZooKeeper
– https://github.com/cloudfoundry-community/zookeeper-boshrelease
SkyDNS
– https://github.com/cloudfoundry-community/skydns-boshrelease
Redis
– https://github.com/cloudfoundry-community/redis-boshrelease
Riak
– https://github.com/BrianMMcClain/riak-release
参考)一般公開されているリリース
Cloud Foundryとの違い
どこまで自分で管理するか
PaaSはミドルウェア層までがマネージド
カスタマイズ性と管理コスト
29
PaaS
IaaS
仮想マシン 仮想マシン
物理マシン
ハイパーバイザ
データベース
仮想マシン 仮想マシン
物理マシン
ハイパーバイザ
ウェブサーバ
フレームワーク
ロードバランサ
アプリケーション・サービス
フレームワーク
ウェブサーバ
OS OS OS OS
※Cloud FoundryでもBlueGreen Deploymnetが可能
BOSH
BOSHほとんど何も提供しない
カスタマイズ性と管理コスト
30
IaaS
仮想マシン 仮想マシン
物理マシン
ハイパーバイザ
データベース
仮想マシン 仮想マシン
物理マシン
ハイパーバイザ
ウェブサーバ
フレームワーク
ロードバランサ
アプリケーション・サービス
フレームワーク
ウェブサーバ
OS OS OS OS
利点
–フルカスタマイズ出来る自由度
欠点
–フルカスタマイズしないといけない
利点と欠点
BOSHの課題
BlueGreen Deploymentは銀の弾丸か
ステートフルな環境は不揮発データのコ
ピーが必要になってしまう
–例)分散データベース、分散ストレージ
対応策
–ステートフルな部分とそれ以外を切り分ける
• Application層とDB層を分けて構成する
–ステートフル環境はMutableを受け入れる
ステートフルな環境のBGDは難しい
33
例)DBスキーマ変更を伴うApp層の更新
– GreenとBlueが共存できないケース
対応策
–一時的にMuttableな更新を受け入れる?
ステートフルな部分に引きずられる
Deploymentのアップデートも可能
– 擬似的なImmutable更新
– ルールを守らないと爆発する
ルール自体は難しくない
– /var/vcapディレクトリ内で完結させる
• ステートフルなデータは全て /var/vcap/store に保存
• OSが提供するパッケージ管理システムは使用しない
BOSHはMutableな更新も出来る
BOSH自体の構成ノウハウが必要
– Full BOSHはそれ自体が分散システム
– BOSH-liteの登場で光明が差す
• Vagrantで1VM BOSHを簡単に作れる
リリース管理に慣れる必要あり
全体的にヘビー
情報が少ない
BOSH自体がまだまだ進化中
Immutable Infrastructureで安心感アップ
– BlueGreen Deploymentが大事
–でもいますぐ全てをImmutableにするのは無理
BOSHはそのためのお手伝いをしてくれる
–環境のライフサイクル管理が比較的簡単
–フルカスタマイズ派におすすめ
まとめ
補足資料
Packageの展開先
– /var/vcap/packages/:package_name
– 複数Jobで共有される
Jobの展開先
– /var/vcap/jobs/:job_name
揮発性データの保存
– /var/vcap/data
不揮発(ステートフル)データの保存
– /var/vcap/store
– 更新時にVM再生成が行われた場合も引き継がれる
ディレクトリルール
39
更新時には 新しいバージョンで 置き換えられる (擬似Immutable)
BOSHはソースコードのコンパイルも自動で行う
– 複数VMで並列コンパイル
– Bundleなどの処理もここで行う事ができる
パッケージングスクリプトはただのシェルスクリプト
初回のみ実行され結果がキャッシュされる
– パッケージに変更があると自動で再実行される
各VMに配布されるのはパッケージング済みのファイル
– パッケージ名に対応したディレクトリに展開されるだけ
– OS環境が汚れない
パッケージング
Monitが起動スクリプトを実行
–単なるシェルスクリプト
–大抵はパッケージのバイナリを実行する
設定ファイル
– ERBテンプレートから自動生成される
•代入値はDeployment Manifestに書く
• VMごとの固有値などは自動で与えられる
–ジョブ名に対応した位置に保存されている
•起動スクリプト内でバイナリ実行時に渡すのが普通
ジョブの起動
BOSHではOSの提供するパッケージは使用しない
– aptやyumを使用すると更新時に爆発する
全て自分でPackageとして管理する
– 勝手にバージョンが更新されないので安全ではある
– セキュリティフィックスも自分で行う
– Cloud FoundryはPostgresやRubyも独自に管理している
完全自前主義