暂停k8s容器调试的一种方法

背景

Java应用由于mqttBroker连接配置错误(原因可能是broker环境变量注入错误)导致Pod一直重启,无法进入容器查看环境变量是否正常注入。

方案

非常好,你的 Dockerfile 是:

1
2
3
4
5
FROM amazoncorretto:21-alpine3.20-jdk
ENV PROJECT_NAME device-adapter
WORKDIR /home
COPY target/*.jar $PROJECT_NAME.jar
ENTRYPOINT ["java", "-jar", "device-adapter.jar"]

当前问题是应用启动失败(例如 MQTT_BROKER 注入错误),导致容器不断重启(CrashLoopBackOff),你 无法进入容器调试


✅ 解决目标

为了 进入容器进行调试,你需要:

  1. 暂时让容器 不自动运行 Java 应用(跳过 ENTRYPOINT)。
  2. 让 Pod 启动后保活,然后你可以用 kubectl exec 进去看日志、环境变量、配置文件。

✅ 方法一:在 Deployment 中临时 override commandsleep(推荐)

修改 Deployment 中的容器配置,在 spec.template.spec.containers[0] 下加上如下字段:

1
command: [ "sh", "-c", "sleep infinity" ]

🔧 修改后容器配置示例:

1
2
3
4
5
containers:
- name: device-adapter
image: your-image
command: [ "sh", "-c", "sleep infinity" ] # ✅ 临时覆盖 ENTRYPOINT
...

这样 Pod 启动后什么都不做,只会挂起等待,你可以:

1
kubectl exec -it <pod-name> -n forest-things -- sh

进去后可调试如下内容:

  • printenv | grep MQTT:确认环境变量是否注入
  • cat /home/config/application.yaml:确认配置文件是否挂载
  • java -jar device-adapter.jar:手动启动服务,查看报错信息
  • ls -al /homels -al /home/config:确认文件是否就绪

✅ 方法二:构建镜像时添加备用调试入口(进阶)

你也可以修改 Dockerfile,加入:

1
ENTRYPOINT ["sh", "-c", "exec java -jar device-adapter.jar"]

然后在 Deployment 中通过 command 覆盖:

1
2
command: [ "sh" ]
args: [ "-c", "sleep infinity" ]

这样更灵活,可以一键切换调试/启动模式。


✅ 后续:调试结束后恢复原始配置

确认问题解决后,只需删除或注释 command 部分:

1
# command: [ "sh", "-c", "sleep infinity" ]  # ❌ 删除后自动恢复 ENTRYPOINT

然后重新部署即可。