最新式クラウド・ネイティブ・アプリケーションを作成するには、ビジネス・ロジックを適切な場所に組み込むのに最適な方法から、回復力、信頼性、モニタリングに対処する方法などの技術的考慮事項に至るまで、アプリケーションのあらゆる側面を考慮しなければなりません。さらに、アプリケーションをクラウド上あるいは Kubernetes クラスター内で実行する際は、Dockerfile と必要な Kubernetes リソース・ファイルの作成についても対処する必要があります。
アプリケーションのライフサイクル全体にわたってチームがアプリケーションのビルドと実行に責任を持つ DevOps 時代において、クラウド・ネイティブ・アプリケーションのビルドとデプロイに必要となる作業を軽減するためには、最適なツールを選択することが不可欠です。IBM は開発者がクラウド・ネイティブのアプリケーションを簡単にビルドして Kubernetes にデプロイできるよう、Kabanero、Appsody、Codewind という新しいオープンソースのツールを開発しました。
この記事では Kabanero の概要を紹介し、Kabanero を Appsody および Codewind と併せて使用して、Kubernetes 内で実行される Spring Boot アプリケーションを作成する方法を説明します。
手順を開始する前に、これらの新しいオープンソース・コンポーネントについて簡単に説明します。
- Kabanero は、複数の実証されたオープンソース・プロジェクト (Appsody、Codewind など) を統合して DevOps をサポートするとともに、インフラストラクチャーの観点から必要となる作業を軽減してクラウド・ネイティブの開発をサポートします。
- Appsody は、プロジェクトを作成する際の初期作業を最小限にする、事前定義されたコード・スタックを提供します。現時点で、Appsody は Eclipse MicroProfile、Spring Boot、Quarkus、Node.js、Node.js Express、および Swift アプリケーション用のスタックを提供しています。さらに多くのスタックの開発が現在進められているところです。また、既存のスタックをカスタマイズすることも、新しいスタックを作成することもできます。組織や大規模な開発チームでは、これらのスタックを使用することで、アプリケーション構造の最低基準を確立できます。
- Eclipse Codewind は、コンテナー内のアプリケーションをビルド、テスト、デプロイするために使用できる IDE 拡張機能です。現在使用している IDE をそのまま使って作業できるため (現時点では Eclipse、Eclipse Che、VSCode がサポートされています)、コンテナー環境を熟知する必要さえありません。
このチュートリアルでは、以下のバージョンを使用しました。
- Knative: v0.7
- Appsody: v0.4.5
- Codewind: v0.4.0
前提条件
このチュートリアルの手順に従うには、お使いのシステムに以下のツールがインストールされて実行中になっている必要があります。
- Docker
- ローカルにインストールされた Kubernetes、または IBM Cloud Kubernetes サービス。Kubernetes v1.11 以降が必要です。
- Knative。ローカルでのセットアップ手順、または IBM Cloud 上でのセットアップ手順を参照してください。
- Appsody と Codewind。以下のセクションでインストール方法を説明します。
インストール
Codewind 拡張機能をインストールした VSCode を使用して、ローカル Kubernetes クラスター内でサンプル・アプリケーションを実行します。IBM Cloud Kubernetes サービスまたは OpenShift クラスターにも同じ手法を適用できます。
- Appsody CLI をインストールします。
- VSCode Marketplace から Codewind をインストールします (Marketplace を表示して、「Codewind」を検索するだけでインストールできます)。Codewind をインストールすると、いくつかの Docker イメージと Appsody プラグイン もインストールされます。
eclipse/codewind-initialize-amd64 0.4.0 7f31c5b7db69 6 days ago 206MB
codewind-initialize-amd64 0.4.0 7f31c5b7db69 6 days ago 206MB
codewind-performance-amd64 0.4.0 09ac0adfa6b5 6 days ago 86.4MB
eclipse/codewind-performance-amd64 0.4.0 09ac0adfa6b5 6 days ago 86.4MB
codewind-pfe-amd64 0.4.0 224a9df6df08 6 days ago 706MB
eclipse/codewind-pfe-amd64 0.4.0 224a9df6df08 6 days ago 706MB
Appsody を使用して Spring Boot プロジェクトを作成する
新しい Spring Boot プロジェクトを作成するには、Appsody に用意されている java-spring-boot2
スタックを使用できます。
Appsody のスタックは Kubernetes アプリケーションの基盤を表し、ベース・コンテナー・イメージとプロジェクト・テンプレートからなります。プロジェクト・テンプレートではスタック内のベース・コンテナー・イメージと指定のランタイムおよび依存関係が使用されるため、簡単にプロジェクトを開始できます。
現在のデフォルトのスタック・リポジトリーは、ここで確認できます。他のリポジトリーを追加することもできます。
ここでは新しいプロジェクトを作成するために、Appsody の Spring Boot 2 スタックを使用します。使用可能なスタックを確認するには、appsody list
コマンドを使用します。
$ appsody list
Your default repository is now set to appsodyhub
REPO ID VERSION TEMPLATES DESCRIPTION
*appsodyhub java-microprofile 0.2.14 *default Eclipse MicroProfile on Open Liberty & OpenJ9 using Maven
*appsodyhub java-spring-boot2 0.3.14 *default, kotlin Spring Boot using OpenJ9 and Maven
*appsodyhub nodejs 0.2.5 *simple Runtime for Node.js applications
*appsodyhub nodejs-express 0.2.6 *simple, skaffold Express web framework for Node.js
*appsodyhub nodejs-loopback 0.1.4 *scaffold LoopBack 4 API Framework for Node.js
*appsodyhub python-flask 0.1.3 *simple Flask web Framework for Python
*appsodyhub swift 0.1.4 *simple Runtime for Swift applications
Spring Boot 2 テンプレートを使用して、空のディレクトリー内に新しいプロジェクトを作成します。それには、使用するスタックを指定して appsody init
コマンドを実行します。
$ mkdir kabanero-test-springboot2
$ cd kabanero-test-springboot2
$ appsody init java-spring-boot2
Running appsody init...
Downloading java-spring-boot2 template project from https://github.com/appsody/stacks/releases/download/java-spring-boot2-v0.3.14/incubator.java-spring-boot2.v0.3.14.templates.default.tar.gz
Download complete. Extracting files from java-spring-boot2.tar.gz
Setting up the development environment
Running command: docker pull appsody/java-spring-boot2:0.3
Running command: docker run --rm --entrypoint /bin/bash appsody/java-spring-boot2:0.3 -c find /project -type f -name .appsody-init.sh
Extracting project from development environment
Running command: docker create --name my-project-extract -v /Users/haddouti/codewind-workspace/kabanero-test-springboot2/.:/project/user-app -v /Users/haddouti/.m2/repository:/mvn/repository appsody/java-spring-boot2:0.3
Running command: docker cp my-project-extract:/project /Users/haddouti/.appsody/extract/kabanero-test-springboot2
Running command: docker rm my-project-extract -f
Project extracted to /Users/haddouti/codewind-workspace/kabanero-test-springboot2/.appsody_init
Running command: ./.appsody-init.sh
Successfully initialized Appsody project
$ ls -la
total 24
drwxr-xr-x 7 haddouti staff 224 Sep 25 22:21 .
drwxr-xr-x 8 haddouti staff 256 Sep 25 22:20 ..
-rw-r--r-- 1 haddouti staff 37 Sep 25 22:21 .appsody-config.yaml
-rw-r--r-- 1 haddouti staff 288 Sep 25 22:21 .gitignore
drwxr-xr-x 4 haddouti staff 128 Sep 25 22:21 .vscode
-rw-r--r-- 1 haddouti staff 1189 Sep 25 22:21 pom.xml
drwxr-xr-x 4 haddouti staff 128 Sep 25 22:21 src
上記のコマンドにより、Spring Boot 2 と Maven をべースに正常性 をチェックするためのエンドポイントとモニタリング 用のエンドポイントを追加した、基礎となるスケルトン・プロジェクトが生成されます。.appsody-config.yaml
では、使用された Appsody スタックが参照されています。
# cat .appsody-config.yaml
stack: appsody/java-spring-boot2:0.3
Spring Boot アプリケーションは spring-boot2-stack に依存し、このスタックが依存関係とプラグインを管理します。また、Prometheus、OpenTracing と、動的な再ロードに対応する Spring Developer Tool も組み込まれています。
pom.xml の依存関係は以下のように記述されます。
<parent><!--required parent POM-->
<groupId>dev.appsody</groupId>
<artifactId>spring-boot2-stack</artifactId>
<version>[0.3, 0.4)</version>
<relativePath/>
</parent>
プロジェクト・ディレクトリー内で appsody run
を実行すると、アプリケーションがビルドされて実行中になり、http://localhost:8080/
でアクセスできるようになります。
内部では Appsody が Docker イメージを作成してコンテナーを実行し、プロジェクトをビルドしてテストします。プロジェクトがテストに合格すると、コンテナー内で実行されます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
40e448a63904 appsody/java-spring-boot2:0.3 "/appsody/appsody-co…" About a minute ago Up About a minute 0.0.0.0:5005->5005/tcp, 0.0.0.0:8080->8080/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:35729->35729/tcp kabanero-test-springboot2-dev
アプリケーションを停止するには、ctrl+c
キーを押すか、プロジェクト・ディレクトリー内で appsody stop
を実行します。
$ appsody stop
Stopping development environment
Running command: docker[stop kabanero-test-springboot-dev]
Docker コンテナーを取得するには、明示的に appsody build
を呼び出します。これにより、すべての成果物が抽出されてから Dockerfile が作成され、Docker コンテナーが生成されます。以下のコードに示されているように、すべてのファイルは $HOME/.appsody/extract/<project-name>/
内に配置されます。
# appsody build
Extracting project from development environment
Running command: docker pull appsody/java-spring-boot2:0.3
Running command: docker create --name kabanero-test-springboot2-extract -v /Users/haddouti/codewind-workspace/kabanero-test-springboot2/.:/project/user-app -v /Users/haddouti/.m2/repository:/mvn/repository appsody/java-spring-boot2:0.3
Running command: docker cp kabanero-test-springboot2-extract:/project /Users/haddouti/.appsody/extract/kabanero-test-springboot2
Running command: docker rm kabanero-test-springboot2-extract -f
Project extracted to /Users/haddouti/.appsody/extract/kabanero-test-springboot2
Running docker command: docker build -t kabanero-test-springboot2 -f /Users/haddouti/.appsody/extract/kabanero-test-springboot2/Dockerfile /Users/haddouti/.appsody/extract/kabanero-test-springboot2
[Docker] Sending build context to Docker daemon 597.5kB
[Docker] Step 1/16 : FROM appsody/java-spring-boot2:0.3 as compile
[Docker] ---> 4ea7128b4908
[Docker] Step 2/16 : COPY . /project
[Docker] ---> fba0fb3e1e4d
[Docker] Step 3/16 : WORKDIR /project/user-app
[Docker] ---> Running in 62b15dd73734
[Docker] Removing intermediate container 62b15dd73734
[Docker] ---> 83fd7058ad5b
[Docker] Step 4/16 : RUN /project/util/check_version build && /project/java-spring-boot2-build.sh package
[Docker] ---> Running in 7e1232e17fb4
[Docker] Installing parent dev.appsody:spring-boot2-stack:0.3.14
[Docker] > mvn install -q -f /project/appsody-boot2-pom.xml
...
[Docker] ---> Running in 254e0c44af86
[Docker] Removing intermediate container 254e0c44af86
[Docker] ---> 7b3cf8460bc3
[Docker] Successfully built 7b3cf8460bc3
[Docker] Successfully tagged kabanero-test-springboot2:latest
Built docker image kabanero-test-springboot2
# ll $HOME/.appsody/extract/kabanero-test-springboot2
total 88
-rw-rw-r-- 1 haddouti staff 926B Sep 25 15:20 Dockerfile
-rw-rw-r-- 1 haddouti staff 6.6K Sep 25 15:20 appsody-boot2-pom.xml
-rwxrwxr-x 1 haddouti staff 4.8K Sep 25 15:19 java-spring-boot2-build.sh
-rw-rw-r-- 1 haddouti staff 628B Sep 25 15:19 mvn-stack-settings.xml
-rwxrwxr-x 1 haddouti staff 9.8K Sep 25 15:20 mvnw
-rw-rw-r-- 1 haddouti staff 6.5K Sep 25 15:20 mvnw.cmd
drwxr-xr-x 9 haddouti staff 288B Sep 25 22:25 user-app
drwxrwxr-x 6 haddouti staff 192B Sep 25 15:20 util
# docker images | grep -i kabanero-test-springboot2
kabanero-test-springboot2 latest 7b3cf8460bc3 3 minutes ago 400MB
Codewind の統合
Codewind には、Appsody プロジェクトを管理するための Appsody プラグインがあります。Codewind ビューでは、既存のプロジェクト ($HOME/codewind-workspace/
内に存在している必要があります) を追加することも、使用可能な Appsody テンプレートを使用して新しいプロジェクトを作成することもできます。
プロジェクトのコンテキスト・メニューにはさまざまなメニュー項目があり、例えばデフォルトのブラウザーで「Open the App (アプリを開く)
」、アプリを「restart (再起動)
」する、Docker コンテナーへの「open a shell (シェルを開く)
」などの操作を行うことができます。また、Docker コンテナーから生成されたログ・ファイルにアクセスすることも可能です。
Codewind を統合すると、アプリケーション・ランタイムの動的な再ロードもサポートされます。つまり、プロジェクトに変更を加えるたびに、アプリケーションが再ビルドされるようになります。
例えば、HTML ファイル kabanero-test-springboot2/src/main/resources/public/index.html
に変更を加えると、Spring Boot サーバーが再起動されて変更が直ちに反映されます。
Codewind を使用すると、基礎となる Docker コンテナーに触れることなく、クラウド・ネイティブ・アプリケーションを処理できます。
クラウドへの移行
アプリを Kubernetes クラスターにデプロイする際は、作成済みの Docker イメージを再利用することも、リポジトリーを Appsody Operator または Knative Serving に転送することもできます。Kubernetes クラスターへのアプリのデプロイに使用するのは appsody deploy
のみです。このコマンドは成果物を抽出し、Docker イメージを Kubernetes クラスターにデプロイします。
使用するスタックによって、デプロイメントの管理には Knative Serving または Appsody Operator のいずれかが使用されます。通常、Knative Serving はフォールバックです。これを適用するには、フラグ --knative
を使用します。
優先される Appsody Operator は、アプリケーションをデプロイして、ルーティング、高可用性、パーシスタンス・ボリューム管理に対処するためのアクティビティーを行います。
Appsody により、デプロイできる状態のマニフェスト・ファイルが作成されます。以下はその一例です。
apiVersion: appsody.dev/v1beta1
kind: AppsodyApplication
metadata:
name: kabanero-test-springboot2
spec:
# Add fields here
version: 1.0.0
applicationImage: dev.local/kabanero-test-springboot2
stack: java-spring-boot2
service:
type: NodePort
port: 8080
annotations:
prometheus.io/scrape: 'true'
prometheus.io/path: '/actuator/prometheus'
readinessProbe:
failureThreshold: 12
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 5
periodSeconds: 2
livenessProbe:
failureThreshold: 12
httpGet:
path: /actuator/liveness
port: 8080
initialDelaySeconds: 5
periodSeconds: 2
expose: true
# In case Knative is used, is the next line enabled
#createKnativeService: true
このマニフェスト・ファイルにより、アプリケーションを格納したポッドが実行中になります。
# kubect get pods
NAME READY STATUS RESTARTS AGE
appsody-operator-859b97bb98-kwpz4 1/1 Running 0 2m41s
kabanero-test-springboot-595c4cc494-rwh5z 1/1 Running 0 64s
デプロイに Knative Serving を使用した場合は、以下のリソースが作成されます。
- Service、Deployment、ReplicaSet
- Knative Service (service.serving.knative.dev): ライフサイクル全体とリソース・オブジェクト作成を全般的に管理します。
- Knative Revision (revision.serving.knative.dev): コードと構成のスナップショット
- Knative Route (route.serving.knative.dev): ネットワーク・エンドポイントをリビジョンにマッピングします。
- Knative Configuration (configuration.serving.knative.dev): デプロイメントの目的の状態を維持します。
- PodAutoscaling、Image Caching を処理するためのその他複数の内部 Knative リソース
# kubectl get serving
NAME URL LATESTCREATED LATESTREADY READY REASON
service.serving.knative.dev/kabanero-test-springboot http://kabanero-test-springboot.default.9.145.41.194.nip.io kabanero-test-springboot-4mvb4 kabanero-test-springboot-4mvb4 True
NAME URL READY REASON
route.serving.knative.dev/kabanero-test-springboot http://kabanero-test-springboot.default.9.145.41.194.nip.io True
NAME SERVICE NAME GENERATION READY REASON
revision.serving.knative.dev/kabanero-test-springboot-4mvb4 kabanero-test-springboot-4mvb4 1 True
NAME LATESTCREATED LATESTREADY READY REASON
configuration.serving.knative.dev/kabanero-test-springboot kabanero-test-springboot-4mvb4 kabanero-test-springboot-4mvb4 True
詳細については、Knative Serving のドキュメントを参照してください。
アプリケーションとすべての Kubernetes リソースを削除するには、コマンド
appsody deploy delete
を使用します。
まとめ
Kabanero はまだ日の浅い新しいツールですが、急速にクラウド・ネイティブ環境を変えています。この記事では、Kabanero が他のよく使われているオープンソース・プロジェクト (Knative、Istio、Tekton など) を統合する仕組みと、追加の設定なしで構成やインストール、そしてその他のインフラストラクチャー関連のアクティビティーを処理できる理由を説明しました。Kabanero が提供する抽象化により、アプリケーション・ロジックをインフラストラクチャーからより確実に分離できます。
続々と追加されているサポート対象の Appsody スタックを使用すれば、さらに統一のとれたクラウド・ネイティブ・アプリケーションを作成して管理できます。
エンタープライズ対応の完全にサポートされた Kabanero の実装である Kabanero Enterpirse の詳細を調べてください。