修Tweet連載4回目となる今回は、OpenShiftにおけるProjectの解説、イメージのビルドやデプロイについて学びます。イメージを自分で作成する:PaaSとしての利用すでにあるイメージを使って運用していくだけなら、Kubernetesの機能だけでも十分かもしれません。Service)としての側面も持っています。ここではすべてを紹介しきれませんが、特にJavaのS2Iビルドの例を詳しく見ていきます。S2Iビルドとはあるプログラミング言語で書かれたアプリケーションの最終的なイメージを作るにあたって必要なものとしては、以下のようなものがあげられます。ベースとなるOSそのプログラミング言語の実行環境(コンパイル型の言語であれば加えてビルド環境)アプリケーションが利用するフレームワークそこで、開発者が書くソースコードを除いて必要なものすべてをビルダーイメージとしてあらかじめ用意し、あとはソースコードを入力として加えるだけで最終イメージを生成する仕組みを用意しました。Image)ビルドです。S2Iのビルダーイメージは、主要なプログラミング言語についてそれぞれ用意されており、各言語においてデファクトスタンダートとなっているビルドツールに対応しています。JavaであればMavenのpom.xmlファイルを、JavaScriptであればNPMのpackage.jsonファイルを自動で認識し、ビルドを行い、その結果できたアプリケーションを直接起動するイメージを生成します。ビルドや起動に必要な手順は、各ビルダーイメージ内にあるスクリプトにあらかじめ用意されており、アプリケーションのビルド環境およびランタイムの提供と、ソースコードの準備という二つの役割が、綺麗に分離されています。S2Iビルドをセットアップすると、ソースコードの更新をトリガーにして最終生成物であるアプリケーションイメージのデプロイまでが一気に自動化されます。ビルダーイメージの方も必要に応じて更新されていきます。Hatがメンテナンスしており、使用しているツールのバージョンアップやセキュリティフィクスのリリースに応じてビルダーイメージが更新され、同じようにアプリケーションイメージのビルドがトリガーされて結果を素早く確認できます。Bootアプリケーションを例にとって、S2Iビルドの具体例を見ていきましょう。プログラムのソースコードの用意ここではMavenのアーキタイプという機能を利用して、アプリケーションの原形を一気に生成してしまいます。-DartifactId=sample-jettyこれだけで、シンプルではあるものの完動するJavaのWebアプリケーションができます。実際にビルドして動作確認してみます。World」と返すだけのものです。それではビルドはこの後OpenShiftに任せますので、先に進む前にここでの作業物を掃除しておきましょう。cleanJavaのS2Iビルド新しくOpenShiftのプロジェクト「my-javatest」を作成して、同じことをJavaのビルダーイメージを使ったS2Iビルドでやってみます。GitHub等には上げておらにず、ローカルにしかないソースファイルですので、入力としてローカルファイルが使えるようにバイナリービルドを行います。successfulコマンドとオプションの解説を行います。new-buildコマンドでは、生成されるBuildConfigリソースの名前が「builder」になるように--nameオプションを付けています。--strategy=sourceがS2Iビルドの、--binaryがバイナリービルドの指定です。最後のオプション「java:8」が、使用するビルダーイメージのImageStreamTagになります。openshift」で確認できます。new-buildコマンドは「openshift」プロジェクトにあるビルダーイメージ(tagsに「builder」があるもの)を探しに行くようになっていますので、このコマンドには名前空間を指定する-nオプションは不要です。start-buildコマンドを実行しています。バイナリービルドですので、ビルドの入力となる材料を--from-dirオプションで指定しています。このコマンド実行後に、OpenShiftにビルド用のPodが作られてそこでMavenビルドが行われます。allを実行して、OpenShiftプロジェクトにおけるビルドの成果物を確認してみます。new-appを実行した時には、DeploymentConfig、ReplicationController、Podの3階層のリソースができたことを覚えているでしょうか。それと同様にビルドの時には、BuildConfig、Build、Podの3階層のリソースが作成されます。DeploymentConfigの場合は稼働し続けるPodを管理するのが基本であるのに対し、BuildConfigではビルドを行う一回きりのPodを管理するという違いがあります。ビルドの最終的な生成物はImageStreamであり、上記の出力の最下行に表示されています。ImageStream(より正確にはその一部としてのImageStreamTag)の背後には、それが参照する内部レジストリにあるDockerイメージがあります。それではビルドしたイメージが正しく動作しているか確認してみましょう。new-appコマンドには引数にそれを与えるだけで済みます。World」が返ってきましたので、正常に動作していると言えるでしょう。start-buildコマンドでビルドを開始できます。今のままでは、ビルドのたびにすべてのMavenアーティファクトをダウンロードしにいくため、非常に時間がかかってしまいます。これはビルドの再現性の高さを確認するのにはいいですが、普段の開発には向いていません。そこでS2Iのビルダーイメージでは、ビルドの中間生成物(Javaの場合はMavenのローカルリポジトリである「.m2」ディレクトリ)を次のビルド用Podにコピーするためのスクリプトが用意されています。インクリメンタルビルドを有効化すると、そのスクリプトが機能するようになります。editコマンドで直接編集します。true」を追加して保存して下さい。ついでにJavaのソースファイルも編集して、メッセージを少し変えてみましょう。"!!!"を追加する(...)それではビルドを開始します。今度は大量のMavenアーティファクトのダウンロードがログに出ないことを確認できるはずです。World!!!メッセージの結果も変っており、新しいソースコードが使われたことが分ります。S2IビルドのカスタマイズS2Iビルドの秘密は、ビルダーイメージに埋め込まれたいくつかのスクリプトにあります。そのスクリプトがどこにあるかを、ImageStreamTagの出力から確認してみましょう。io.openshift.s2i.scripts-url=image:///usr/local/s2iS2Iのビルダーイメージは、そのDockerfileにおけるLABELインストラクションでいくつかのラベルを指定することで自分を区別しています。「io.openshift.s2i.scripts-url」のラベルには、S2Iスクリプトのパスが格納されています。rshコマンドで入ってそれらのスクリプトを確認することもできますが、対象のイメージにはlessのような基本的なコマンドも入っていませんので、何かと不便です。cpコマンドを使ってPodからファイルをコピーし、ローカルのマシンでゆっくり確認するのがいいでしょう。usageこれらのスクリプトファイルのうち、S2Iビルドにおいて必須とされているのがassembleとrunです。assembleとrunがそれぞれどういう役割を担っているかは、通常のDockerfileを書くときを思い出せば明確になります。Dockerfileでは、RUNやCOPYといったインストラクションを実行するたびにレイヤーができて、イメージのサイズを大きくしてしまいます。そこでRUNインストラクションでは実行したいコマンドを無理に「&&」でつなげて一つのレイヤーにしてしまうことが慣習になっていますが、これでは可読性を損ねてしまいます。結果的に、RUNインストラクションで実行したい内容はすべてスクリプトファイルに外出しするという折衷案ができました。その外出しされたスクリプトがassembleに相当します。Javaのビルダーイメージのassembleスクリプトの場合は、pom.xmlを認識してmvnコマンドを実行するといった複雑な処理を一手に担っているのです。runスクリプトも同様です。Dockerfileで最後に書くCMDやENTRYPOINTインストラクションで何か複雑なことをしたい場合は、これもスクリプトに外出しすることになります。それに相当するのがrunスクリプトなのです。他に、save-artifactsスクリプトは必須ではありませんが、前述のインクリメンタルビルドを有効に機能させるにはこれも必要になってきます。これらのスクリプトは、ソースファイルに「.s2i/bin」というディレクトリを作り、そこに同名のスクリプトを置くことで上書きできます。ここでは、assembleを上書きしてそれが実際にビルド時に呼ばれていることを確認する例を載せておきます。まともなassembleスクリプトをすべて書くのは大変ですので、実際の処理はすべてオリジナルの/usr/local/s2i/assembleに委譲しています。CALLED===(...)チェーンビルドいま実行しているbuilderイメージには、アプリケーションの実行には不必要なファイルも多く含まれています。mvnコマンドは明らかに実行には必要ありませんし、ビルドの中間生成物も不要です。最終的な実行のために配布するイメージのサイズを小さくするために、もう一段階別のBuildConfigを設けて、小さなruntimeイメージを作ってみましょう。このような多段階のビルドは、チェーンビルドやマルチステージビルドと呼ばれています。builderで作成されたリソースを削除しておきます(そのままでも特に問題はありません)。builder」で作成された「builder」のBuildConfigやImageStreamはまだ残っているはずです。そのイメージから必要なファイルを抜き取る形で、新しい「runtime」イメージを作ります。new-buildで済みます。/deployments/runtime.jarEOSオプションの説明を行います。--name=runtimeと指定していますので、できあがるBuildConfigの名前は「runtime」になります。bc/runtime」も実行して下さい。--source-imageと--source-image-pathで、指定したイメージの指定したパスにあるファイル(/deployments/sample-jetty-1.0-SNAPSHOT.jar)を、ビルドコンテキストのカレントディレクトリ(コロンの後の「.」)にコピーしています。--dockerfile=-で標準出力からDockerfileを読み込むようにし、Dockerビルドを行うように指示しています。Hubにある最新のFedoraで、さらにパッケージのアップデートを行い、Javaプログラムの実行に必要なパッケージ(java-1.8.0-openjdk-headless)だけをインストールしています。-jar`コマンドでそれを実行しています。それではできたImageStreamを使ってデプロイしてみましょう。World!!!」のメッセージが返るのを確認できるはずです。start-buildを実行しなくとも、自動でビルドが始まっていました。start-buildが必要なのは--binaryを指定したバイナリービルドだけで、様々なイベントをトリガーにして自動でビルドが始まるのが通常です。上記の例では、ビルドに必要なソースはすべてコマンドラインとビルド済みのイメージから取得できますので、ローカルファイルを供給するバイナリービルドは使っていません。ビルドが何によってトリガーされるかは、BuildConfigの内容をYAML形式で出力させ、「triggers:」の配列を見れば分かります。ConfigChange」があります。これが、このBuildConfigに変更があった時にビルドをトリガーする設定です。new-buildコマンドだけでもビルドがトリガーされたのです。ImageChange」のところでbuilderイメージが指定されています。これによりbuilderイメージの変更を検知して、自動でruntimeイメージもビルドされます。--follow」を実行して動作を確認してみて下さい。GitHub」から推測できるように、ソースコードをGitHubに上げて、ビルドのソースとしてインターネット上のそのリポジトリを指定して利用することもできます。GitHubにはWebhookを設定できますので、GitHubへのコミットをトリガーにしてビルドを開始することもできるのです。GitHubのWebhookを利用するには、OpenShiftクラスタが外部からもアクセスできるよう公開されていることが必要になります。Minishiftでは使えません。詳しい設定に関しては、下記のドキュメントをご覧下さい。コンサルタント金融とITの共通分野でキャリアを築くことを決意し、転職を繰り返して米系大手投資銀行でポータル開発の職にたどりつくも、リーマンショックであえなく撃沈。今はIT一本に絞って、JBossミドルウェアやOpenShiftの案件をデリバリしている。何らかのOSSプロジェクトにもっと具体的な貢献をしたいと思いつつ、めまぐるしく変わっていく流行りの技術に流され気味。ブロックチェーンに手を出す気がしている。第5回OpenShift:アプリケーションの構成と運用2019/3/28連載5回目となる今回は、OpenShiftでデプロイしたアプリケーションの運用に関するトピックを紹介する。第4回Projectとアプリケーションデプロイ2019/1/18連載4回目となる今回は、OpenShiftにおけるProjectの解説、イメージのビルドやデプロイについて学びます。開発環境の準備とOpenShiftへのアクセス2018/12/20連載3回目となる今回は、OpenShiftの学習と開発のための環境を準備する手順を紹介いたします。ITでは、より付加価値の高いコンテンツを会員サービスとして提供しています。ITのWebサイトにログインすることでさまざまな限定特典を入手できるようになります。Americaサンディエゴで開催。VeloCloudが選ばれる理由SD-WANとはなにか。Linuxエンジニア育成への思いF5とNGINXの組み合わせで、サービス公開をよりセキュアに。ITがお届けするポッドキャストです。