在使用基于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

请确认设置是否已经生效。

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参数。