Quarkusを使用すると、Javaのようなテクノロジーを使用してサーバーレスワークロードを開発できます。
研究は、オンデマンドで実行される小さなコードの断片である関数から始まりました。この段階はあまり長くは続きませんでした。仮想マシン・アーキテクチャに基づく関数は、1.0の段階でこのパラダイムを普及させましたが、次の図に示すように、実行時間、プロトコル、貧弱なネイティブ開発エクスペリエンスなど、理想的とは言えない制約が残っていました。
その後、開発者は同じサーバーレス機能をマイクロサービスやLinuxコンテナに適用しても同じメリットが得られることに気づきました。これがフェーズ1.5につながり、一部のサーバーレスコンテナは 完全に抽象化し、その上に位置する その他の抽象化レイヤーを通じてサーバーレスエクスペリエンスを提供するようになりました。
フェーズ2.0では、サーバーレスはより複雑なオーケストレーションと統合パターンを扱うようになり、ある程度の状態管理と組み合わされるようになりました。さらに重要なことは、開発者が、使い慣れたJavaアプリケーションのランタイムを使用する古いシステムで、サーバーレスと非サーバーレスのワークロードを組み合わせて実行できるかどうかに懸念を抱いていることです。
サーバーレス機能開発に着手するJava開発者にとっての最初のステップは、従来のモノリシックなアプリケーションよりも高速かつ少ないメモリフットプリントでJava関数を実行できる、新しいクラウドネイティブJavaフレームワークを選択することです。これは、物理サーバー、仮想マシン、マルチクラウドやハイブリッドクラウド環境のコンテナーなど、さまざまなインフラ環境で適用できます。
開発者は、命令型・反応型の関数開発のために、Springフレームワークの "Spring サーバーレスJava 頑なに選択することもできます。Springは、 Kubeless、Apache OpenWhisk、Fission 、 Project Riffといったインストール可能なサーバーレスプラットフォームへのJava関数のデプロイもサポートしています。しかし、Springの起動の遅さ、応答時間の長さ、メモリフットプリントの大きさには懸念があります。これらの問題は、Kubernetesのようなスケーラブルなコンテナ環境でJava関数を実行することで悪化する可能性があります。
Kubernetes 、このような問題の解決を支援する、オープンソースのクラウドネイティブJavaフレームワークです。サーバーレスアプリケーションを設計したり、クラウドインフラ上で動作するクラウドネイティブなマイクロサービスを書いたりするためのものです。
QuarkusはJavaを見直し、Javaプログラムの構築と実行にクローズドなアプローチを採用しています。また、Quarkusには、データベースアクセス、サーバーレス統合、メッセージング、セキュリティ、可観測性、ビジネスオートメーションなどのエンタープライズクラスの機能を統合する100以上の拡張機能があります。
ここでは、Quarkusを使用してJavaサーバーレスプロジェクトのフレームワークを作成する方法を示す簡単な例を示します。
MavenベースのQuarkusサーバーレスプロジェクトの作成
次のコマンドは、Quarkusプロジェクトを作成し、シンプルなREST APIを外部に公開し、Knativeサービスのデプロイ用にquarkus-openshiftエクステンションをダウンロードします:
$ mvn io.quarkus:quarkus-maven-plugin:1.13.4.Final:create \-DprojectGroupId=org.acme \-DprojectArtifactId=quarkus-serverless-restapi \-Dextensions="openshift" \-DclassName="org.acme.getting.started.GreetingResource"
サーバーレス機能はローカルで実行されます。
Quarkusの開発モードでアプリケーションを実行し、REST APIが動作することを確認し、コードを少し調整します:
$ ./mvnw quarkus:dev
出力は以下の通り:
__ ____ __ _____ ___ __ ____ ______--/ __ \/ / / / _ | / _ \/ //_/ / / / __/-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \--\___\_\____/_/ |_/_/|_/_/|_|\____/___/INFO [io.quarkus] (Quarkus Main Thread) quarkus-serverless-restapi 1.0.0-SNAPSHOT on JVM (powered by Quarkus xx.xx.xx.) started in 2.386s. Listening on: http://:80INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, kubernetes, resteasy]
注:Quarkusアプリケーションを実行し続けるために必要です。これにより、コードが変更されたときにランタイムを再構築、再デプロイ、再起動する必要がなくなります。
これで、curlコマンドを使ってREST APIに素早くアクセスできるようになりました。
$ curl localhost:8080/helloHello RESTEasy
$ curl localhost:8080/hello 戻り値を変更します:
public String hello() {return "Quarkus Function on Kubernetes";}
REST APIに再度アクセスすると、出力情報がそれに応じて更新されます:
$ curl localhost:8080/helloQuarkus Function on Kubernetes
通常のマイクロサービスとサーバーレス機能には大きな違いはありません。Quarkusを使用するメリットは、開発者が任意のマイクロサービスを使用してサーバーレス機能としてKubernetesをデプロイできることです。
関数はKnativeサービスにデプロイされます。
まだの場合は、Javaサーバーレス関数をデプロイするためにOKDクラスタに名前空間を Knativeします。
Quarkusでは、開発者は src/main/resources/application.properties 以下の変数を追加することで、KnativeとKubernetesリソースを作成できます:
quarkus.container-image.group=quarkus-serverless-restapi <1>quarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000 <2>quarkus.kubernetes-client.trust-certs=true <3>quarkus.kubernetes.deployment-target=knative <4>quarkus.kubernetes.deploy=true <5>quarkus.openshift.build-strategy=docker <6>
説明
- <1> サーバーレスアプリケーションをデプロイする場所にプロジェクト名を定義します。
- <2> コンテナレジストリの使用
- <3> この単純な例では、自己署名証明書を使用して、関連する信頼メカニズムを渡します。
- <4> Knativeリソースの作成許可
- <5> コンテナイメージのビルド後、OpenShiftにエクステンションをデプロイするよう指示します。
- <6> Dockerビルドポリシーの設定
以下のコマンドを実行してアプリケーションをビルドし、OKDクラスタに直接デプロイします:
$ ./mvnw clean package -DskipTests
注意: 正しいプロジェクトにログインしていることを確認するために、事前に oc login コマンドを使うべきです。
出力は BUILD SUCCESS 終わるはずです。
Knativeサービスで実行されるocコマンドで、ラベルを追加します。
$ oc label rev/quarkus-serverless-restapi-00001app.openshift.io/runtime=quarkus --overwrite
その後、OKD Web Consoleにアクセスすると、 開発者パースペクティブのトポロジービューにアクセスできるようになります。ゼロに縮小されていることがわかるかもしれません。
以下は、Kubernetes環境で機能をテストする方法の例です。
以下のocコマンドを実行して、サーバーレス関数を含むルートを検索します:
$ oc get rt/quarkus-serverless-restapiNAME URL READY REASONquarkus-serverless[...] http://us[...].IN True
検索されたルートにアクセスするには curl コマンドを使用します:
$ curl http://-----./lo
数秒後、ローカルと同じ結果を得ることができます:
Quarkus Function on Kubernetes
OKDクラスター内のトポロジーマップに戻ると、Knativeサービスは自動的にスケールします。
Knativeサービスのデフォルト設定により、ポッドは30秒後に再びゼロになります。
次はどうなる?
サーバーレスは進化し続けており、仮想マシン上で実行される機能から始まり、企業のレガシーシステムと統合するサーバーレスコンテナへと移行しています。その過程で、Quarkusを使用すれば、企業の開発者は、使い慣れたテクノロジーを使用してプロジェクトを作成し、Kubernetesにビルドしてデプロイすることができます。





