AWS ECS vs. Kubernetes 〜コンテナオーケストレーションプラットフォームの比較〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/8fb9b3ef-756c-850d-a616-a370894b9766.png)


#はじめに

コンテナを使用することで大きな利点を与えてくれる一方で、その環境を増やすことは、それと同時に難しい選択を迫られるということでもあります。私たちは、自分たちの状況に最適なオーケストレーションツールは何か、そしてシステムをどのように監視するかについて考えていく必要があります。 Dockerはコンテナーランタイムの標準ですが、コンテナーオーケストレーションツールから選択するオプションは複数あります。これらのリーダーは、AmazonのElastic ContainerServiceとCNCFのKubernetesです。実際、調査によると、企業の83％がコンテナオーケストレーションソリューションとしてKubernetesを使用しているのに対し、ECSは24％にとどまっています。

この記事では、[MetricFire](https://www.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=AWS%20ECS%20vs.%20Kubernetes)のコミュニティメンバーがKubernetesとAWSECSの両方について解説していきます。モニタリングの観点から、GrafanaとPrometheusはKubernetesに大きく利点があり、Kubernetesのサポートが多数利用可能ですが、AWSECSを使用することについてに議論は続けられるべきです。[無料トライアル](https://www.hostedgraphite.com/signup?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=AWS%20ECS%20vs.%20Kubernetes)でプラットフォームにアクセスすると、両方のオーケストレーションプラットフォームから送信されたメトリックを試してみることができます。

この記事では、ECSとKubernetesを比較対照して、ユーザーがどちらを使用するかを決定できる判断材料を提供していきます。

#コンテナオーケストレーションにKubernetesを使用する利点

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/272425c5-1a26-4c74-8843-ee819fa32e88.png)

####1. ロックインなしの完全にオープンなソース

Kubernetesは、コンテナオーケストレーション戦略を再構築することなく、オンプレミスまたはクラウドの両方で使用できます。 ソフトウェアは完全にオープンソースであり、従来のソフトウェアライセンス料を負担することなく再展開できます。 パブリッククラウドとプライベートクラウドの両方でKubernetesクラスターを実行して、パブリックリソースとプライベートリソースの間に仮想化のレイヤーを提供することもできます。
 
####2.  強力な柔軟性

さらに、収益を生み出す重要なアプリケーションがある場合、Kubernetesは、効率とスケーラビリティの必要性を犠牲にすることなく、高可用性の要件を満たすための優れた方法です。 Kubernetesを使用すると、ワークロードのスケーリング方法をきめ細かく制御できます。 これにより、より強力なプラットフォームに切り替える必要がある場合に、ECSまたはその他のコンテナサービスによるベンダーロックインを回避できます。

####3. 高可用性：

Kubernetesは、アプリケーションとインフラストラクチャの両方の可用性に取り組むように設計されているため、本番環境にコンテナをデプロイする際に不可欠です。

- **ヘルスチェックと自己修復：** Kubernetesは、ノードとコンテナーのヘルスを常にチェックすることで、コンテナー化されたアプリケーションを障害から保護します。 Kubernetesは、自己修復と自動置換も提供します。エラーが原因でコンテナまたはポッドがクラッシュした場合、Kubernetesが対応します。

- **トラフィックルーティングと負荷分散：** トラフィックルーティングは適切なコンテナにリクエストを送信します。 Kubernetesには、複数のポッドに負荷を分散するためのロードバランサーも組み込まれているため、停止、ピーク時または偶発的なトラフィック、バッチ処理に対応するために、リソースをすばやく（再）分散できます。 外部ロードバランサーを使用することも可能です。

####4. ワークロードのスケーラビリティ：
Kubernetesは、インフラストラクチャリソースの使用において効率的であることが知られており、スケーリングの目的でいくつかの便利な機能を提供します。

- **水平インフラストラクチャのスケーリング：**Kubernetesは個々のサーバーレベルで動作し、水平スケーリングを実装します。 新しいサーバーは簡単に追加または削除できます。

