K8S避免Java应用PID为1

1 背景

Docker打包Java后台服务镜像,启动命令样式为:java -jar ****.jar
在K8S中启动镜像时,启动的PID为1,此时无法通过jmap和jinfo查看JVM相关信息。
PID 1~5是Linux的特殊进程。

序号pid进程号描述
11init进程,系统启动的第一个用户级进程,是其他所有进程的父进程,引导用户空间服务
22kthreadd,内核线程管理
33migration,用于进程在不同CPU间迁移
44ksoftirqd,内核中软中断守护线程,用于系统空闲时定时处理软中断事务
55watchdog,看门狗进程,用于监听内核异常,当系统出现宕机时,可利用watchdog记录宕机时堆栈信息

配置如下:

# 环境
FROM williamyeh/java8:latest
# 管理者信息
MAINTAINER xindaqi "*******@qq.com"
# 本地文件挂载到容器
WORKDIR /home/xindaqi/project/tutorial
# 拷贝jar文件
COPY tutorial.jar /tutorial.jar
# 设置端口号
EXPOSE 9121
# 运行jar包
ENTRYPOINT ["java", "-jar", "/tutorial.jar", "&"]

在这里插入图片描述

2 方案

避免java应用作为第一个启动的应用。添加tini,作为第一个启动的应用。

  • 使用openjdk:8-jdk-alpine作为基础镜像
  • 运行apk add --no-cache tini
  • 添加tini作为第一个运行的参数[“tini”, “java”, “-jar”, “/tutorial.jar”, “&”]

2.1 Dockerfile配置

# 环境
FROM openjdk:8-jdk-alpine
# 管理者信息
MAINTAINER xindaqi "******@qq.com"
# 本地文件挂载到容器
WORKDIR /home/xindaqi/project/tutorial
# 拷贝jar文件
COPY tutorial.jar /tutorial.jar
# 运行tini
RUN apk add --no-cache tini
# 设置端口号
EXPOSE 9121
# 运行jar包
ENTRYPOINT ["tini", "java", "-jar", "/tutorial.jar", "&"]

2.2 查看进程

  • 查看Pods
kubectl get pods
  • 进入Pods
kubectl exec -it pod-name -- /bin/sh
  • 查看pid
jps -l

由结果可知,java应用的pid为7。
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天然玩家

坚持才能做到极致

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值