Enterprise Distributed Application Service (EDAS) は、Elastic Compute Service (ECS) クラスターと Kubernetes (K8s) クラスターの両方でのアプリケーションデプロイメントをサポートしています。どちらの環境でもアプリケーションをホストできますが、提供される機能は異なります。技術選定やアーキテクチャの移行を行う際に、どちらの環境を選択すべきか迷うことがあるかもしれません。このトピックでは、お客様の意思決定に役立つ推奨事項と機能比較を提示します。
デプロイメント環境の概要
EDAS は、アプリケーション用に ECS と K8s の 2 種類のクラスターデプロイメント環境を提供します。
-
ECS クラスターと K8s クラスターはどちらも、Spring Cloud、Dubbo、または High-Speed Service Framework (HSF) マイクロサービスフレームワークを使用する Java アプリケーションのホスティング、サービス管理、および可観測性をサポートしています。
-
多言語アプリケーションのホスティング、サービス管理、および可観測性をサポートしているのは K8s クラスターのみです。
さらに、2 つのデプロイメント環境では、アプリケーションと技術スタックに対する要件が異なります。EDAS が提供するアプリケーション管理機能も、2 つの環境間で異なります。
デプロイメント環境の選択に関する推奨事項
ほとんどの場合、アプリケーションのデプロイには K8s 環境を使用することを推奨します。EDAS は Alibaba Cloud Container Service for Kubernetes (ACK) と密に統合されており、幅広いアプリケーション管理機能を提供し、より高いリソース使用率を実現します。
ご利用のシナリオに基づいて、適切な環境を選択してください。
|
シナリオ |
環境 |
|
K8s 環境 |
|
ECS 環境 |
すでに ECS 環境を使用してアプリケーションを管理しており、K8s が提供する高度な機能が必要な場合は、アプリケーションを K8s 環境に移行できます。
アプリケーションホスティング機能の比較
次の表は、ECS 環境と K8s 環境の機能を比較したものです。「Y」は機能がサポートされていることを示し、「N」はサポートされていないことを示します。
|
機能 |
ECS 環境 |
K8s 環境 |
備考 |
|
アプリケーションのデプロイ |
Y |
Y |
K8s 環境はより多くのインスタンススケジューリングポリシーをサポートしており、単一ノードに複数のアプリケーションをデプロイできます。 |
|
アプリケーションの開始 |
Y |
Y |
なし |
|
アプリケーションの停止 |
Y |
Y |
なし |
|
アプリケーションの削除 |
Y |
Y |
なし |
|
アプリケーションのスケーリング |
Y |
Y |
なし |
|
アプリケーションのリセット |
Y |
N |
この機能は K8s 環境では必要ありません。アプリケーションをリセットするには、Pod を削除します。 |
|
コンテナのアップグレードまたはダウングレード |
Y |
Y |
なし |
|
アプリケーションのロールバック |
Y |
Y |
なし |
|
自動水平スケーリング |
Y |
Y |
サポートされるメソッドとルールが異なります。 |
|
スケジュールスケーリング |
N |
Y |
なし |
|
段階的リリース |
Y |
Y |
なし |
|
アプリケーション グループ |
Y |
N |
なし |
|
アプリケーション グループ設定 |
Y |
N |
なし |
|
リアルタイムログ |
Y |
Y |
なし |
|
ログディレクトリ |
Y |
Y |
なし |
|
SLS ログ |
Y |
Y |
なし |
|
Server Load Balancer |
Y |
Y |
なし |
|
ヘルスチェック |
Y |
Y |
K8s 環境は readiness プローブと liveness プローブをサポートしており、ECS 環境のヘルスチェックとは異なります。 |
|
JVM パラメータ設定 |
Y |
Y |
なし |
|
Tomcat 設定 |
Y |
Y |
なし |
|
ライフサイクルフック |
Y |
Y |
K8s 環境は PostStart フックと PreStop フックをサポートしており、ECS のものとは異なります。 |
|
環境変数 |
Y |
Y |
なし |
|
カナリアリリース |
Y |
Y |
なし |
|
トラフィック監視 |
Y |
Y |
なし |
|
スロットリングとデグレデーション |
Y |
Y |
K8s 環境では、アプリケーションコードを変更せずにこれを実装できます。 |
|
サービスリストクエリ |
Y |
Y |
なし |
|
設定プッシュ |
Y |
Y |
なし |
|
イベントセンター |
Y |
Y |
なし |
|
通知 |
Y |
Y |
なし |
|
アプリケーション診断 |
Y |
Y |
Kubernetes (K8s) は、より強力で統合されたモニタリング、コントロール、および診断機能を提供します。 |
|
リソース購入 |
Y |
N |
なし |
|
Service Mesh |
N |
Y |
なし |
|
イメージデプロイメントのサポート |
N |
Y |
なし |
|
多言語サポート |
N |
Y |
なし |
|
NAS サポート |
N |
Y |
なし |
よくある質問
ECS 環境の単一ノードに複数のアプリケーションインスタンスをデプロイできますか?
いいえ、できません。この機能が必要な場合は、K8s 環境を使用してください。
ECS 環境に多言語アプリケーションをデプロイできますか?
いいえ、できません。この機能が必要な場合は、K8s 環境を使用してください。
ECS 環境と K8s 環境の OpenAPI オペレーションは同じですか?
ECS 環境と K8s 環境はどちらも開発者ツールをサポートしていますか?
はい、サポートしていますが、設定が異なります。これらの違いにご注意ください。
-
Cloud Toolkit の詳細については、「Cloud Toolkit の概要」をご参照ください。
-
Maven プラグインの詳細については、「toolkit-maven-plugin の概要」をご参照ください。
-
Terraform の詳細については、「Terraform の概要」をご参照ください。
-
Jenkins の詳細については、「Jenkins の概要」をご参照ください。
ECS 環境と K8s 環境はどちらも Apsara DevOps をサポートしていますか?
K8s 環境では、リソースを購入してノードをスケールアウトするにはどうすればよいですか?
K8s 環境では、弾性スケーリングは Pod のスケーリングを指します。通常、これには新しい ECS インスタンス (ノード) の購入や既存のインスタンスの解放は含まれません。
Container Service の機能を使用して、ノードの弾性スケーリングを実装できます。
ECS 環境でマウントスクリプト機能を使用している場合、K8s 環境に移行するにはどうすればよいですか?
ECS アプリケーションのマウントスクリプトは、デプロイメントプロセスの特定のステージで指定されたコマンドを実行するために使用されます。スクリプトは、「インスタンスの準備」、「アプリケーションの開始」、「アプリケーションの停止」、「インスタンスの破棄」の 4 つのライフサイクルステージにマウントできます。
K8s 環境が提供するライフサイクルフックは PostStart と PreStop に限定されており、ECS アプリケーションのライフサイクルに直接対応するものではありません。したがって、マウントスクリプトを使用するアプリケーションを K8s 環境に移行する際には、いくつかの変更を行う必要があります。
-
「インスタンスの準備」ステージの前に実行されるマウントスクリプトについては、Dockerfile に追加してイメージにビルドします。
-
「アプリケーションの開始」ステージの前に実行されるマウントスクリプトについても、Dockerfile に追加してイメージにビルドできます。
Pod にとって、インスタンスの準備とアプリケーションの開始は同じプロセスの一部です。
-
開始ステージの後に実行されるマウントスクリプトについては、PostStart フックで設定します。
-
「インスタンスの停止」ステージの前に実行されるマウントスクリプトについては、PreStop フックで設定します。
-
「インスタンスの停止」ステージの後に実行されるマウントスクリプトについては、アプリケーションのグレースフルシャットダウンプロセス中にクリーンアップタスクを実行します。たとえば、Java ShutdownHook を使用したり、SIGTERM シグナルをリッスンしたりできます。必要に応じて、これらのタスクを PreStop フックに移動することもできます。
-
「インスタンスの破棄」ステージの前に実行されるマウントスクリプトについては、アプリケーションのグレースフルシャットダウンプロセス中にクリーンアップタスクを実行します。たとえば、Java ShutdownHook を使用したり、SIGTERM シグナルをリッスンしたりできます。必要に応じて、これらのタスクを PreStop フックに移動することもできます。
Pod にとって、インスタンスの破棄とインスタンスの停止は同じプロセスの一部です。