在使用基于Java开发的WEB应用程序时,可以通过Kubernetes清单文件管理JVM的参数来运维
首先
大家好,我是asmg。这次,我将介绍一下在使用Java编写的WEB应用程序的运营过程中,通过Kubernetes清单文件管理JVM参数的任务以及实现方法。
本文所指的对象
这篇文章专注于使用Kubernetes清单来管理JVM参数,因此不涉及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参数的时机和更新应用程序的时机进行构建。在这个结构中,由于每次修改参数都需要构建镜像,所以无法轻松修改参数。因此,本文中我想要实现在kubernetes的清单中修改JVM参数的功能。
如何在Kubernetes清单中管理JVM参数
在Kubernetes的清单文件的env中添加Java官方提供的环境变量JAVA_TOOL_OPTIONS,并在此处记录JVM参数。
...一部省略...
env:
- name: JAVA_TOOL_OPTIONS
value: "-XX:PermSize=129M"
您可以在Kubernetes清单文件的变量中添加”JAVA_TOOL_OPTIONS”来管理JVM参数。由于在Kubernetes清单文件中已经包含了JVM参数的陈述,因此您可以删除在apply.sh中的相关部分。
请留意一下
在Java虚拟机中有一个类似于JAVA_TOOL_OPTIONS的环境变量称为JAVA_OPTS。
在JAVA VM中,JAVA_OPTS是一个非官方的环境变量。由于在kubernetes的清单中无法使用JAVA_OPTS,因此我认为使用JAVA_TOOL_OPTIONS可能更好。
参考:https://kazuhira-r.hatenablog.com/entry/2020/10/23/003913
在JAVA VM中,JAVA_OPTS是一个非官方的环境变量。由于在kubernetes的清单中无法使用JAVA_OPTS,因此我认为使用JAVA_TOOL_OPTIONS可能更好。
参考: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的清单文件管理方法,我们实现了对JAVA_TOOL_OPTIONS变量的灵活利用,可以自由地更改JVM参数。