在OpenShift部署Spring Maven应用时遭遇502 Bad Gateway问题求助
问题排查:OpenShift部署Spring Boot应用后返回502 Bad Gateway
我有一个基于Java 17的通用Hello World Spring Maven应用,本地构建Docker镜像并运行正常。部署到OpenShift后,Pod日志显示应用已成功启动,但访问对应URL时返回“502 Bad Gateway”错误,需要排查配置中的问题。
应用相关信息
- 基于Java 17的Spring Boot Maven Hello World应用
- Dockerfile内容:
from amazoncorretto:17-alpine-jdk as application-builder #copy project RUN mkdir /project COPY . /project RUN apk add maven #get project and package it up WORKDIR /project RUN mvn clean package from amazoncorretto:17-alpine-jdk as application-runner COPY --from=application-builder /project/target/colosseo-api-toolbelt-0.0.1-SNAPSHOT.jar /project/target/colosseo-api-toolbelt-0.0.1-SNAPSHOT.jar EXPOSE 8080 CMD ["java","-jar","/project/target/colosseo-api-toolbelt-0.0.1-SNAPSHOT.jar"]
- 部署脚本:
docker build -t spring-hello-world-maven . oc project $OC_PROJECT OC_PATCH_STATUS=$(oc patch deploymentconfig spring-hello-world-maven -p "{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"name\":\"spring-hello-world-maven\",\"image\": \"spring-hello-world-maven\"}]}}}}") echo $OC_PATCH_STATUS if [[ "$OC_PATCH_STATUS" == *"not patched" ]]; then oc rollout latest dc/$SELECTOR oc rollout status dc/$SELECTOR fi oc logout
排查步骤
1. 检查服务与路由的端口映射配置
- 验证服务(Service)是否正确关联Pod:
确认oc get svc spring-hello-world-maven -o yamlspec.selector匹配Pod的标签,ports配置里的targetPort为8080(和容器暴露端口一致)。 - 检查路由(Route)是否正确指向服务:
确认oc get route spring-hello-world-maven -o yamlspec.to.name是对应的服务名,port.targetPort与服务端口一致。
2. 验证容器内应用的监听状态
- 进入运行中的Pod,检查端口监听情况:
或者用oc rsh <你的Pod名称> netstat -tulpn | grep 8080ss命令替代:
必须确保应用监听的是ss -tulpn | grep 80800.0.0.0:8080,如果仅监听127.0.0.1,外部无法访问。
3. 排查网络策略限制
- 检查是否有网络策略阻止外部访问:
如果存在限制策略,需确保允许OpenShift路由控制器(oc get networkpolicyopenshift-ingress命名空间下的Pod)访问你的应用Pod。
4. 修复部署脚本的变量与镜像问题
- 部署脚本中
$SELECTOR变量未定义,会导致oc rollout命令执行失败,需替换为实际的DeploymentConfig名称spring-hello-world-maven。 - OpenShift无法直接访问本地Docker镜像,需将镜像推送到OpenShift可访问的仓库:
之后在DeploymentConfig中使用推送后的完整镜像地址。# 获取OpenShift内部镜像仓库地址 oc registry info # 给镜像打标签 docker tag spring-hello-world-maven <仓库地址>/<项目名>/spring-hello-world-maven # 推送镜像 docker push <仓库地址>/<项目名>/spring-hello-world-maven
5. 确认Spring Boot应用的监听配置
- 检查应用日志中是否有类似
Tomcat started on port(s): 8080 (http) with context path ''的记录,确认监听地址为0.0.0.0(默认配置,但如果有自定义配置需核实)。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

