Jenkinsとamazon ecsで コンテナCI

  • View
    1.757

  • Download
    3

  • Category

    Software

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