View
1.757
Download
3
Category
Preview:
Citation preview
Jenkinsと Amazon ECSで
お手軽コンテナ CIShigeyuki Azuchi
HAW International, Inc2015.12.12
JAWS-UG 福岡ちょっと濃い目に AWSの話をしてみよう
コンテナとは?
コンテナとは?
ユーザ空間
ハイパーバイザー( Xen)
EC2(カーネル空間)
ユーザプロセス
ユーザプロセス
…
ユーザ空間
ユーザプロセス
ユーザプロセス
… …
ユーザ空間
EC2(カーネル空間)
ユーザプロセス
ユーザプロセス
…
ユーザ空間
ユーザプロセス
ユーザプロセス
… …
● VMと違って、起動するプロセスはホスト OS上で直接起動するため、 VMよりオーバヘッドが少なく軽量。
● 通常のプロセスと違ってプロセスの一部がグループ化されてて( Linuxカーネルの cgoupとか使って)、グループ外から隔離されたユーザ空間で動作する。※ chrootに似てるけど chrootはネットワークやプロセスの制限はできない。
● 既に起動済みの OSの上で動作するのでプロビジョニングも高速。
コンテナの実装いろいろ
● LXC( Linux Container)Linuxカーネル 2.6.29から利用可能になった cgroupを利用したコンテナ。
● Herokuの dynoHerokuのアプリケーションが実行されるプラットフォーム。LXCをベースにしたコンテナ。
● Docker多分一番シェアがあるコンテナ。初期は LXCに依存していたが、現在は libcontainerに刷新。
Amazon ECSとは?
Amazon EC2 Container Service
EC2クラスタ上に Dockerのコンテナ群を管理できるサービス
EC2
・・
EC2
・・
EC2
・・
ECS Cluster
ローカルマシンや1台のサーバ上で Dockerコンテナを起動するのは簡単で運用もシンプルだけど、複数のサーバでの運用や特定のスペックを必要とするコンテナの管理をしようとすると専用のオーケストレーションツールが必要になる。
→Amazon ECSで簡単管理!
ECSでできること
ECSでできること
● DockerサポートAmazon ECS-Optimized Amazon Linux AMIを利用することで Dockerコンテナの環境を自前で用意する必要無し。
●マネージドクラスタクラスタ管理をするのに専用のオーケストレーションツールは不要で、 ECSが全てのクラスタを管理。
●タスクの定義使用する Dockerイメージや、メモリ量、 CPUユニット、データボリューム等を定義したタスクを JSONで定義。
●プログラマブルな API他の AWSサービスと同様 APIを使って ECSの管理が可能。
ECSでできること
●スケジューリングリソースの使用状況( CPU、メモリとか)に応じてコンテナを配置するスケジューラが存在。
●コンテナの自動復旧コンテナに異常が発生しても、指定された数のコンテナが常時稼働するよう自動調整。※タスクに定義されたリソース消費量を超えると killされたりするので。
●コンテナのロードバランシングELBと合わせてトラフィックをコンテナ全体に分散。タスク定義で ELBを指定するとスケジューラによって自動的にコンテナが ELBに追加・削除される。( Auto Scaleする訳ではない)
ECSでできること
●コンテナの自動アップデートタスク定義を新しいバージョンにするとスケジューラが自動的に更新されたイメージを展開。
●モニタリングタスク、サービス、クラスタ毎にタスクの CPUとメモリを CloudWatchでモニタニング可能。
●リポジトリのサポートDocker Hub以外に任意のプライベート Dockerレジストリをサポート。また Amazon EC2 Container Registryが使えるようになるはず。( EC2 Container Regstryが年内リリースのはず)
ECSのコンポーネント
ECS Cluster
Container InctanceEC2
ECS Agent
Task
container
container
Container InctanceEC2
ECS Agent
Task
container
container
・・・
Task Definition Service
EC2 Container Service
ECS Cluster
【 ECS Cluster】1つ以上のコンテナインスタンスを集約したグループ
Container InctanceEC2
ECS Agent
Task
container
container
Container InctanceEC2
ECS Agent
Task
container
container
・・・
ECS Cluster
Task Definition Service
EC2 Container Service
Container Instance
【 ECS Container Instance】● ECSクラスタに登録されている EC2インスタンス。● コンテナインスタンス用の AMIを使って起動する
ECSクラスタを指定して起動するか、 AutoScallingによって起動。
● 起動するとデフォルトで Dockerと ECS Agentが起動し、クラスタに登録される。
● 課金も基本的には EC2の使用料。
Container InctanceEC2
ECS Agent
Task
container
container
Container InctanceEC2
ECS Agent
Task
container
container
・・・
ECS Cluster
Task Definition Service
EC2 Container Service
ECS Agent
【 ECS Agent】● ECSインスタンス上で稼働する Agent。● サポートしてるのは EC2インスタンスのみなので、ローカルマシンとかにインストールしてもクラスタに参加はできない。
● クラスタにインスタンスを参加させたり、クラスタで定義されたタスクやサービスをインスタンス上にコンテナを起動して実行する。
● Agent自体も Docker Imageで Docker Hub上で公開されてる。
Container InctanceEC2
ECS Agent
Task
container
container
Container InctanceEC2
ECS Agent
Task
container
container
・・・
ECS Cluster
Task Definition Service
EC2 Container Service
Task Definition
【 Task Definition】以下のような ECSコンテナとして動作するアプリケーションの定義を設定。
● 使用する Dockerイメージ● 各コンテナで使用する CPUユニット、メモリ量● コンテナインスタンスとのポートマッピング● コンテナ内のデータ領域のマウントポイント● リンクするコンテナ● 永続化するデータボリューム● etc..
Container InctanceEC2
ECS Agent
Task
container
container
Container InctanceEC2
ECS Agent
Task
container
container
・・・
ECS Cluster
Task Definition Service
EC2 Container Service
Service
【 Service】バッチジョブのように動作ののち停止するタイプのタスクとはことなり、ずっと起動するアプリケーションの場合、 Serviceとして作成。Desired number of Tasksで設定した数のコンテナが常時起動する状態になる。
Container InctanceEC2
ECS Agent
Task
container
container
Container InctanceEC2
ECS Agent
Task
container
container
・・・
ECS Cluster
Task Definition Service
EC2 Container Service
Task
【 Task】Task Definitionを元にコンテナインスタンスで起動するコンテナアプリケーション。1つの TaskDefinitionから複数の Taskが生成される。
CI環境で ECSを利用
CI環境でよくある問題
● Slow Testコードベースが大きくなると、それに合わせてテストコードも肥大化してテストの実行にかかる時間が増えていく。テストが完了するのに 20,30分かかると気軽にテストやデプロイしにくい。
●カオスな実行環境プロジェクトによって言語や実行環境が異なるとテスト環境も異なる。複数のプロジェクトの CIを同じ環境で実行しようとするとバージョンの異なるソフトウェアのインストールや管理がツラい。
そんな悩みをコンテナで解決!
Jenkins meets Docker
ECSの Dockerコンテナを Slaveノードとして、 Jenkinsの各ジョブを実行できる Plugin
※現状、リージョンの選択ができない( us-east-1のみ)ので東京リージョンで↓稼働させたい場合は、リージョン指定できるようフォークしたので からどう
ぞ。https://github.com/azuchi/amazon-ecs-plugin/tree/support-region-setting
Jenkinsのシステム設定
EC2 Container Service
Create Task Definition
Task Definitionの作成と Run Taskを行えるパーミッションのアクセスキーとシークレットアクセスキーを設定。
ジョブの設定
ジョブの実行ノードをシステム設定画面で設定したスレーブテンプレートを指定するだけ。
ジョブを実行すると
EC2 Container Service
Run Task
container
注意点
● リポジトリへアクセスする際の鍵○ コンテナインスタンスに配置し鍵を共有
コンテナインスタンス起動時の user dataでコンテナインスタンス
上に鍵を配置し、コンテナからはその鍵を参照する。
○ ビルドパイプラインの有効利用
リポジトリからソースを取得するだけの Jobを作成し、成果物を保
→存 下流ジョブでコンテナを起動し、成果物(ソース)をコピーし
てジョブ実行。
● コンテナのリンクは設定できないECSの Task Definitionではリンクするコンテナを設定できるけ
ど、 amazon-ecs-pluginではスレーブの実行に使えるのは単一コンテナ
のみ。
まとめ
●並列実行でテストスピード向上各コンテナは独立して動作するので DBまで含めたテストの並列実行も簡単に。
●クリーンな実行環境各ジョブの実行環境を Docker Imageで提供することでJenkinsのマスターノードへの必要なソフトウェアのインストールが不要に。
●テストリソースは ECSがよろしく管理ECSに適切なスペックのコンテナインスタンスを登録しておけば、テスト実行時のコンテナの配備や調整といったメンドクサイことを ECSが肩代わり。
Recommended