Serf / Consul 入門 ~仕事を楽しくしよう~

Preview:

Citation preview

Masahito Zembutsu @zembutsu Technology Evangelist; Creationline , Inc. Shinagawa, Tokyo, 11 Dec 2014 Code the Clouds Mix-up Vol. 2

Serf / Consul 入門 ~仕事を楽しくしよう~ Why I need serf and Consul?

Serf / Consul 入門 3 / 65

今日の内容

• 運用だが、もう人間は限界かもしれない

• Serf や Consul は何を解決しますか?

• Serf 入門

• Consul 入門

Topics of today.

クラウド・コンピューティング Cloud Computing

計画

発注

納品

設置

設定

監視

運用開始

計画

発注

納品

設置

設定

監視

運用開始

実際のフローでは、ここがネックになりがち・・・

数週~1ヶ月程度 few weeks or a month

計画

発注

納品

設置

設定

監視

運用開始

クラウド・コンピューティング基盤 Infrastructure as a Service

1クリック one click

計画

発注納品

監視

運用開始

クラウド・コンピューティング基盤 Infrastructure as a Service

数分~10分 few minutes

Serf / Consul 入門 9 / 65

開発サイドに福音

• すぐにサーバーが欲しい ➡クラウド・コンフィグレーション基盤の普及

• すぐにサービスを展開したい ➡構成管理ツールやデプロイツールの普及

• Chef, Ansible, Puppet, Salt Stack, Capistrano … etc

計画

発注納品

監視

運用開始

クラウド・コンピューティング基盤 Infrastructure as a Service

数分~10分 few minutes

発注納品

発注納品

継続的デリバリー 継続的デプロイ 継続的インテグレーション

ふたつの新しい課題 Two New Issues

1. 管理の煩雑さ Cumbersome Management

水 金 地 火 木 土 天 冥 海 Mercury Venus Earth Mars Jupiter Saturn Uranus Pluto Neptune

Hyperion

2.障害対応の迅速化 Trouble Shooting and Quick Operations

監視 Monitoring

状況判断 Situation Analysis

行動 Action

計画

発注納品

監視

運用開始

発注納品

発注納品

監視 運用

監視 運用

クラウドによって環境の準備が迅速になったはず。 しかし、台数の増加やシステム構成の複雑化によって、 クラウドの価値を相殺しているのではないのか?

Serf / Consul 入門 17 / 65

運用サイドに残る課題

• 動的に変化する環境 ➡ホスト名・IPアドレスとサービスをどのように管理するか

➡構成図や手順書や不定期な見直し

• 求められる迅速な対応 ➡現実世界と密接にかかわるサービスは、速やかな復旧が必要

➡管理対象のサーバーやサービス数の増加・複雑化

導き出される結論は

運用だが、 もう人間は限界かもしれない

Serf / Consul 入門 20 / 65

解決したい事は?

• 動的に変わる環境の管理を楽にしたい ➡サーバの追加・停止のタイミングで

監視や設定を連動したい

• 迅速に行動を起こしたい ➡一次対応レベルの作業も、すぐにこなしたい

➡複数台の環境にまたがる作業を、スムーズに対応したい

Serf http://serfdom.io/

Consul http://www.consul.io/

Serf や Consul は 何を解決してくれますか?

答え:既存の業務フローを 変更せずに省力化します。

Serf / Consul 入門 25 / 65

Serfの役割

• メンバ管理 ➡serf エージェント間でクラスタを構成し、情報を保持

• イベントの共有 ➡クラスタ全体で、イベントを瞬時に共有

• トリガ機能 ➡イベント発生時に、任意のコマンドをクラスタ全体で実行

Serf / Consul 入門 26 / 65

Consulの役割

• サービス・レベルの管理とイベント同期 ➡Serf と同じ事を、ウェブやデータベース等のサービスが対象

• インターフェースの提供 ➡HTTP ( REST API )

➡DNS

➡Key Value Storage

Serf / Consul 入門 27 / 65

Serf / Consul 比較

Serf vs. Consul http://www.serfdom.io/intro/vs-consul.html

Serf Consul

目的 サービス検出とオーケストレーション サービス検出と設定

ヘルスチェック 低レベル(ノード死活監視) サービス単位で高度な調整