- **自動スケーリング：**自動スケーリングを使用すると、CPU使用率またはその他のアプリケーション提供のメトリックに基づいて、実行中のコンテナーの数を自動的に変更できます。

- **手動スケーリング：**コマンドまたはインターフェースを使用して、実行中のコンテナーの数を手動でスケーリングできます。

- **レプリケーションコントローラー：**レプリケーションコントローラーは、クラスターで指定された数の同等のポッド（コンテナーのグループ）が実行されていることを確認します。 ポッドが多すぎる場合、ReplicationControllerは余分なポッドを終了します。 数が少なすぎると、より多くのポッドが開始されます。

####5. 展開用に設計：

コンテナ化の主な利点の1つは、ソフトウェアの構築、テスト、およびリリースのプロセスを高速化できることです。 Kubernetesはデプロイ用に設計されており、いくつかの便利な機能を提供します。

- **自動ロールアウトとロールバック：** アプリの新しいバージョンをロールアウトしたり、構成を更新したりしますか？ Kubernetesは、ロールアウト中にコンテナの状態を監視しながら、ダウンタイムなしでそれを処理します。失敗した場合、自動的にロールバックします。

- **カナリアデプロイメント：** カナリアデプロイメントを使用すると、新しいデプロイメントをスケールアップすると同時に以前のデプロイメントをスケールダウンする前に、以前のバージョンと並行して新しいデプロイメントを本番環境でテストできます。

- **プログラミング言語とフレームワークのサポート：**Kubernetesは、Java、Go、.Netなどの幅広いプログラミング言語とフレームワークをサポートしています。Kubernetesは、追加のプログラミング言語とフレームワークを維持している開発コミュニティからも多くのサポートを受けています。アプリケーションをコンテナで実行できる場合は、Kubernetesで正常に実行されるはずです。

####6. サービスの発見可能性：

すべてのサービスが相互に通信する予測可能な方法を持っていることが重要です。ただし、Kubernetes内では、コンテナが何度も作成および破棄されるため、特定のサービスが特定の場所に永続的に存在しない場合があります。これは従来、各コンテナの場所を追跡するために、何らかのサービスレジストリを作成するか、アプリケーションロジックに適合させる必要があることを意味していました。 Kubernetesには、ポッドをグループ化し、サービス検出を簡素化するネイティブサービスの概念があります。 Kubernetesは各ポッドにIPアドレスを提供し、ポッドの各セットにDNS名を割り当ててから、セット内のポッドへのトラフィックを負荷分散します。これにより、サービス検出をコンテナレベルから抽象化できる環境が作成されます。
 
####7. アプリケーションデプロイメントの一部としてのネットワークポリシー：

デフォルトでは、Kubernetesのすべてのポッドが相互に通信できます。クラスター管理者はネットワークポリシーを宣言的に適用でき、これらのポリシーは特定のポッドまたは名前空間へのアクセスを制限できます。基本的なネットワークポリシーの制限は、特定のポッドの出力および入力機能にも指定するポッドまたは名前空間の名前を指定するだけで適用できます。

####8. 長期的なソリューション：

Kubernetesの台頭を考えると、多くのクラウドプロバイダーは、R＆Dの焦点をレガシーオプションよりもマネージドKubernetesサービスの拡張にシフトしています。長期的なIT戦略を策定する際は、Kubernetesを検討してください。
 
####9. 進行中の開発：
最初のリリース後すぐに、Kubernetesは非常に大規模で活発なコミュニティを獲得しました。現在、フォーチュン500企業で働くエンジニアから個々の開発者やエンジニアまで、約2000人のGithubの貢献者がおり、新しい機能が絶えずリリースされています。大規模で多様なユーザーコミュニティも、質問に答え、コラボレーションを促進するために介入します。
 
