k8s pod故障调试
自从有了AI以后我已经很久不写博客了但是今天被小米的MiMo-V2.6-Pro指导的太好了还是写写笔记吧。故障现象一个研发环境的k8s pod有jvm启动参数要加载一个单独的许可证文件配置了pvc卷看deployment 卷挂载路径也对但是程序就是读不到然后这个pod就循环崩溃起不来你想进Pod调试也不行它起不来不给你机会进去调试。解决方案 编辑deployment覆盖启动命令不启动java程序改成下面这样spec: containers: - name: app image: your-app-image command: [sh, -c, sleep 3600] # 覆盖原始启动命令也就是在原有的image下面额外添加一行command: [sh, -c, sleep 3600] 去覆盖掉原来的java程序启动让pod先正常跑起来这样才有机会连上去验证文件路径挂载是否正确执行kubectl -n namespace edit deployment 你的svc名称 然后 kubectl -n namespace exec --it pod实例名称 -- /bin/bash进Pod以后查看挂载及许可证文件路径一点问题也没有那就试试在pod里面手动启动Java程序能不能起来java -Dinforsuite.license-path/data/license.infor -jar /path/to/app.jar测试以后发现可以正常启动也就是挂载和许可文件没问题问题出在原来的docker启动命令上面了查看原来的Dockerfile启动命令是# 启动应用 ENTRYPOINT [sh,-c,java $JVMOPTIONS -jar $APP_HOME/$APP_NAME.jar $PARAMS]我本来也是配置的这个JVMOPTIONS变量在流水线里面配置的是没毛病啊路径正确那就是这个环境变量在真实的pod里面没生效在pod实例里面执行echo [$JVMOPTIONS]输出[] 最终破案是环境变量值没有传递过来在k8s的svc配置里面增加spec: containers: - name: project-name-placeholder-container image: harbor-placeholder/library-placeholder/project-name-placeholder:version-placeholder imagePullPolicy: Always ports: - containerPort: http-port-placeholder env: - name: JVMOPTIONS value: -Dinforsuite.license-path/data/license.infor也就是在env里面增加JVMOPTIONS这个环境变量及配置正确的值问题解决。最后删除之前手动加的那个command还挺费事需要这样移除掉kubectl -n 你的namespace patch deployment xxxxx-deploy \ --typejson \ -p[{op:remove,path:/spec/template/spec/containers/0/command}]