キーバリューストア なし あり

メンバーシップ ノード単位 サービス単位

Web API なし あり

DNS インターフェース なし あり

アーキテクチャ AP 型 ( 一貫性重視、可用性を犠牲 ) CP 型 ( 可用性より一貫性重視 )

Serf / Consul 入門 28 / 65

誰が作っているの?

• Hashicorp 社 ➡https://www.hashicorp.com/

• Vagrant

• Packer

• Terraform

• Serf

• Consul

• ATLAS ← New!

Serf 超入門

Serf / Consul 入門 30 / 65

Serf とは何ですか?

• メンバ管理とイベント同期のためのツール ➡サーバを必要としないクラスタを、

相互通信するゴシップ・プロトコルによって構成

• すぐに動く・使える ➡バイナリ1個を置くだけで、依存関係が無い

➡低い学習コスト(シェルスクリプト程度の知識で使える)

Serf / Consul 入門 31 / 65

ご注意ください

• Serf の機能は Consul に統合されつつあります

• しかし、試すべき理由が3つあります ➡機能が少ないため、

いきなり Consul を触るよりも、Serf のほうが扱いやすいです

➡クライアント・サーバ型ではないため、

簡単にクラスタを構成できます

➡1つのツールとして完成形になりつつあります

Serf / Consul 入門 32 / 65

Serf は何ができますか?

• 一斉にコマンドを実行します ( exec , query ) ➡shutdown –h now

➡service httpd restart

➡service network restart

➡ iptables -A INPUT -p tcp -s XXX --dport 80 -j DROP

• 監視登録やアプリケーションの設定変更をします

Serf / Consul 入門 33 / 65

動作環境は?

• 複数の OS やアーキテクチャに対応しています ➡Linux ( 32bit, 64bit, ARM )

➡FreeBSD ( 32bit, 64bit,ARM )

➡MacOS X ( 32bit, 64bit )

➡OpenBSD ( 32bit, 64bit )

➡Windows ( 32bit, 64bit )

Serf / Consul 入門 34 / 65

セットアップ方法は?( Linux )

• バイナリを入手し、サーバ上に配置します ➡wget -O 0.6.3_linux_amd64.zip ¥

https://dl.bintray.com/mitchellh/serf/0.6.3_linux_amd64.zip

➡ unzip ./0.6.3_linux_amd64.zip

➡mv ./serf /usr/local/bin/serf

➡ serf version Serf v0.6.3 Agent Protocol: 4 (Understands back to: 2)

Serf / Consul 入門 35 / 65

Serf をどう動かしますか?

• “serf” コマンドをエージェントとして起動します ➡serf agent &

==> Starting Serf agent... ==> Starting Serf agent RPC... ==> Serf agent running! Node name: 'sion.pocketstudio.net' Bind addr: '0.0.0.0:7946' RPC addr: '127.0.0.1:7373' Encrypted: false Snapshot: false Profile: lan ==> Log data will now stream in as it occurs: 2014/12/06 14:28:33 [INFO] agent: Serf agent starting 2014/12/06 14:28:33 [INFO] serf: EventMemberJoin: sion.pocketstudio.net $ serf members sion.pocketstudio.net 10.0.2.15:7946 alive

Serf / Consul 入門 36 / 65

クラスタはどうしますか?

A B

serf join

Agent joining: [B] Initiating push/pull sync with: B

initiating push/pull sync

Responding push/pull sync

Responding to push/pull sync with: A

EventMemberJoin: B EventMemberJoin: A

A B

• serf join コマンドを使います ➡serf join <IP addr>

A B

Agent joining: [A] Initiating push/pull sync with: B

Responding to push/pull sync with: C

initiating push/pull sync Responding push/pull sync

C

ノード C が仲間になりたがってこっちを見ている!

serf join

EventMemberJoin: B

EventMemberJoin: A

EventMemberJoin: C EventMemberJoin: C

Serf / Consul 入門 38 / 65

どんなイベントがありますか?

• メンバ管理系 ➡ member-join … 参加

➡ member-fail … 障害

➡ member-leave … 離脱

➡ member-leap … 削除

➡ member-update … 更新

