sheepdog の virtual disk images (vdi) を Docker から利用するためのプラグイン、Docker Volume Plugin for Sheepdog v0.1.0
を先日リリースしました。
Docker Volume Plugin framework の v2 API は一通り網羅したので、なんとか実用に耐えうる機能は揃っているのではないかと思います。vdi のスナップショット操作など未実装の機能は多いですが、今後のバージョンアップで機能を追加するかもしれません。
Architecture
世に溢れている Dcoker Volume Plugin と同じく、開発言語は golang です。基本的なアーキテクチャも同様に、UNIX socket で待ち受けて、呼ばれた命令に応じて処理を行います。
sheepdog 特有の箇所はそれよりも下の箇所でしょう。sheepdog は主に kvm や OpenStack と連携して利用される分散ブロックストレージですが、このブロックの扱いが少々厄介です。今回は Linux SCSI target framework (tgt) を利用して処理する形にしています。
iSCSI の LUN として切り出している関係上 mount
, umount
のタイミングだけでなく、ブロックデバイス自体の削除や接続にも気を使う必要があります。このプラグインはそういった面倒くさい部分を肩代わりするようにデザインしました。
例えば・・・
mount
時- すでにその volume が LUN として接続されているか確認
- 新しい LUN として target に追加
- 既存の iSCSI セッションをリスキャンして OS に認識させる
- ファイルシステムがすでにあるか確認し、なければ
mkfs
する - ホストの規定マウントポイントに
mountm
し Docker Daemon に引き渡す
ユーザがこういった一連の作業を特になにも気にすることなく、docker
コマンドだけで完結するようしてあります。
Why tgt ?
sheepdog は基本的に仮想マシンのディスクとして qemu 経由で利用することを想定してデザインされていますが、その他にも接続実装が存在します。例えば・・・
- qemu client
- libvirt (qemu)
- OpenStack (cinder)
- HTTP Simple Storage (swift 互換)
- iSCSI (tgt)
- NDB (qemu-nbd)
- sheepfs (fuse)
- NFS
- Sheepdog Block Device (SBD)
並べてみると結構色々ありますね。Docker の Volume はあくまで Docker Daemon が動くホストにファイルシステムとしてマウントすることが前提となるので、この中で扱いやすそうなのは sheepfs (fuse)、NFS、あとは SBD あたりでしょうか。
しかしながら、いずれも今の段階ではあまり成熟している様子ではありませんでした。そのため今回は十分に実績のある tgt を採用しました。
Next ?
そんなこんなで 1ヶ月くらい掛けてコツコツ作っていた当プラグインもこれで一区切りです。もともとは “はじめての golang 入門題材” として開始したものですが、(主に自分にとって) 便利なプラグインとなりました。今後の予定としては細かい不具合を修正しながら安定性と利便性を向上することです。
もしフィードバック等々がありましたら Github の Issue なりプルリクエストなりいただければ幸いです。