概要
この記事はKubernetes Advent Calendar 2016の12/21の記事です。
kubernetesは分散アプリケーションをうまく管理することができる素敵なソフトウェアです。
仕事でもちょこちょこ触っているのですが、今回はAdventCalendarということでkubernetesの紹介がてら、ちょっとおもしろいものを作ってみようと思います。
kubernetesはユーザの操作とは非同期に動いていて、ユーザが指示を出しても、その結果が完全に反映されるまでに少し時間がかかります。
また、ユーザが操作していなくても、障害などがあれば勝手にシステムを正しい状態に戻してくれます。
この挙動は分散アプリケーションを扱う上ではとても良いのですが、利用者からすると、「いつ、何が起きているのか?」がわかりにくいことがあります。
ということで、「今kubernetesの中で何が起きているのか」を表示するWebアプリケーションを作ることにします。
ただ、画面に表示するだけでは、面白くないので「しゃべるkubernetes」というのを作ってみようと思います。
Event
kubernetesのリソースの中にEventと呼ばれるものがあります。
これはkubectl get events
するとみることができますので、知ってる人もいるかと思います。
今回はこのリソースを監視して、kubernetesで起きていることをしゃべらせることにします。
作ったもの
https://github.com/kubernetes/client-go/tree/master/examples/in-cluster
ここにclient-goというkubernetesのAPIをうまいこと扱うことができるライブラリのサンプルがあります。
これを参考にEventリソースをWatchします。
そして、しゃべらせるためにWebページを配信するようにします。
図にするとこんな感じ。
英語で読み上げてみる
いい感じですね。
作っていて発見しましたが、バックグラウンドでもしゃべってくれるので、オペレーションの邪魔にならず、案外まともに運用業務で使えるかもしれないのでは と感じました。
日本語で読み上げてみる
やはり日本人なので、日本語で話すようにしたい
といっても、kubernetesのEventには英語のメッセージしか入ってこないので、英語 → 日本語の変換テーブルを作って無理やり日本語にすることにします。
ちょっとした解説
EventsをWatchする
https://github.com/kubernetes/client-go/tree/master/examples/in-cluster
こちらを参考にしています
お作法的にclientsetを作成した後は
eventInterface, err := clientset.CoreV1().Events("").Watch(v1.ListOptions{})
eventCh := eventInterface.ResultChan()
このようにEventリソースに何かあったら通知が飛ぶようなチャンネルを作成して、、
for {
select {
case event := <-eventCh:
ev, ok := event.Object.(*v1.Event)
if ok {
switch event.Type {
case watch.Added:
fmt.Println("## Added:")
printEvent(ev)
emitEvent(ev, msgCh)
やってきたイベントによって実行する処理を書くだけ!
今回はwebsocketでブラウザにメッセージを送っています。
WebSocketで配信する
今回ここはとてもテキトーに作ってしまったので、一度に複数のブラウザで閲覧するとどれか一つにしか通知が飛ばないです。。
ブラウザではサーバからのEventリソースの変更通知を受け、Web Speech Synthesis APIを利用してしゃべらせます。
こちらの記事を参考にしました
http://qiita.com/kyota/items/da530ad22733b644518a
ソースコード
これをそのまま使うことはないだろうけど、一応こんな感じですということで、、
https://github.com/inajob/kube-sniff
まとめ
このようにkubernetesは非常に簡単に拡張ができ、kubernetesと連動した”なにか”を作ることができます。
分散アプリケーションの運用というのは、シチュエーションごとに様々な要件がありますが、難しいことはkubernetesに任せつつ、追加の要件をこの記事のようにアドオンで開発することで、運用のための開発を最小限にすることができます。