マラソンとメソスによるシンプルなジェンキンスパイプライン

MarathonとMesosを使用したシンプルなJenkinsパイプライン

1. 前書き

この記事では、JenkinsMarathonMesosを使用した単純な継続的デリバリーパイプラインを実装します。

まず、テクノロジースタックとアーキテクチャの概要を説明し、すべてがどのように組み合わされるかについて説明します。 その後、実用的なステップバイステップの例に移ります。

この結果は、Marathonを使用してMesosクラスターにアプリケーションを展開する、完全に自動化されたJenkinsパイプラインになります。

2. テクノロジースタックの概要

コンテナとマイクロサービスアーキテクチャを使用する場合、従来のスタックでは実行できなかった新しい運用上の問題に直面します。

たとえば、クラスターにデプロイする場合、スケーリング、フェイルオーバー、ネットワーキングなどに対処する必要があります。 これらの困難な分散コンピューティングの問題は、Apache MesosやMarathonなどの分散カーネルとスケジューラで解決できます。

2.1. Mesos

Mesosは、最も簡単に言えば、アプリケーションが実行される単一のサーバーと見なすことができます。 実際にはクラスターがありますが、この抽象化が非常に便利です。

2.2. マラソン

Marathonは、アプリケーションをMesosにデプロイするために使用されるフレームワークであり、困難な問題(ヘルスチェック、自動スケーリング、フェイルオーバー、モニタリングなど)を解決します。

3. セットアップとインストール

この記事では、すでにJenkins、Mesos、およびMarathonが実行されていることを前提としています。 そうでない場合は、それぞれの公式ドキュメントを参照して、設定方法を確認してください。 これがないと、ガイドのどの手順も実装できません。

4. 私たちの配送パイプライン

次のJenkinsパイプラインを作成します。

 

image

このアプローチについて特に複雑なことは何もありません。これは、最新のCDパイプラインのフローと同義です。 私たちの場合、ビルドとはアプリケーションのコンテナ化を意味し、デプロイとはMarathonを使用してMesosクラスタ上でスケジュールすることを意味します。

5. アプリケーションのテストと構築

最初のステップは、アプリケーションをビルドしてテストすることです。 物事をシンプルに保つために、作業するアプリケーションはSpring Bootアプリケーションです。 このため、結果のアーティファクトは実行可能jarになります。 JRE以外の外部依存関係がないため、実行が非常に簡単です。

5.1. 私たちの仕事を作成する

私たちが最初にやりたいことは、ジェンキンスの仕事を作ることです。 左側のナビゲーションバーで[新しいアイテム]を選択してから、[フリースタイルプロジェクトの作成]を選択して、「marathon-mesos-demo:という名前を付けます。

image

5.2. Gitとの統合

次に、アプリケーションを含むclone the Github repositoryに構成しましょう。

image

簡単にするために、リポジトリは公開されています。つまり、https.を介してクローンを作成できます。そうでなく、SSHを介してクローンを作成した場合は、SSHを設定するための追加の手順があります。この記事の範囲を超えたユーザーと秘密鍵。

5.3. ビルドトリガーの設定

次に、ビルドトリガーをいくつか設定して、ジョブがgitをポーリングして新しいコミットを毎分取得するようにします。

image

5.4. ビルドスクリプトの生成

これで、実行時にシェルスクリプトを実行するようにジョブに指示できます。 単純なSpringBoot Mavenプロジェクトで作業しているので、実行する必要があるのはコマンド「mvn clean install」を実行することだけです。 これにより、すべてのテストが実行され、実行可能jar:がビルドされます。

image

5.5. プロジェクトの構築

これでパイプラインの開始が設定されました。ジョブで[今すぐビルド]をクリックして手動でトリガーしましょう。 ジョブが終了したら、青でマークされて合格したことを確認できます。

6. アプリケーションのコンテナ化

パイプラインの次の段階、つまりアプリケーションをパッケージ化してDockerで公開する段階に進みましょう。 コンテナはMarathonが管理するものであるため、Dockerを使用する必要があります。 事実上すべてがコンテナ内で実行できるため、これは不合理ではありません。 Marathonのようなツールは、これらによって付与された抽象化を使用する方が簡単です。

6.1. Dockerfileの作成

まず、プロジェクトルートにDockerfileを作成しましょう。 基本的に、Dockerfileは、イメージの作成方法に関するDockerデーモンへの指示を含むファイルです。

FROM openjdk:8-jre-alpine
ADD target/mesos-marathon-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8082
ENTRYPOINT ["java","-jar","/app.jar"]

作成するイメージはシンプルです。含まれるのは、実行可能jarと、コンテナの起動時に実行するシェルコマンドだけです。 また、アプリケーションがリッスンするポート(この場合は「8082」)を公開していることを確認する必要があります。

