Less is Best

rubyが好き。技術の話とスタートアップに興味があります。

Docker v1.12 swarmクラスタをrubyのDSLで管理するツールAlgoを作りました

At first

Docker v1.12のリリースまでもうすぐですね!swarmモードを始め、今回のDockerのアップデートはワクワクする機能が盛りだくさんで楽しみです。 今日はDockerのv1.12からリリースされる予定のDocker内蔵のswarmモードとサービスの機能を使ってクラスタを管理するツールAlgoを作ってみました。

github.com

Why

Docker v1.12から使えるようになるswarmモードとserviceの機能, ハートビート機能の実装により、Docker単体でサービスクラスタを簡単に用意できるようになりました。 是非活用したいと思ったところですが、3点問題点がありました。1つはdocker-composeはv1.12からリリースされるswarmモードに関してサポートを行わないこと(docker bundle用のエクスポートにてサポート)。2つめは、現時点のdocker bundleの機能が貧弱すぎること。3つめとして、docker service create/updateでサービスを管理するのはさすがにご遠慮したいこと。

久しぶりにRubyも書きたかったのでrubyで書いてみた。

What is it?

やりたかったことは下記の事。

  • ファイルに定義したクラスタ定義をswarmクラスタに適用する
    • Ruby DSLによるサービス/ネットワークの定義
  • 冪等な実行
  • Dry-runのサポート

定義ファイルを下記のように書いて

awesomecluster.rb

cluster 'awesomecluster' do

  # Define service/network prefix for cluster
  prefix 'awsm'

  # Define cluster wide available environment variable
  env 'CLUSTER_ENV', 'PRODUCTION'

  # Define cluster wide available label
  label 'com.example.sample', 'clusterwidelabel'

  # Define network
  network 'net1'

  # Define service
  service 'name' do
    image 'quay.io/yss44/curl'
    replicas 3
    command 'sh'
    args '-ic', "while true; do curl -s awsm-nginx > /dev/null; echo $?; sleep 3; done"

    update_parallelism 2

    # Service related environment variable
    env 'APP_DOMAIN', 'example.com'

    network 'net1'
  end

  # Define another service
  service 'nginx' do
    image 'nginx:alpine'
    replicas 2
    network 'net1'
  end

end

algo apply awesomecluster.rbでコマンドを実行すると、swarmクラスタを更新します。

algo apply awesomecluster.rb
# Applying to cluster awesomecluster...
# network: awsm-net1, status: created
# service: awsm-name, status: created
# service: awsm-nginx, status: created
# Complete applying for cluster awesomecluster!

ファイルを更新して再度algo apply awesomecluster.rbを行うと、差分をswarmクラスタに反映します。

# Change configuration
sed -i s/replicas 2/replicas 1/g awesomecluster.rb

# Dry-run
algo apply examples/awesomecluster.rb
# Running with dry-run mode...
# Applying to cluster awesomecluster...
# network: awsm-net1, status: ok
# service: awsm-name, status: ok
# service: awsm-nginx, status: changed
# Complete applying for cluster awesomecluster!

How to install?

gemとしておいているのでgem install algoですぐにでも試せます。詳しくはgithubにて

github.com

Want to do

  • とりあえずまだすべてのDSLを書いたわけではないので埋めていきたいところ
  • デーモンを用意してオートスケールの仕組みの実装とかできたら面白そうかもと思ってます。
    • autoscale_min, autoscale_max, scaledown_when, scaleup_when的なDSLにて
  • 現状APIの制限によりサービスのネットワークの変更ができないのでなんとかしたい

Afterword

熱があるのになんでこんなにコードを書いているのか謎。つらい。