25
Jenkins と Amazon ECS ととととととと CI Shigeyuki Azuchi HAW International, Inc 2015.12.12 JAWS-UG 福福福福福福福福福福 AWS 福福福福福福福福

Jenkinsとamazon ecsで コンテナCI

Embed Size (px)

Citation preview

Page 1: Jenkinsとamazon ecsで コンテナCI

Jenkinsと Amazon ECSで

お手軽コンテナ CIShigeyuki Azuchi

HAW International, Inc2015.12.12 

JAWS-UG 福岡ちょっと濃い目に AWSの話をしてみよう

Page 2: Jenkinsとamazon ecsで コンテナCI

コンテナとは?

Page 3: Jenkinsとamazon ecsで コンテナCI

コンテナとは?

ユーザ空間

ハイパーバイザー( Xen)

EC2(カーネル空間)

ユーザプロセス

ユーザプロセス

ユーザ空間

ユーザプロセス

ユーザプロセス

… …

ユーザ空間

EC2(カーネル空間)

ユーザプロセス

ユーザプロセス

ユーザ空間

ユーザプロセス

ユーザプロセス

… …

● VMと違って、起動するプロセスはホスト OS上で直接起動するため、 VMよりオーバヘッドが少なく軽量。

● 通常のプロセスと違ってプロセスの一部がグループ化されてて( Linuxカーネルの cgoupとか使って)、グループ外から隔離されたユーザ空間で動作する。※ chrootに似てるけど chrootはネットワークやプロセスの制限はできない。

● 既に起動済みの OSの上で動作するのでプロビジョニングも高速。

Page 4: Jenkinsとamazon ecsで コンテナCI

コンテナの実装いろいろ

● LXC( Linux Container)Linuxカーネル 2.6.29から利用可能になった cgroupを利用したコンテナ。

● Herokuの dynoHerokuのアプリケーションが実行されるプラットフォーム。LXCをベースにしたコンテナ。

● Docker多分一番シェアがあるコンテナ。初期は LXCに依存していたが、現在は libcontainerに刷新。

Page 5: Jenkinsとamazon ecsで コンテナCI

Amazon ECSとは?

Page 6: Jenkinsとamazon ecsで コンテナCI

Amazon EC2 Container Service

EC2クラスタ上に Dockerのコンテナ群を管理できるサービス

EC2

・・

EC2

・・

EC2

・・

ECS Cluster

ローカルマシンや1台のサーバ上で Dockerコンテナを起動するのは簡単で運用もシンプルだけど、複数のサーバでの運用や特定のスペックを必要とするコンテナの管理をしようとすると専用のオーケストレーションツールが必要になる。

→Amazon ECSで簡単管理!

Page 7: Jenkinsとamazon ecsで コンテナCI

ECSでできること

Page 8: Jenkinsとamazon ecsで コンテナCI

ECSでできること

● DockerサポートAmazon ECS-Optimized Amazon Linux AMIを利用することで Dockerコンテナの環境を自前で用意する必要無し。

●マネージドクラスタクラスタ管理をするのに専用のオーケストレーションツールは不要で、 ECSが全てのクラスタを管理。

●タスクの定義使用する Dockerイメージや、メモリ量、 CPUユニット、データボリューム等を定義したタスクを JSONで定義。

●プログラマブルな API他の AWSサービスと同様 APIを使って ECSの管理が可能。

Page 9: Jenkinsとamazon ecsで コンテナCI

ECSでできること

●スケジューリングリソースの使用状況( CPU、メモリとか)に応じてコンテナを配置するスケジューラが存在。

●コンテナの自動復旧コンテナに異常が発生しても、指定された数のコンテナが常時稼働するよう自動調整。※タスクに定義されたリソース消費量を超えると killされたりするので。

●コンテナのロードバランシングELBと合わせてトラフィックをコンテナ全体に分散。タスク定義で ELBを指定するとスケジューラによって自動的にコンテナが ELBに追加・削除される。( Auto Scaleする訳ではない)

Page 10: Jenkinsとamazon ecsで コンテナCI

ECSでできること