####10. 活気のあるコミュニティ：
Kubernetesは、CNCFのような主要な企業や機関の支援を受けている、幅広いモジュール式のオープンソース拡張機能を備えたアクティブなコミュニティです。数千人の開発者と多くの大企業がKubernetesに貢献しており、最新のソフトウェアインフラストラクチャに最適なプラットフォームとなっています。これはまた、コミュニティが積極的に協力しているだけでなく、現代の問題を簡単に解決するための機能を構築していることも意味します。

#AWS Elastic ContainerServiceを使用する利点

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/fbd68421-65b9-e7ce-3f60-cbc98720dc35.png)

####1. 従来のECS：

Amazon EC2コンピューティングを搭載-クラウド上でDockerコンテナーを簡単に実行する方法として、2015年にリリースされました。 従来のECSでは、コンテナーのEC2コンピューティングオプションを基本的に制御できます。 この柔軟性は、ワークロードを実行するインスタンスタイプを選択できることを意味します。 また、それらのEC2インスタンスでのアクティビティのモニタリングとロギングに使用される他のAWSサービスに接続します。
 
####2. Fargate ECS：

一方Fargate ECSでは、基盤となるEC2コンピューティングを管理せずにコンテナーを実行する方法として、2017年にリリースされました。 代わりに、Fargateは必要なCPUとメモリの要件を自動的に計算します。 通常、Fargateは、ワークロードをすばやく稼働させる必要があり、基礎となる計算オプションの計算や把握に煩わされたくない場合に適したオプションです。
 
####3. 小さなワークロードに適している：

大幅な拡張が予想されない小さなワークロードを実行する予定の場合は、ECSが適しています。 タスク定義は、登録と理解が容易です。

####4. それほど複雑でないアプリケーションアーキテクチャ：

少数のマイクロサービスのみで構成され、多かれ少なかれ独立して動作するアプリケーションがあり、アーキテクチャ全体がそれほど複雑ではない場合（つまり、外部依存関係が多くないか、可動部分が多すぎる） 、それならECSは最初から良い候補です。
 
####5. より簡単な学習曲線：

Kubernetesには急な学習曲線があります。これが、従来のKubeadmやKOPSフレーバーと比較してHostedkubernetesの提供が成功する主な理由です。 さらに、ECSファーゲートのような製品を使用すると、基盤となるホストについて心配する必要さえありません。 AWSがすべてを処理します。
 
####6. より簡単なモニタリングとロギング：

ECSはAWSCloudwatchのモニタリングとロギングとシームレスに統合されます。 ECSでコンテナワークロードを実行している場合、コンテナワークロードの可視性を構成するために追加の作業は必要ありません。

#Kubernetes採用への課題

####Kubernetesランドスケープを把握する：

エンドツーエンドソリューションを提供するには、他のさまざまなテクノロジーやサービスを含める必要があるため、Kubernetesランドスケープを理解することはそれを開始するための重要な要素です。しかし、各補足技術の状態は大きく異なります。たとえば、一部のソリューションはUnixが最高の時代にまでさかのぼりますが、他のソリューションは1年未満であり、商業的な採​​用とサポートが少ないものです。したがって、実装に安全に含めることができるものを理解することに加えて、各コンポーネントがより大きなソリューションにどのように適合するかを理解する必要があります。これに関する情報やドキュメントはたくさんありますが、散在していて蒸留するのは困難です。その結果、特定の仕事に最適なソリューションを見つけることは困難です。使用するソリューションを特定した後でも、これらをサービスとして提供し、継続的に管理する方法について、しっかりとした計画が必要です。
 
####機能とプロジェクトの違いを理解する：

