はじめに
最近はKubernetesに関する話を数多く聞くようになり、あまりKubernetes自身を触るのはあまり好みではないんですが、何事もある程度は触っておきたいと思い簡単なアプリを作って動かしてみました。
作業としては以下のことをやります。
- Spring Bootアプリを作る
- Dockerイメージを作る
- Azure Container Registryに登録する
- Kubernetesで動かすようにする
1. Spring Bootアプリを作る
動作確認用なので、Springが公開しているサンプルをそのまま実装します。今回は、「Building a RESTful Web Service」を実装してみました。
2. Dockerイメージを作る
Spring BootアプリのDockerイメージを作るにはいろんな方法があります。例えば、Spring Boot 2.3ぐらいからデフォルトで./gradlew bootBuildImage
を実行すればDockerイメージを作ることができます。
ただ、単に私の慣れの問題でJibを使うことにします。
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で動かすようにします。チュートリアルがあるのでそれに従います。
途中でてくる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については、以下のドキュメントを読めば理解できるかと思いますが、今のところはまだ動かしただけ。あとで理解するように努めます。
手順通りにやって、ワークロードやサービスにそれぞれ指定したものが表示されます。
動作確認
サービスのところに出てくる外部IPアドレスをクリックすると、アプリが動いていることが確認できます。
今後
先日アナウンスされたAzure Monitor managed service for Prometheusを試そうと考えています。
Spring Boot ActuatorにはPrometheus向けに各種データを出力することができるので、それを上記の機能で参照することが目的です。
ソース
この日時点のソースです。