●コンテナの自動アップデートタスク定義を新しいバージョンにするとスケジューラが自動的に更新されたイメージを展開。

●モニタリングタスク、サービス、クラスタ毎にタスクの CPUとメモリを CloudWatchでモニタニング可能。

●リポジトリのサポートDocker Hub以外に任意のプライベート Dockerレジストリをサポート。また Amazon EC2 Container Registryが使えるようになるはず。( EC2 Container Regstryが年内リリースのはず)

Page 11: Jenkinsとamazon ecsで コンテナCI

ECSのコンポーネント

Page 12: Jenkinsとamazon ecsで コンテナCI

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つ以上のコンテナインスタンスを集約したグループ

Page 13: Jenkinsとamazon ecsで コンテナCI

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の使用料。

Page 14: Jenkinsとamazon ecsで コンテナCI

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上で公開されてる。

Page 15: Jenkinsとamazon ecsで コンテナCI

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..

Page 16: Jenkinsとamazon ecsで コンテナCI

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で設定した数のコンテナが常時起動する状態になる。

Page 17: Jenkinsとamazon ecsで コンテナCI

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が生成される。

Page 18: Jenkinsとamazon ecsで コンテナCI

CI環境で ECSを利用

Page 19: Jenkinsとamazon ecsで コンテナCI

CI環境でよくある問題

● Slow Testコードベースが大きくなると、それに合わせてテストコードも肥大化してテストの実行にかかる時間が増えていく。テストが完了するのに 20,30分かかると気軽にテストやデプロイしにくい。

●カオスな実行環境プロジェクトによって言語や実行環境が異なるとテスト環境も異なる。複数のプロジェクトの CIを同じ環境で実行しようとするとバージョンの異なるソフトウェアのインストールや管理がツラい。

Page 20: Jenkinsとamazon ecsで コンテナCI

そんな悩みをコンテナで解決!

Page 21: Jenkinsとamazon ecsで コンテナCI

Jenkins meets Docker

ECSの Dockerコンテナを Slaveノードとして、 Jenkinsの各ジョブを実行できる Plugin

※現状、リージョンの選択ができない( us-east-1のみ)ので東京リージョンで↓稼働させたい場合は、リージョン指定できるようフォークしたので からどう

ぞ。https://github.com/azuchi/amazon-ecs-plugin/tree/support-region-setting

Page 22: Jenkinsとamazon ecsで コンテナCI

Jenkinsのシステム設定

EC2 Container Service

Create Task Definition

Task Definitionの作成と Run Taskを行えるパーミッションのアクセスキーとシークレットアクセスキーを設定。

Page 23: Jenkinsとamazon ecsで コンテナCI

ジョブの設定

ジョブの実行ノードをシステム設定画面で設定したスレーブテンプレートを指定するだけ。

ジョブを実行すると

EC2 Container Service

Run Task

container

Page 24: Jenkinsとamazon ecsで コンテナCI

注意点

● リポジトリへアクセスする際の鍵○ コンテナインスタンスに配置し鍵を共有

コンテナインスタンス起動時の user dataでコンテナインスタンス

上に鍵を配置し、コンテナからはその鍵を参照する。

○ ビルドパイプラインの有効利用

リポジトリからソースを取得するだけの Jobを作成し、成果物を保

→存 下流ジョブでコンテナを起動し、成果物(ソース)をコピーし

てジョブ実行。

● コンテナのリンクは設定できないECSの Task Definitionではリンクするコンテナを設定できるけ

ど、 amazon-ecs-pluginではスレーブの実行に使えるのは単一コンテナ

のみ。

Page 25: Jenkinsとamazon ecsで コンテナCI

まとめ

●並列実行でテストスピード向上各コンテナは独立して動作するので DBまで含めたテストの並列実行も簡単に。

●クリーンな実行環境各ジョブの実行環境を Docker Imageで提供することでJenkinsのマスターノードへの必要なソフトウェアのインストールが不要に。

●テストリソースは ECSがよろしく管理ECSに適切なスペックのコンテナインスタンスを登録しておけば、テスト実行時のコンテナの配備や調整といったメンドクサイことを ECSが肩代わり。