SerfでLvsを管理するNaminoriを書きなおした

夏休み、終わっちゃいますね。
どうも、P山です。

今年の夏休みの宿題は3つ考えていて、今日ようやく終わりました。

OpenStackのKeyPairを利用してSSHログインできるようにする
fogでallowed_address_pairsをサポートする
Naminoriを完成させる

Naminoriは以前第2回ペパボテックカンファレンスの僕の発表で軽く触れていて、
その当時はとりあえず動くだけの状態だったのですが、ようやく書き上げました。

Naminori is

Serfでlvsに動的にメンバーを追加したり、ヘルスチェックを行うrubyのライブラリです。
Serfのmember-joinやleave時のLBメンバーの追加削除、サービスがダウンしている場合に
自動でLBメンバーを削除したりすることができます。(VIPは事前に定義してください)

背景としてlvsはヘルスチェック機能がなく、サービスがダウンした場合でも
パケットを割り振ってしまったりするので、そのあたりのケアをしています。
またlvsであればUDPパケットも管理できるため、
DNSなどのサービスを動的LBしたい場合に是非使ってみてください。

使い方

独自のDSLを採用しており、簡単な設定だけで使い始めることができます。

event.rb

#! /usr/bin/env ruby
require 'rubygems'
require 'naminori'

Naminori.configure do |config|
  # slack通知の設定
  config.notifier :slack do
    webhook_url "https://hooks.slack.com/services/hoge/fuga/test"
    channel     "#pyama"
    user        "#naminori"
  end

  # dnsサービスの設定
  config.service :dns_role do
    service  :dns
    protocol "udp"
    vip "192.168.77.9"
  end
end

Naminori.run

通知設定

メンバーの追加削除時にSlackに通知を行うことができます。

config.notifier :slack do
  webhook_url "https://hooks.slack.com/services/hoge/fuga/test"
  channel     "#pyama_botest"
  user        "#naminori"
end

サービス設定

ロール名ごとにイベント、ヘルスチェックを管理するサービスを定義することができます。
サービスごとのデフォルト値はREADMEを参照してください。

config.service serfロール名 do
  service  :dns(:http)
  protocol "udp"(tcp)
  vip "192.168.77.9"
end

実行

このタイミングで定義された設定に基づき、イベントの判定、ヘルスチェックが実行されます。
ヘルスチェックだけ実行したい場合でも、同じスクリプト(event.rb)をcronなどで実行しておくと
設定された間隔でサービスのチェックが実施できます。

Naminori.run

今今はDNSとHTTPだけ対応していますが、ヘルスチェック部分だけの追加で追加でサービス対応できるようにしてあるので、
必要になったらそのタイミングで追加していきます。

それでは皆様残り少ない夏休み良い時間を〜。