Docker v1.12 swarmクラスタをrubyのDSLで管理するツールAlgoを作りました
At first
Docker v1.12のリリースまでもうすぐですね!swarmモードを始め、今回のDockerのアップデートはワクワクする機能が盛りだくさんで楽しみです。 今日はDockerのv1.12からリリースされる予定のDocker内蔵のswarmモードとサービスの機能を使ってクラスタを管理するツールAlgoを作ってみました。
Why
Docker v1.12から使えるようになるswarmモードとserviceの機能, ハートビート機能の実装により、Docker単体でサービスクラスタを簡単に用意できるようになりました。
是非活用したいと思ったところですが、3点問題点がありました。1つはdocker-composeはv1.12からリリースされるswarmモードに関してサポートを行わないこと(docker bundle用のエクスポートにてサポート)。2つめは、現時点のdocker bundleの機能が貧弱すぎること。3つめとして、docker service create/update
でサービスを管理するのはさすがにご遠慮したいこと。
What is it?
やりたかったことは下記の事。
定義ファイルを下記のように書いて
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にて
Want to do
- とりあえずまだすべてのDSLを書いたわけではないので埋めていきたいところ
- デーモンを用意してオートスケールの仕組みの実装とかできたら面白そうかもと思ってます。
- autoscale_min, autoscale_max, scaledown_when, scaleup_when的なDSLにて
- 現状APIの制限によりサービスのネットワークの変更ができないのでなんとかしたい
Afterword
熱があるのになんでこんなにコードを書いているのか謎。つらい。