暂停k8s容器调试的一种方法
背景
Java应用由于mqttBroker连接配置错误(原因可能是broker环境变量注入错误)导致Pod一直重启,无法进入容器查看环境变量是否正常注入。
方案
非常好,你的 Dockerfile 是:
1 | FROM amazoncorretto:21-alpine3.20-jdk |
当前问题是应用启动失败(例如 MQTT_BROKER
注入错误),导致容器不断重启(CrashLoopBackOff),你 无法进入容器调试。
✅ 解决目标
为了 进入容器进行调试,你需要:
- 暂时让容器 不自动运行 Java 应用(跳过
ENTRYPOINT
)。 - 让 Pod 启动后保活,然后你可以用
kubectl exec
进去看日志、环境变量、配置文件。
✅ 方法一:在 Deployment
中临时 override command
为 sleep
(推荐)
修改 Deployment 中的容器配置,在 spec.template.spec.containers[0]
下加上如下字段:
1 | command: [ "sh", "-c", "sleep infinity" ] |
🔧 修改后容器配置示例:
1 | containers: |
这样 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 /home
、ls -al /home/config
:确认文件是否就绪
✅ 方法二:构建镜像时添加备用调试入口(进阶)
你也可以修改 Dockerfile,加入:
1 | ENTRYPOINT ["sh", "-c", "exec java -jar device-adapter.jar"] |
然后在 Deployment
中通过 command
覆盖:
1 | command: [ "sh" ] |
这样更灵活,可以一键切换调试/启动模式。
✅ 后续:调试结束后恢复原始配置
确认问题解决后,只需删除或注释 command
部分:
1 | # command: [ "sh", "-c", "sleep infinity" ] # ❌ 删除后自动恢复 ENTRYPOINT |
然后重新部署即可。