新しい IBM Developer JP サイトへようこそ!サイトのデザインが一新され、旧 developerWorks のコンテンツも統合されました。 詳細はこちら

Kabanero、Appsody、Codewind を使用して、Kubernetes 上の Spring Boot アプリケーションを作成する

最新式クラウド・ネイティブ・アプリケーションを作成するには、ビジネス・ロジックを適切な場所に組み込むのに最適な方法から、回復力、信頼性、モニタリングに対処する方法などの技術的考慮事項に至るまで、アプリケーションのあらゆる側面を考慮しなければなりません。さらに、アプリケーションをクラウド上あるいは 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

前提条件

このチュートリアルの手順に従うには、お使いのシステムに以下のツールがインストールされて実行中になっている必要があります。

インストール

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 テンプレートを使用して新しいプロジェクトを作成することもできます。

新規プロジェクトの作成 1/2: テンプレートの選択 新規プロジェクトの作成 2/2: プロジェクト名の設定

プロジェクトのコンテキスト・メニューにはさまざまなメニュー項目があり、例えばデフォルトのブラウザーで「Open the App (アプリを開く)」、アプリを「restart (再起動)」する、Docker コンテナーへの「open a shell (シェルを開く)」などの操作を行うことができます。また、Docker コンテナーから生成されたログ・ファイルにアクセスすることも可能です。

Codewind プロジェクトのコンテキスト・メニュー

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 の詳細を調べてください。