• ユーザによる任意発生 ➡ event … 一方的に実行するだけ

➡ query … 結果も取得する

Serf / Consul 入門 39 / 65

イベントで何かするには?

• “イベント・ハンドラ”を指定します ➡serf agent –event-handler=“event.sh”

• シェルスクリプト

• Perl, Ruby, Python …

• バイナリ

• その他の構成管理ツールとの連携

Serf / Consul 入門 40 / 65

MuninやZabbix

Serf / Consul 入門 41 / 65

LVS

#!/bin/sh while read line do echo ${line} HOSTNAME=`echo ${line} | cut -d ' ' -f 1` ADDRESS=`echo ${line} | cut -d ' ' -f 2` ROLE=`echo ${line} | cut -d ' ' -f 3` case ${SERF_EVENT} in "member-join") if [ "${ROLE}" = "webapp" ] ; then ipvsadm -a -t 192.168.39.1:80 -r ${ADDRESS}:80 -g fi;; "member-leave" | "member-failed") if [ "${ROLE}" = "webapp" ] ; then ipvsadm -d -t 192.168.39.1:80 -r ${ADDRESS}:80 fi;; ¥?) echo "other";; esac break done exit 0

# ipvsadm -A -t 192.168.39.1:80 -s rr # ipvsadm -a -t 192.168.39.1:80 -r 192.168.39.11:80 -g # ipvsadm -a -t 192.168.39.1:80 -r 192.168.39.12:80 -g # ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.39.1:80 rr -> 192.168.39.11:80 Route 1 0 0 -> 192.168.39.12:80 Route 1 0 0

Serf / Consul 入門 42 / 65

イベントを判別するには?

• 環境変数を使います。 #!/bin/sh echo echo "$0 triggered!" echo echo "SERF_EVENT is ${SERF_EVENT}" echo "SERF_SELF_NAME is ${SERF_SELF_NAME}" echo "SERF_SELF_ROLE is ${SERF_SELF_ROLE}" echo "SERF_SELF_TAG is ${SERF_SELF_TAG}" echo "SERF_TAG_ROLE is ${SERF_TAG_ROLE}" echo "SERF_TAG_STATUS is ${SERF_TAG_STATUS}" echo "SERF_USER_EVENT is ${SERF_USER_EVENT}" echo "SERF_USER_LTIME is ${SERF_USER_LTIME}" echo "SERF_QUERY_NAME is ${SERF_QUERY_NAME}" echo "SERF_QUERY_LTIME is ${SERF_QUERY_LTIME}" echo echo "BEGIN event data" while read line; do echo $line done echo "END event data" echo "$0 finished!" echo

Event Handlers - Serf by HashiCorp https://www.serfdom.io/docs/agent/event-handlers.html

• これを使えば・・・ ➡監視の自動追加・削除

➡設定変更の自動化

➡アイディア次第で何でも!

Serf / Consul 入門 43 / 65

詳しくは…

• https://serfdom.io/

• Re: ご注文は自動化ですか?[2] http://www.slideshare.net/zembutsu/re-is-the-order-an-automation-2nd

Software Design 2014年9月・10月号 “オーケストレーションツールSerf・Consul入門”

Consul 超入門

Serf / Consul 入門 45 / 65

Consulが必要な理由

• Serf は万能ではありません ➡イベント発生のトリガは2種類でした

• Serf クラスタへの参加や離脱

• 任意のタイミングでのイベント実行

➡ウェブサーバの応答やDB サーバ障害をトリガにしたい時は? • Serf で行えますが、非常に面倒です

• そんな時は Consul です

Serf / Consul 入門 46 / 65

Consulはどう使いますか?

• サーバ環境とクライアント環境を作ります ➡Consul サーバ

• HTTP、DNS、WEB UI のインターフェースを持ちます

• KVS を持ち、Consul クライアントの状態を保持します

• 状況変化をトリガとして、コマンドを実行できます

• Raft プロトコルで可用性を高めています

➡Consul クライアント • consul エージェントでサービスを定義して、監視します

クライアント ( consul node)

サーバ ( consul server)

クライアント ( consul node)

サーバ ( consul server)

A B C

新しいサービスが追加される

まだサーバは何も知らない

クライアント ( consul node)

