お題
Supersonic Subatomic Java
A Kubernetes Native Java stack tailored for GraalVM & OpenJDK HotSpot, crafted from the best of breed Java libraries and standards
という謳い文句のQuarkusを試してみた。
既に↓のように、紹介、ないし、試してみた記事はいろいろあるので、違いとして、GKE(Google Kubernetes Engine)に載せてみることを試してみた。
- Javaフレームワーク「Quarkus」登場。Javaコードからネイティブバイナリを生成し瞬時にJavaアプリが起動、コンテナへの最適化を実現。Red Hatがリリース
- Quarkus: コンテナ上で Java アプリを高速起動する新しい手法のご紹介
- Quarkus: Container First Microservices Framework
- JavaアプリをNativeコンパイルして爆速で起動するQuarkusを試してたら利用例にプルリクエストがマージされた
- Javaのフレームワーク「Quarkus」を試してみた
- KubernetesネイティブなJavaフレームワーク Quarkus について調査してみた件
作業環境
# OS
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
# Java
$ java -version
openjdk version "10.0.2" 2018-07-17
OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)
OpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4, mixed mode)
※ちなみに、Java12で試したら動きませんでした。
# Docker
$ sudo docker version
〜〜〜
Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 03:42:13 2019
OS/Arch: linux/amd64
Experimental: false
# Maven
$ mvn -version
Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-25T03:41:47+09:00)
# gcloud
$ gcloud version
Google Cloud SDK 240.0.0
〜〜〜
kubectl 2019.03.22
※gcloud auth
は済んでいる状態。
実践
Quarkusアプリ作成
↓のチュートリアルに沿ってMavenプロジェクトを作成し、あとは、作成したプロジェクトに含まれている mvnw
コマンドを叩くだけ。
https://quarkus.io/guides/getting-started-guide
ソースを一部抜粋すると、↓のようなSpringライクなWebAPIコードとなる。
GCPのCloud Endpointsを使おうとした時も、やはり似たようなコードになったし。
@Path("/hello")
public class GreetingResource {
@Inject
GreetingService service;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello";
}
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/greeting/{name}")
public String greeting(@PathParam("name") String name) {
return service.greeting(name);
}
}
Dockerコンテナ
これもチュートリアル通りだけど、下記のようなDockerfileをプロジェクト配下に作成。
FROM openjdk:11-jre-slim
RUN mkdir /app
COPY target/lib /app/lib
COPY target/*-runner.jar /app/application.jar
EXPOSE 8080
CMD ["java", "-jar", "/app/application.jar"]
※チュートリアルでは openjdk:8-jre-slim
だったのだけど、試した時の Quarkus のバージョンの問題か、コンテナ作成後に docker run
した時にうまく起動しなかったため「11」に上げた。
ビルド by Cloud Build
下記のようにCloud Buildを利用するためのYamlファイルをプロジェクト配下に作成。
steps:
- name: 'gcr.io/cloud-builders/docker'
args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/quarkus-microservice', '.' ]
images:
- 'gcr.io/$PROJECT_ID/quarkus-microservice'
で、ビルド実行。すると、出来上がったコンテナイメージがGCR(Google Container Registry)に上がる。
$ gcloud builds submit --config cloudbuild.yaml .
Creating temporary tarball archive of 137 file(s) totalling 9.6 MiB before compression.
Uploading tarball of [.] to [gs://【GCPプロジェクトID】_cloudbuild/source/1553878212.23-a25ba1029b4a4979b2a049769da45570.tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/【GCPプロジェクトID】/builds/1bff9b28-a9da-4113-9c41-c9de7f9af1d7].
〜〜〜
DONE
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID CREATE_TIME DURATION SOURCE IMAGES STATUS
1bff9b28-a9da-4113-9c41-c9de7f9af1d7 2019-03-29T16:50:16+00:00 46S gs://【GCPプロジェクトID】_cloudbuild/source/1553878212.23-a25ba1029b4a4979b2a049769da45570.tgz gcr.io/【GCPプロジェクトID】/quarkus-microservice (+1 more) SUCCESS
実際にビルド成功してコンテナイメージが格納されていることをGCPコンソールで確認。
ちなみに、このへんの手順は下記の過去記事に基づく。
GKE試行(その2:「GitHub -> CSR へ。そしてGCBによりGCRへ」)
GKEクラスタ作成
GCPにおけるk8sのマネージドサービスを利用するため、まずはクラスタを作成。
GCPコンソールからも作成可能だけど、(節約のため)作ったり消したりするのでコマンドとして残しておくことにする。
サービス公開でなくただのトライ記事用なのでプリエンプティブで作成。
$ gcloud container clusters create clst-pe-01 --preemptible --machine-type=f1-micro --num-nodes=3 --disk-size=10
WARNING: In June 2019, node auto-upgrade will be enabled by default for newly created clusters and node pools. To disable it, use the `--no-enable-autoupgrade` flag.
〜〜〜
Creating cluster clst-pe-01 in asia-northeast1-c... Cluster is being health-checked (master is healthy)...done.
Created [https://container.googleapis.com/v1/projects/【GCPプロジェクトID】/zones/asia-northeast1-c/clusters/clst-pe-01].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/asia-northeast1-c/clst-pe-01?project=【GCPプロジェクトID】
kubeconfig entry generated for clst-pe-01.
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
clst-pe-01 asia-northeast1-c 1.11.7-gke.12 xx.xxx.xxx.xxx f1-micro 1.11.7-gke.12 3 RUNNING
ちなみに、このへんの手順は下記の過去記事に基づく。
GKE試行(その3:「クラスタ作成」)
また、節約のためのクラスタ作成云々は下記が参考になる。
安価なGKE(k8s)クラスタを作って趣味開発に活用する
GCR(Container Registry)にあるコンテナイメージをGKE(Kubernetes Engine)にデプロイ
$ kubectl run quarkus-microservice --image gcr.io/【GCPプロジェクトID】/quarkus-microservice@sha256:18a20d4307785a7aec3b19738a849430e2181720cb357d8a7ea6f8fe4ed1f850 --port 80
deployment.apps/quarkus-microservice created
アプリを公開
デプロイメントできただけだと外部からのアクセスの口がないので、公開用にサービスを作る。
$ kubectl expose deployment quarkus-microservice --type "LoadBalancer"
service/quarkus-microservice exposed
アクセス確認
ちなみに、このへんの手順は下記の過去記事に基づく。
GKE試行(その4:「GKEデプロイ->サービス公開」
まとめ
今回は、ただの初回チュートリアルレベルの自動生成アプリをGKEに載せただけ。
GitHubのサンプルコードとしては、JSON-REST、WebSocket、ORM、バリデーションなどいろいろある。
https://github.com/quarkusio/quarkus-quickstarts#getting-started-guides
k8sに載せるアプリを考えた時、これまでは「Golangで書こう。」になっていたけど、Quarkus登場のおかげで、今後は豊富な既存資産を使えるJavaも候補になるかも。