64
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 入門 ~仕事を楽しくしよう~

Embed Size (px)

Citation preview

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

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?

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

Serf / Consul 入門 3 / 65

今日の内容

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

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

• Serf 入門

• Consul 入門

Topics of today.

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

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

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

計画

発注

納品

設置

設定

監視

運用開始

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

計画

発注

納品

設置

設定

監視

運用開始

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

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

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

計画

発注

納品

設置

設定

監視

運用開始

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

1クリック one click

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

計画

発注納品

監視

運用開始

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

数分~10分 few minutes

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

Serf / Consul 入門 9 / 65

開発サイドに福音

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

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

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

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

計画

発注納品

監視

運用開始

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

数分~10分 few minutes

発注納品

発注納品

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

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

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

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

1. 管理の煩雑さ Cumbersome Management

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

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

Hyperion

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

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

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

監視 Monitoring

状況判断 Situation Analysis

行動 Action

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

計画

発注納品

監視

運用開始

発注納品

発注納品

監視 運用

監視 運用

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

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

Serf / Consul 入門 17 / 65

運用サイドに残る課題

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

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

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

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

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

導き出される結論は

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

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

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

Serf / Consul 入門 20 / 65

解決したい事は?

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

監視や設定を連動したい

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

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

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

Serf http://serfdom.io/

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

Consul http://www.consul.io/

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

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

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

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

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

Serf / Consul 入門 25 / 65

Serfの役割

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

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

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

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

Serf / Consul 入門 26 / 65

Consulの役割

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

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

➡DNS

➡Key Value Storage

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

Serf / Consul 入門 27 / 65

Serf / Consul 比較

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

Serf Consul

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

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

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

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

Web API なし あり

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

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

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

Serf / Consul 入門 28 / 65

誰が作っているの?

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

• Vagrant

• Packer

• Terraform

• Serf

• Consul

• ATLAS ← New!

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

Serf 超入門

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

Serf / Consul 入門 30 / 65

Serf とは何ですか?

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

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

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

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

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

Serf / Consul 入門 31 / 65

ご注意ください

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

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

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

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

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

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

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

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

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

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

Serf / Consul 入門 33 / 65

動作環境は?

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

➡FreeBSD ( 32bit, 64bit,ARM )

➡MacOS X ( 32bit, 64bit )

➡OpenBSD ( 32bit, 64bit )

➡Windows ( 32bit, 64bit )

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

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)

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

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

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

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>

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

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

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

Serf / Consul 入門 38 / 65

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

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

➡ member-fail … 障害

➡ member-leave … 離脱

➡ member-leap … 削除

➡ member-update … 更新

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

➡ query … 結果も取得する

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

Serf / Consul 入門 39 / 65

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

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

• シェルスクリプト

• Perl, Ruby, Python …

• バイナリ

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

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

Serf / Consul 入門 40 / 65

MuninやZabbix

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

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

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

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

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

➡設定変更の自動化

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

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

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入門”

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

Consul 超入門

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

Serf / Consul 入門 45 / 65

Consulが必要な理由

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

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

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

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

• そんな時は Consul です

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

Serf / Consul 入門 46 / 65

Consulはどう使いますか?

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

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

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

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

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

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

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

クライアント ( consul node)

サーバ ( consul server)

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

クライアント ( consul node)

サーバ ( consul server)

A B C

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

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

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

クライアント ( consul node)

サーバ ( consul server)

A B C

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

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

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

クライアント ( consul node)

サーバ ( consul server)

A B C

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

はじめて同期する

A B C

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

クライアント ( consul node)

サーバ ( consul server)

A B

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

A B C

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

クライアント ( consul node)

サーバ ( consul server)

A B

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

A B C

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

クライアント ( consul node)

サーバ ( consul server)

A B

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

A B あいよ

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

クライアント ( consul node)

サーバ ( consul server)

A B

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

A B あいよ

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

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

クライアント ( consul node)

サーバ ( consul server)

A B

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

A B あいよ

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

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

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

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

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

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

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" } } }

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

Serf / Consul 入門 58 / 65

状態を知るには?

• Web UI

• HTTP API ➡ JSON

➡REST API

• DNS

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

Serf / Consul 入門 59 / 65

DNSをどう使いますか?

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

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

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

➡などなど

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

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"

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

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

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

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

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

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入門”

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

まとめ

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

Serf / Consul 入門 64 / 65

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

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

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

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

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

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

この願いを叶えるには?

To Be Continued …