サーバ ( consul server)

A B C

エージェントは サーバに情報を伝えると

新しいサービスが追加される

クライアント ( consul node)

サーバ ( consul server)

A B C

エージェントは サーバに情報を伝えると

はじめて同期する

A B C

クライアント ( consul node)

サーバ ( consul server)

A B

もし、サービスが消えると

A B C

クライアント ( consul node)

サーバ ( consul server)

A B

クライアントはサーバと情報を比較 サーバに“C”は不要と伝える

A B C

クライアント ( consul node)

サーバ ( consul server)

A B

クライアントはサーバと情報を比較 サーバに“C”は不要と伝える

A B あいよ

クライアント ( consul node)

サーバ ( consul server)

A B

クライアントはサーバと情報を比較 サーバに“C”は不要と伝える

A B あいよ

クライアントとサーバで情報が同期。この性質がアンチエントロピー

クライアント ( consul node)

サーバ ( consul server)

A B

クライアントはサーバと情報を比較 サーバに“C”は不要と伝える

A B あいよ

クライアントとサーバで情報が同期。この性質がアンチエントロピー

決定権を持つのは、クライアント側 サービス状況の変更をトリガとして

ただちに様々な動作を行える

Serf / Consul 入門 56 / 65

どうやって使いますか?

• consul にオプションを付けます ➡サーバ

• $ consul agent -server -bootstrap ¥ -dc=local -node=consul1 -data-dir=/tmp/consul

➡クライアント • consul agent -dc=local -node=consul2 ¥

-data-dir=/tmp/consul2 -join=192.168.39.5

Serf / Consul 入門 57 / 65

サービスはどう定義しますか?

• JSON形式のファイルを用意します。 { "service": { "name": "mysql", "port": 3306, "check": { "script": "/usr/bin/mysqladmin -h 127.0.0.1 ping > /dev/null 2>&1", "interval": "10s" } } }

Serf / Consul 入門 58 / 65

状態を知るには?

• Web UI

• HTTP API ➡ JSON

➡REST API

• DNS

Serf / Consul 入門 59 / 65

DNSをどう使いますか?

• 正常なサービスを応答します ➡dig <サービス名>.<ノード名>.<データセンタ名>.consul

• どんなシーンで使えますか? ➡DNS ラウンドロビン

➡名前解決によるマスター・スレーブの切り分け

➡などなど

Serf / Consul 入門 60 / 65

イベントをトリガとするには?

• “consul watch”を使います ➡status が変化したタイミングで任意のコマンドを実行します

➡consul watch –http-addr=127.0.0.1:8500 ¥

-type=service –service=mysql /opt/action.sh

Watches - Consul http://www.consul.io/docs/agent/watches.html

$ curl -s http://127.0.0.1:8500/v1/health/checks/mysql | jq '.[] | .Status' "passing"

Serf / Consul 入門 61 / 65

設定ファイルの動的反映とは?

• consul-template を使います ➡ git clone https://github.com/hashicorp/consul-template.git

➡ cd consul-template

➡make

➡ sudo cp ./bin/consul-template /usr/local/bin/consul-template

• 用途 ➡設定ファイルをテンプレートを元に自動生成・コマンド実行

➡例:リバースプロキシ用の設定ファイル作成後、デーモン再起動

Serf / Consul 入門 62 / 65

詳しくは…

• https://consul.io/

• Re: ご注文は自動化ですか?[2] http://www.slideshare.net/zembutsu/re-is-the-order-an-automation-2nd

Software Design 2014年9月・10月号 “オーケストレーションツールSerf・Consul入門”

まとめ

Serf / Consul 入門 64 / 65

仕事が楽になる、楽しくなる • なぜ Serf や Consul なのか? ➡複数台のサーバ管理が前提になる時代の課題を解決

• 開発は、構成管理ツール ( Chef, Puppet, Ansible 等 ) • 運用でも、効率的に行う必要性

➡人間がボトルネックになっている現状認識 • 時間が掛かる • 間違える

➡監視一次対応(判断不要な手順書)レベルの自動化につながる • 実際には作り込みが必要だし、パーツも足りない

“すべての障害を 生まれる前に消し去りたい”

この願いを叶えるには?

To Be Continued …