SlideShare a Scribd company logo
Chef, Consulを使った
クラウドオーケストレーション
Tech-Cricle#8 Chef Meetup
@tominaga443
By: The City of Vancouver CC BY 2.0
本日のアジェンダ
1. イントロダクション
2. ライフサイクルイベントを意識してChefを使おう
3. Consulを使ってサーバ間連携しよう
1. イントロダクション
By: Joshua Schnable CC BY 2.0
自己紹介
冨永 善視(Yoshimi Tominaga)
@tominaga443
2013.4 ~ TIS株式会社 戦略技術センター
- OSS Middleware Stack “ISHIGAKI Template”
- OSS Cloud Orchestrator “CloudConductor”
- その他OSS関連の技術検証
Chefとわたし
入社して最初に買った技術書
まだ日本語の情報が少なく、
情報がまとまっていなかった当時、
新人のわたしを導いてくれた一冊。
ISHIGAKI Template
○ 4, 5時間の構築作業が20分~1時間に
○ インフラにもCIを導入
△ Chef Serverのメンテナンスが割に合わない
俺はこれでChef Serverきらいになったなあもりにも大変すぎるでしょう?
• 推奨OSSスタックをテンプレート化
• アプリケーション基盤をChefで自動構築
• Enterprise向けに検証、チューニング
CloudConductor
• Infrastructure Pattern as Code
• Autonomous Operation
• Pluggable Non-Functional Requirements
インフラの”パターン”を組み合わせて
クラウドにシステムを自動構築
1枚でわかるCloudConductor(要解説)
By: seyed mostafa zamani CC BY 2.0
2. ライフサイクルイベントを
意識してChefを使おう
モデルケース
LB
Web / AP
DB
インフラ構築~運用で起きるイベント
Middleware
Install
Configuration
Application
Deploy
Scale Out
Scale Up
Application
New Release
Data Backup
Restore
インフラ構築~運用で起きるイベント
Middleware
Install
Configuration
Application
Deploy
Scale Out
Scale Up
Application
New Release
Data Backup
Restore
ライフサイクルイベント
• Setup: インスタンスがブートした後に発生
• Configure: インスタンスがOnline/Offline状態に移行したとき発生
• Deploy: アプリケーションをデプロイするとき発生
• Undeploy: アプリケーションを削除するときに発生
• Shutdown インスタンスを停止するときに発生
AWS Opsworks のライフサイクルイベント
CloudConductorのライフサイクルイベント
Setup
Configure
Deploy
BackupRestore
CloudConductorのライフサイクルイベント
Setup
Configure
Deploy
BackupRestore
ベースイメージ作成時
インスタンス起動時
構成変化時 アプリケーション投入時
バックアップ取得時
DR, システム切替時
CloudConductorのライフサイクルイベント
Setup
Configure
Deploy
BackupRestore
Spec
Spec
システム構築完了時
アプリケーション
デプロイ完了時
ライフサイクルイベントの通知
イベントを通知
Cookbook取得
対応するRun List実行
イベントごとにレシピを分割
tomcat_cluster_pattern
├ site-cookbooks
│ ├ apache_part
│ │ └ recipes
│ │ ├ default.rb
│ │ ├ setup.rb
│ │ ├ configure.rb
│ │ └ deploy.rb
│ ├ tomcat_part
│ ├ pgpool-II_part
│ ├ postgresql_part
│ ├ haproxy_part
│ └ cloudconductor
イベント発生時、
自分のRoleに応じたCookbookから
イベントに対応するレシピを実行
Setup
tomcat_cluster_pattern/site-cookbooks/apache_part/recipes/setup.rb
各種ミドルウェアのインストール、環境に依存しない設定を実施
設定後スナップショットを取得し、ベースイメージとして利用
Configure
tomcat_cluster_pattern/site-cookbooks/apache_part/recipes/configure.rb
IPなど、構築するまで確定しない値を必要とする設定を実施
ユーザからパラメータを渡す必要がある設定もここで実施
Deploy
tomcat_cluster_pattern/site-cookbooks/apache_part/recipes/deploy.rb
アプリケーションファイルの配置、データ投入などを実施
アプリケーションに関するパラメータを必要とする設定もここで実施
ライフサイクルイベントを意識してChefを使おう
システムの構成変化をイベントとしてとらえる
イベントを意識してChefレシピを分割することで、
運用フェーズでクラウドの機能やツールをうまく活用できる
3. Consulを使ってサーバ間
連携しよう
By: Judy Schmidti CC BY 2.0
Chefだけでは難しいところ
• システム構成の管理
• 膨大で不定なノード数
• 起動するたびに変わるIPアドレス
• サーバー間連携
• 起動しないと分からないパラメータの連携
• サーバを跨いだレシピ実行の順序制御、待ち合わせ
Chefだけでは難しいところ
• システム構成の管理
• 膨大で不定なノード数
• 起動するたびに変わるIPアドレス
• サーバー間連携
• 起動しないと分からないパラメータの連携
• サーバを跨いだレシピ実行順の制御
集中管理ではなく自律分散
Chef, Consul を使ったクラウドオーケストレーション
Consul
https://www.consul.io/
Key / Value Storage
各ノードがKVSを持ち、クラスタ全体で同期
ノード障害が発生しても、全体でデータ保持可能
Consul Watch
イベントや通知を受け取ると
特定のコマンド、スクリプトを実行
Health Check
障害通知
障害通知
Consul Event
任意のEventをクラスタ内に伝播
特定のノードにのみ伝播させることも可能
Event
Event
Event
Consulを使ってサーバ間連携しよう
• システム構成の管理
• IPアドレスなど自身の情報をKVSに登録
• クラスタの情報はConsulの分散KVSに集約
• サーバー間連携
• 必要な情報はKVSでやりとり
• Event通知で処理実行のタイミングを合わせる
Consul Event / Consul Watchの課題
Event が届く順番は保障されない
先のEvent の処理中に次のEvent の処理も実行される
Event
Event
Event
Event
どっちが先?
Consul Event / Consul Watchの課題
Event が届く順番は保障されない
先のEvent の処理中に次のEvent の処理も実行される
Event
Event
Event
Event
どっちが先?
イベント発生時の処理を
うまく順序制御したい
Consul Event / Consul Watchの課題
Event が届く順番は保障されない
先のEvent の処理中に次のEvent の処理も実行される
Event
Event
Event
Event
どっちが先?
ないなら作ろう!
※開発中のため、ロゴは
変更になる場合があります
https://github.com/cloudconductor/metronome
Metronome
Consul と連動
Event 発生時の処理をクラスタ全体で順序制御
• Event Queuing
• Task Sequence Control
• Results Sharing
処理の実行順をYAML形式で記述
task.yml
events:
setup:
description: Execute setup
task: setup
configure:
description: Execute configure chef
priority: 50
ordered_tasks:
- service: postgresql
task: configure
- service: tomcat
task: configure
- service: httpd
task: configure
service, tag で対象絞込み
前のタスク結果を待ってから
次のタスクを実行
Event 発生時に実行する
タスクを指定
処理の実行順をYAML形式で記述
task.yml
tasks:
setup:
description: Execute setup chef
operations:
- execute:
file: prepare.sh
- chef:
run_list:
- role[{{role}}_setup]
configure:
description: Execute configure chef
operations:
- chef:
run_list:
- role[{{role}}_configure]
実行する処理を記述
operations
- execute: シェルを実行
- chef: Chefを実行
- service: サービス起動/停止
- echo: 文字列を出力
- consul-event: イベント発行
- consul-kvs: KVS操作
イベントをキューに追加
EventQueue:
Consul KVSConsul Cluster
Event
metronome push
タスクをキューに展開
EventQueue:
ProgressTaskQueue:
Consul KVS
metronome.Event
Consul Cluster
Event
metronome push
各ノードでタスクを実行
EventQueue:
ProgressTaskQueue:
Consul KVS
metronome.Event
metronome.EventTask
- service
- tag
- task
Consul Cluster
Event
metronome push
タスクの実行結果を格納
EventQueue:
ProgressTaskQueue:
Consul KVSConsul Cluster
Result NodTaskResult:
タスクのキューを進める
EventQueue:
ProgressTaskQueue:
Consul KVSConsul Cluster
Result NodTaskResult:
TaskResult:
全タスクが終了したら結果を格納
EventQueue:
ProgressTaskQueue:
Consul KVSConsul Cluster
Result NodTaskResult:
TaskResult:
EventResult:
順序制御で複雑な待ち合わせも可能に
DBサーバ⇒APサーバ⇒Webサーバの順にサービス起動
マスターDBにデータを投入してからスレーブDBを起動
各サーバの公開鍵をKVSに登録して一括共有
CloudConductorにおけるツールの使い分け
CloudFormation
OpenStack Heat
Packer Chef
Consul
Metronome
Serverspec
Provisioning ● ●
Configuration ● ●
Application
Deploy
● ●
Test ● ●
Lifecycle Event ● ●
まとめ
システム構成が変化するクラウド環境では
すべてを集中管理することは難しい
まとめ
Chef による自動化
Consul による自律分散
まとめ
上手く活用して
システム運用を自働化しよう!
Thank you for listening.

More Related Content

Chef, Consul を使ったクラウドオーケストレーション