6.2. 画像の公開

イメージをビルドできるようになったので、イメージをビルドしてプライベートDocker Hubリポジトリに公開する簡単なbashスクリプトを作成し、プロジェクトルートに配置します。

#!/usr/bin/env bash
set -e
docker login -u example -p $DOCKER_PASSWORD
docker build -t example/mesos-marathon-demo:$BUILD_NUMBER .
docker push example/mesos-marathon-demo:$BUILD_NUMBER

画像を公開ドッカーレジストリまたはプライベートレジストリにプッシュする必要がある場合があります。

$BUILD_NUMBER環境変数は、ビルドごとに増分して、Jenkinsによって入力されます。 わずかに脆弱ですが、各ビルドのバージョン番号を迅速に増やす方法です。 $DOCKER_PASSWORDにもJenkinsが入力されます。この場合、EnvInject pluginを使用して秘密にします。

このスクリプトをJenkinsに直接保存することもできますが、プロジェクトの他の部分と一緒にバージョン管理および監査できるため、バージョン管理を維持することをお勧めします。

6.3. Jenkinsでの構築と公開

次に、jarをビルドした後に「Dockerise.sh」を実行するようにJenkinsジョブを変更しましょう。

 

image

次に、ジョブを実行してもう一度確認し、青くなることですべてが機能していることを確認します。

7. イメージの展開

パイプラインはほぼ完成しています。 あと1つしかありません。それは、Marathonを使用してアプリケーションをMesosクラスターにデプロイすることです。

Jenkinsには「https://wiki.jenkins-ci.org/display/JENKINS/Marathon+Plugin[Deploy with Marathon]」プラグインが付属しています。 これは、Marathon APIのラッパーとして機能し、従来のシェルスクリプトを使用する場合よりも簡単になります。 プラグインマネージャー経由でインストールできます。

7.1. Marathon.Jsonファイルの作成

Marathonプラグインを使用する前に、「marathon.json」ファイルを作成し、プロジェクトルートに保存する必要があります。 これは、プラグインがそれに依存しているためです。

このファイル:「marathon.json」にはMesos Application Definitionが含まれています。 これは、実行する長期実行サービス(アプリケーション)の説明です。 最終的に、Jenkins Marathonプラグインは、ファイルの内容をMarathon/v2/appsエンドポイントにPOSTします。 次に、Marathonは、定義されたアプリケーションをMesosで実行するようにスケジュールします。

{
  "id": "mesos-marathon-demo",
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "",
      "network": "BRIDGE",
      "portMappings": [
        { "containerPort": 8082, "hostPort": 0 }
      ]
    }
  }
}

これは、コンテナ化されたアプリケーションに提供できる最も単純な構成です。

Mesosスレーブからアプリケーションにアクセスできるようにするには、プロパティ「portMappings」を正しく設定する必要があります。 これは基本的に、コンテナポート8082をホスト(mesosスレーブ)のランダムポートにマップして、外部からアプリケーションと通信できるようにすることを意味します。 アプリケーションをデプロイした後、Marathonはそのポートが使用したものを教えてくれます。

7.2. マラソン展開ビルドステップの追加

MarathonDeploymentのビルド後のアクションをジョブに追加しましょう。

image

Marathonが実行されている場所(この場合は「localhost:8081」)をプラグインに通知していることに注意してください。 また、デプロイするイメージも伝えています。 これは、ファイルの空の「画像」フィールドが置き換えられるものです。

これでパイプラインの最終段階が作成されました。もう一度ジョブを実行して、まだ通過していることを確認しましょう。今回は、アプリケーションをMarathonに送信する追加の手順を実行します。

7.3. マラソンでの展開の確認

デプロイされたので、MarathonUIを見てみましょう。

 

image

ご覧のとおり、アプリケーションはUIに表示されません。 これにアクセスするには、割り当てられているホストとポートを確認するだけです。

image

この場合、ローカルホストのポート31143がランダムに割り当てられ、アプリケーション定義で構成されているように、コンテナのポート8082に内部的にマッピングされます。 ブラウザでこのURLにアクセスして、アプリケーションが正しく配信されていることを確認できます。

8. 結論

この記事では、Jenkins、Marathon、Mesosを使用してシンプルな継続的デリバリーパイプラインを作成しました。 コードに変更をプッシュするたびに、数分後に環境で実行されます。

このシリーズの後半の記事では、アプリケーションのヘルスチェック、スケーリング、フェイルオーバーなど、Marathonのより高度なトピックを取り上げます。 バッチ処理など、Mesosのその他のユースケースも対象となります。

このアプリケーションのソースコードはover on GitHubで入手できます。これは、そのまま実行できるはずのMavenプロジェクトです。