前提
ECSについて学んだことを書いていきます。
本題
サービスとは
タスク定義を手動実行してクラスターにタスクを配置。
手動でタスク定義の画面からタスクを実行。
→実際のサービスでは現実的ではない。
負荷が高まったら人力でオートスケーリング。
タスクを人力監視する。
自動化できるナイスな機能がある。
その機能がサービス。
サービスはタスクを配置し管理する機能のことでタスク定義1に対し、サービスを作成する。
サービスとタスク定義は1対1。
サービスにはタスクをいくつ起動するか数を指定する。
例えば、、、
3つタスクを起動するよう指定した場合。
すると、ECSはクラスターに対してタスクを3つ配置してくれる。
コンテナは6つ起動。
タスクを配置する際にどのような配置するか、優先順位をつけることができる。(配置戦略)
例えば、、、
最低限のタスクが5つの場合。
コンテナが2つ消滅した場合、ECSサービスが自動的に2つタスクを起動。
また、大規模なAZ障害で片方のEC2が停止した場合、リソースが空いている前提で、ECSはもう片方のEC2でタスクを起動する。
サービスはタスクをいくつ起動するか、管理する機能。
ECSはロードバランサーやオートスケーリングと組み合わさったサービス。
どのように組み合わさるのか。
クラスターの土台の上に、タスクを実行する。
タスクにはコンテナが含まれている。
タスクをどのように配置するか管理し、また何個実行するか数を管理する。
サービスはタスクをまとめるレイヤーのものだが、タスクの事項数を指定する、自動でタスクをデプロイするといった特徴がある。
タスク定義を作成して、サービスでタスクの必要数を4に設定して実行する。
EC2のタイプの場合、EC2の上で実行される。
クライアントはどのようにサービスにアクセスするのか。
それにはロードバランサーをサービスに関連づけて使用する。
クライアントはロードバランサーのDNSネームにアクセスする。
このロードバランサーにはALBやNLBの種類があり、通常EC2インスタンスに対してバランシングをするが、ECSで作成するロードバランサーは、サービスと関連付けたタスク全てに対して、トラフィックをバランシングする。
ちなみにコンテナネットワークモードをブリッジすることでホスト側のポートとコンテナ側のポートを紐づけていたが、ホストポートを0にすることで、エフェメラルポート(一時的なポート番号)が割り当てられる。
ロードバランサーにはセキュリティグループをアタッチするが、EC2のセキュリティグループ許可設定で、ロードバランサーがアタッチしているセキュリティグループからの通信を許可しておく。
クライアントは80番ポートで、ロードバランサーのDNSnameに対しアクセスをすると、ロードバランサーは各コンテナへアクセスを振り分けてくれる。
コンテナアップデート方法
バージョン1のコンテナをアップデートしてバージョン2を作成。
このバージョン2をECRにプッシュし、タスク定義のコンテナイメージURIを指定する箇所でバージョンを2に変更する。
そうするとタスク定義のリビジョン番号は増加する。
サービスの設定を更新。
更新時にタスク定義のリビジョンナンバーを2にすることで新しいコンテナがEC2に配置される。
かつロードバランサーは新しいもの古いものの区別なく、各コンテナへ振り分けてくれる。
一定時間経過すると古いコンテナはターゲットグループから削除され、タスクの実行もECSサービスによって停止される。
グループリーンのデプロイ方法
古いコンテナが稼働している環境に、新しいコンテナをデプロイしロードバランサーのトラフィックを送信先を徐々に新しいコンテナへ変えていき、最終的に新しいコンテナのみトラフィックを送信する。
オートスケーリンググループ
クラウドウォッチアラームとスケーリングポリシーを使用し、EC2を増減させる機能のこと。
ECSサービスでは、タスクに対するオートスケーリング機能がある。
タスク個別にオートスケーリングするもの。
EC2とタスク個別とオートスケーリングを組み合わせられる。
オートスケーリングについて、基本的にサービス全体の合算。
サービス全体のCPU使用率、またはメモリ使用率が閾値を超過したらタスクを1つ追加するといった設定ができる。
追加してもまだ高負荷の状態が続き、閾値超過し続けていたら、さらにタスクを1つ投入。
最小値、最大値、希望する数といった設定が可能。
メモリを閾値にする場合、EC2インスタンスに搭載されているメモリの容量はインスタンスタイプによって決まっている。
T3microは2GB、2048MB。
そのため、タスク1つあたり512MBを予約メモリとして割り当てている場合、EC2、1台あたり4つまでしかタスクを配置できない。
あと2個しかタスクを起動できない状態。
この辺りでEC2インスタンスをスケールしたいところ。
そこでReservation系のメトリクスを使用する。
これはクラスター全体に対してメモリ使用率が何パーセント予約されているかといったメトリクス。
この状態だとクラスター全体の4096MBに対し、3072MB、75%使用されているため、MemoryReservationが75%以上になった場合、EC2を1つスケールするよう、スケーリングポリシーを設定することでタスクを最大値の10までクラスターやタスクのスケールアウトを伴って高負荷の状態を乗り切ることができる。
高負荷の状態が治ったらスケールインする設定も忘れずに行う。
Reservation系のメトリックスはCPUもある。