ksaitoの日記

日々試したことの覚え書き

dockerのクラスタとスケジューラ

AWS ECS、AWS Fargate、Docker Swarm、Kubernetesの違いについての覚書です。 Kubernetesの人たちがAWS ECSよりKubernetesのほうが賢いといっていたり、Docker純正のSwarmよりKubernetesが注目されている理由が何となく納得できました。

AWS ECS

ECSは、Auto Scaleで複数のEC2インスタンスクラスタを構成できます。 サーバリソースの状況によって、Auto Scaleがサーバを増減させてくれるので負荷のピークとコストは最適に調整することができます。コンテナもAuto Scaleで増減され、ELBの動的ポートマッピングは、利用者からシームレスにバックエンドのコンテナの入れ替えを可能にしてくれる素晴らしい機能です。

ECSでネットワークモードがdefaultの場合、TaskDefinitionで定義された複数のコンテナは、1つのインスタンスでセットで起動されるためクラスタのスケールアウトの恩恵を受けることはできません。また、TaskDefinitionの中の特定のコンテナだけスケールアウトすることもできません。Linksは、相互参照をサポートしないので、コンテナ間で双方向の通信がある場合、DNSやconsulといった、何らかのサービスディスカバリが必要になります。

ECSでネットワークモードにawsvpcを使う場合、コンテナがVPC上のホストのように見えます。コンテナレベルでスケールアウトするには良さそうですが、実装は、EC2インスタンスにENIを追加してコンテナのNICに割り当てているため、EC2インスタンスに追加できるENIの数に制約を受けます。

ECSは、素晴らしいサービスですが、上記のような制約を管理する必要があり、なかなか大変です。

AWS Fargate

Fargateは、ECSのPaaSでEC2インスタンスの管理をなくても良く、課金モデルもEC2インスタンスではなく、コンテナの稼働に対する課金となります。ECSのEC2でAuto Scale、コンテナでもAuto Scaleの二段階のスケールアウトに違和感を感じていたので、リリースされたときには、すごく魅力的に感じました。

実際に動かしてみて、docker exec できないと分かって、使う気持ちがなくなりました。コンテナを使うのに、CloudWatch経由でログを見るしかないのは、ちょっとしんどい... そのためにsshサーバをたてると言うのは本末転倒

Docker Swarm

Docker純正のクラスタでDocker環境に設定すれば利用できるので非常に手軽です。スタックの設定は、docker-composeが、ほぼそのまま使えます。 現時点では、コンテナのスケールを動的に行うスケジューラがないので非常に残念です。 swarm modeは、cap_addをサポートしていないので権限を必要とするコンテナを動かすことはできません。(concourse.ciのworkerは残念ながら動きませんでした。)

kubernetes

Kubernates環境を作成するのが大変そうで、なかなか踏み出せません。 使っていないので、なんともいませんが、ECSやSwarmの制約がないのかな。 GCPやEKSで試す前に、一度、やってみなければ...