課題はそれだけではありません。プロジェクトのライフサイクルを管理する方法に関するアドバイスを見つけることは役立ちますが、Kubernetes機能とKubernetesコミュニティプロジェクトを区別する際に発生する混乱を解決することはできません。 Kubernetesのようなオープンソーステクノロジーの優れている点は、ユーザーのコミュニティが革新的な用途を作成して共有できることです。しかし、その同じ利点はまた、水を濁らせる可能性があります。特別利益団体はコアKubernetesに追加される機能を開発できますが、他のスタンドアロンプ​​ロジェクトはコアの外にあります。個々の開発者またはベンダーによって提供されたプロジェクトは、プライムタイムの準備ができていない可能性があります。実際、多くは開発のさまざまな段階にあります。 （注：GitHubにない場合は、Kubernetesの公式機能ではありません。）

####Kubernetes以上の知識を身に付ける：

この混乱はすべて、ソリューションの提供の複雑さによって悪化します。 Kubernetes自体は洗練されています。しかし、組織は、分散データストアをサービスとして提供するなど、他の複雑なソリューションも提供したいと考えています。これらすべてのサービスを組み合わせて管理することで、課題をさらに拡大できます。 Kubernetesのエキスパートである必要があるだけでなく、エンドツーエンドサービスの一部として提供するすべてのことに熟練している必要があります。
 
####Kubernetesの管理は困難

Kubernetesを使用して運用することと、管理することは別です。 Kubernetesで得られるのはKubernetesだけなので、Kubernetesの管理は主に手動の演習です。プラットフォームにはそれを実行するための機能が付属していないため、Kubernetes自体にリソースを運用する方法を理解する必要があります。簡単なことではありません。
企業のニーズに対応する場合は、Kubernetesをセキュリティで強化し、既存のインフラストラクチャと統合する必要があります。アップグレード、パッチ、その他のインフラストラクチャ固有の管理タスクの処理に加えて、Kubernetesを効果的に運用およびスケーリングするには、適切な知識、専門知識、プロセス、およびツールが必要です。 Kubernetesをさまざまな業種やさまざまなユーザーにサービスとして提供するには、次の管理上の課題を解決する必要があることを考慮してください。

- **複数のKubernetesクラスターを管理するのは困難:** 複数のKubernetesクラスターを管理すると、内部チームにさらにプレッシャーがかかり、多大な時間とリソースの投資が必要になります。

- **Kubernetesの監視とトラブルシューティングは困難:** 他の複雑なシステムと同様に、問題が発生する可能性があります。 Kubernetesを使用すると、大規模なテストができず、問題が発生した場合の修正が難しく、アップグレードを自動化できません。

- **大規模なサポートが難しい：** 企業組織にとって、規模は非常に重要です。 しかし、すぐに使用できるKubernetesでスケールをサポートするのは困難です。 複数のクラスターのバージョン管理は時間がかかり、困難であり、特別なリソース計画が必要です。 さらに、プラットフォームを真にスケーリングするには、構成スクリプトを手動で実行する必要があります。

#まとめ
Kubernetesは、いくつかの欠点はありますが、コンテナオーケストレーションの競争で依然としてリードしていることは、今では非常に明確になっているはずです。正直に言ってしまえば、Kubernetesが明らかに勝者です。 Kubernetesはコンテナオーケストレーションの事実上の標準になり、大小の組織はそれを採用するためにリソースを多額に投資しています。

Amazon ECSは良いオプションですが、多くの場合で不十分です。 適切なツールチェーンを使用すると、Kubernetesの採用はシームレスであるだけでなく、真にクラウドネイティブになるため、将来にも役立ちます。 Kuberentesクラスターとデプロイされたワークロードの可観測性を非常に簡単にするソリューションを数多く提供しています。 監視とログ記録のすべてのニーズについて、必要な場合はお気軽に[MetricFire](https://www.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=AWS%20ECS%20vs.%20Kubernetes)にご連絡ください。喜んでお手伝いさせていただきます。 ビデオ通話での[デモを予約](https://www.metricfire.com/demo-japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=AWS%20ECS%20vs.%20Kubernetes)するか、[無料トライアル](https://www.hostedgraphite.com/signup?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=AWS%20ECS%20vs.%20Kubernetes)にサインオンしてください。カスタマーサポートのチャットボックスから直接お話しいただけます。