Spring BootアプリをAzure Kubernetes Serviceで動かす(1)

はじめに

最近はKubernetesに関する話を数多く聞くようになり、あまりKubernetes自身を触るのはあまり好みではないんですが、何事もある程度は触っておきたいと思い簡単なアプリを作って動かしてみました。

作業としては以下のことをやります。

  1. Spring Bootアプリを作る
  2. Dockerイメージを作る
  3. Azure Container Registryに登録する
  4. Kubernetesで動かすようにする

1. Spring Bootアプリを作る

動作確認用なので、Springが公開しているサンプルをそのまま実装します。今回は、「Building a RESTful Web Service」を実装してみました。

spring.io

2. Dockerイメージを作る

Spring BootアプリのDockerイメージを作るにはいろんな方法があります。例えば、Spring Boot 2.3ぐらいからデフォルトで./gradlew bootBuildImageを実行すればDockerイメージを作ることができます。

docs.spring.io

ただ、単に私の慣れの問題でJibを使うことにします。

github.com

Azure Container Registryを使う予定なので、build.gradleに以下の設定を行います。

jib.to.image = "リポジトリ名.azurecr.io/spring_boot_on_k8s:${version}"

これで./gradlew jibを使ってDockerイメージのビルドとpush、./gradlew jibDockerBuildでDockerイメージのビルドができます。

3. Azure Container Registryに登録する

作成したDockerイメージをAzure Container Registryに登録します。az acr loginコマンドでAzure Container Registryにログイン後、./gradlew jibでDockerイメージをpushします。

miyohide@tsubame spring_boot_on_k8s % az acr login -n リポジトリ名 && ./gradlew jib
Login Succeeded

Welcome to Gradle 7.5!

Here are the highlights of this release:
 - Support for Java 18
 - Support for building with Groovy 4
 - Much more responsive continuous builds
 - Improved diagnostics for dependency resolution

For more details see https://docs.gradle.org/7.5/release-notes.html


> Task :jib

Containerizing application to リポジトリ名.azurecr.io/spring_boot_on_k8s:0.0.1...
Base image 'mcr.microsoft.com/java/jdk:11-zulu-alpine' does not use a specific image digest - build may not be reproducible
Using credentials from Docker config (/Users/miyohide/.docker/config.json) for リポジトリ名.azurecr.io/spring_boot_on_k8s:0.0.1
Using base image with digest: sha256:c8eb1e53b34068e35922abebd3787099eae4de108d2ba727d0561ea987379457

Container entrypoint set to [java, -cp, @/app/jib-classpath-file, com.github.miyohide.spring_boot_on_k8s.SpringBootOnK8sApplication]

Built and pushed image as リポジトリ名.azurecr.io/spring_boot_on_k8s:0.0.1
Executing tasks:
[==============================] 100.0% complete


BUILD SUCCESSFUL in 23s
3 actionable tasks: 1 executed, 2 up-to-date
miyohide@tsubame spring_boot_on_k8s %

4. Kubernetesで動かすようにする

Azure Kubernetes Serviceで動かすようにします。チュートリアルがあるのでそれに従います。

learn.microsoft.com

途中でてくるYAMLは以下のものを使いました。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: gs-spring-boot-docker
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gs-spring-boot-docker
  template:
    metadata:
      labels:
        app: gs-spring-boot-docker
    spec:
      containers:
      - name: gs-spring-boot-docker
        image: リポジトリ名.azurecr.io/spring_boot_on_k8s:0.0.1
---
apiVersion: v1
kind: Service
metadata:
  name: gs-spring-boot-docker
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: gs-spring-boot-docker

このYAMLについては、以下のドキュメントを読めば理解できるかと思いますが、今のところはまだ動かしただけ。あとで理解するように努めます。

kubernetes.io

手順通りにやって、ワークロードやサービスにそれぞれ指定したものが表示されます。

動作確認

サービスのところに出てくる外部IPアドレスをクリックすると、アプリが動いていることが確認できます。

今後

先日アナウンスされたAzure Monitor managed service for Prometheusを試そうと考えています。

learn.microsoft.com

Spring Boot ActuatorにはPrometheus向けに各種データを出力することができるので、それを上記の機能で参照することが目的です。

spring.pleiades.io

ソース

この日時点のソースです。

github.com