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

Post on 16-Apr-2017

2.308 Views

Category:

Engineering

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Chef, Consulを使った

クラウドオーケストレーション

Tech-Cricle#8 Chef Meetup

@tominaga443

By: The City of Vancouver CC BY 2.0

本日のアジェンダ

1. イントロダクション

2. ライフサイクルイベントを意識してChefを使おう

3. Consulを使ってサーバ間連携しよう

自己紹介

冨永 善視(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 (要解説)

モデルケース

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

Backup Restore

CloudConductorのライフサイクルイベント

Setup

Configure

Deploy

Backup Restore

ベースイメージ作成時

インスタンス起動時 構成変化時 アプリケーション投入時

バックアップ取得時

DR, システム切替時

CloudConductorのライフサイクルイベント

Setup

Configure

Deploy

Backup Restore

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レシピを分割することで、

運用フェーズでクラウドの機能やツールをうまく活用できる

Chefだけでは難しいところ

• システム構成の管理

• 膨大で不定なノード数

• 起動するたびに変わるIPアドレス

• サーバー間連携

• 起動しないと分からないパラメータの連携

• サーバを跨いだレシピ実行の順序制御、待ち合わせ

Chefだけでは難しいところ

• システム構成の管理

• 膨大で不定なノード数

• 起動するたびに変わるIPアドレス

• サーバー間連携

• 起動しないと分からないパラメータの連携

• サーバを跨いだレシピ実行順の制御

集中管理ではなく自律分散

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 KVS Consul 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 KVS Consul Cluster

Result NodTaskResult:

タスクのキューを進める

EventQueue:

ProgressTaskQueue:

Consul KVS Consul Cluster

Result NodTaskResult:

TaskResult:

全タスクが終了したら結果を格納

EventQueue:

ProgressTaskQueue:

Consul KVS Consul 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.

top related