まえがき
Amazon EC2 Container Service(以下ECS)で実践的な構成を作ってウェ~イしようと思ったんですが、
試していくにつれて理解が浅いことに気付いたため
結果的にポエムになりました:)
Amazon EC2 Container Service(以下ECS)
ECSを動かしてみた系の記事はもうすでにいくつか公開されているので、
実際の運用を考えた構成にした時にどんな感じなんだろう?
という肌感を得るためにがんばってみました。
ちなみに現時点(2015/1/9)ではプレビュー版のため
正式版では変更される可能性大です。
生暖かい目で御覧ください。
ECSがよくわからない方への補足
用語集
用語 | 説明 |
---|---|
クラスタ | ECSを管理するための単位。ロールごとに用意する感じだと思う。 |
タスク | 1インスタンス内で構成されるコンテナの定義。クラスタにかかわらずグローバルなもの。 |
実行中タスク | クラスタ内で実行されているタスクのこと。 |
仕様についてメモ
- 1つのサーバは1つのクラスタにのみ属する。
- 1サーバ内では1つのタスクのみ実行できる。別のタスクを実行しようとするとタスクが上書きされる。
テスト構築しようとしていた構成
Appクラスタは webアプリ/fluentd/sensuクライアント の3つのコンテナで、
Redisクラスタは redis/sensuクライアント の2つのコンテナで、
Fluentdクラスタは fluentdサーバ(Appからの受信用)/sensuクライアント の2つのコンテナで、
Sensuクラスタは sensuサーバ(各サーバのモニタリング) の1つのコンテナで、
構成されています。
で、結論から言うと現時点ではムリ〜。
ダメな理由
プレビュー版制限事項
そもそも、プレビュー版の制限として
クラスタは最大2つまで
という縛りがあるため、上記構成は出来ませんでした。
http://docs.aws.amazon.com/AmazonECS/latest/developerguide/service_limits.html
いろいろ試しているうちに疑問がわいた
そもそもですよ、クラスタ間の連携について考えると
App -> Redis に接続したい場合、
AppクラスタはどうやってRedisの情報を取得すればよいのでしょうか?
Appクラスタ内で aws ecs ..
コマンドで取得して/etc/hostsに適用する仕組みを作る?
もしくはconsulを入れて、自動的に居場所がわかるようにする?
ここで気付いた。ECSはここまではやってくれないのか〜
CoreOSの技術と比べて見る
そうか、ECSはここでいうfleetの役割だけ提供しているのではないか?
つまりetcdのように複数サーバをクラスタする仕組みが
別途必要なのでは?
ECSで出来ること(プレビュー版時点)
- クラスタ(サービス)毎に「どのクラスタにどのコンテナを起動するかのタスク定義/タスク実行/確認」などができる
- クラスタに参加しているEC2インスタンスがどれか?の確認ができる
- 1サーバ内にコンテナをいくつ起動するか、をcountで指定できる
- CPU/メモリなどコンテナのリソース管理が出来る
- コンテナデプロイはコマンドで出来る
ECSで出来ないこと(プレビュー版時点)
- EC2インスタンス自体のスケール。既存のAutoScalingなどと連携する必要がある。
- クラスタ間の連携。他のツール(consulなど)を使う必要がある。
- Volumeマウント(たぶん、正式版ではできるようになってるとおもう http://stackoverflow.com/questions/27557235/does-amazon-aws-ec2-container-service-support-volumes)
- ログをまとめるのは自前でやる。k8sのようにfluentdをバンドルしてくれると嬉しい
出来ないこと、については
正式版リリースと共にサポートしてくれるんじゃないかなーと期待してる。
以上、ポエムでした。