はじめに
皆さんこんにちはasmgです。今回は、Javaで作られたWEBアプリケーションの運用にあたってJVMのパラメータをKubernetesマニフェストで管理するタスクを行なったので実現した方法を記載していこうと思います。
本記事の対象者
本記事は、JVMのパラメータをKubernetes マニフェストで管理することに着目しているのでkubernetesやJVMについて言及はしません。なので、KubernetesやJVMのパラメータは理解していることを前提としています。
本記事の実行環境
検証機
- Mac Book pro 14inch M1 Pro
検証環境
- kind(Kubernetes in Docker)
現状のJVMのパラメータの管理方法
現状、JVMの管理は以下のように行っていました。
FROM openjdk:8-jdk-oraclelinux8
COPY ./target /
CMD ["./apply.sh", "./app.jar"]
#!/bin/sh
java \
-XX:PermSize=128M \
-jar ${1}
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample-deployment
spec:
replicas: 1
selector:
matchLabels:
app: sample-app
template:
metadata:
labels:
app: sample-app
spec:
containers:
- name: sample-spring-boot
image: sample-spring-boot:latest
imagePullPolicy: IfNotPresent
env:
- name: hogehoge
value: "hogehoge"
※スクリプトやDockerfileは本記用に簡単に記述しています。
※今回設定している-XXパラメータには特に意味はありません。
現状の管理方法の問題
上記のような構成でDockerfileを作成すると、JVMのパラメータを修正するタイミングやアプリケーションを更新するタイミングでbuildする必要があります。この構成だと、パラメータを修正するたびにimageをBuildしないといけないため、簡単にパラメータを修正することができません。なので、本記事ではJVMのパラメータをkubernetesのマニフェストで修正できるようにしていきたいと思います。
JVMのパラメータをKubernetesマニフェストで管理する方法
KubernetesのマニフェストファイルのenvにJavaの公式で提供されている環境変数JAVA_TOOL_OPTIONS
を追加してここにJVMのパラメータを記載します。
...一部省略...
env:
- name: JAVA_TOOL_OPTIONS
value: "-XX:PermSize=129M"
kubernetesのマニフェストファイルの変数にJAVA_TOOL_OPTIONS
を記載することで、kubernetesのマニフェストファイル上で、JVMパラメータを管理することができます。
kubernetesのマニフェストファイルでJVMパラメータを記載しているので、apply.shで記述している部分は削除することができます。
注意点
JVMのパラメータの環境変数JAVA_TOOL_OPTIONS
と類似するもので、JAVA_OPTS
というものがあります。
JAVA VMでは、JAVA_OPTS
は、非公式な環境変数のようです。kubernetesのマニフェストで設定する際にJAVA_OPTS
は利用できなかったので、JAPA_TOOL_OPTIONS
を利用するのが良いかと思います。
ref:https://kazuhira-r.hatenablog.com/entry/2020/10/23/003913
設定が反映されているか確認
bash-4.4# jps -v
----
Picked up JAVA_TOOL_OPTIONS: -XX:PermSize=129M
OpenJDK 64-Bit Server VM warning: ignoring option PermSize=129M; support was removed in 8.0
1 jar -XX:PermSize=129M
78 Jps -XX:PermSize=129M -Dapplication.home=/usr/java/openjdk-8 -Xms8m
Podに入り、設定が反映されているかを確認してみると、JVMパラメータ-XX:PermSize
が129M
に設定されていることが確認されています。
まとめ
今回は、Kubernetesマニフェストで管理する方法を実現しました。Kubernetesのマニフェストの設定で変数JAVA_TOOL_OPTIONS
を活用することで柔軟にJVMのパラメータを変更することができると思います。