OpenShift 4.6中Route访问应用失效故障咨询
OpenShift 4.6 Route访问报Application is not available故障排查
故障现象
OpenShift 4.6环境中部署的应用Pod处于Running状态,支持oc exec进入容器内部核验状态,通过oc port-forward直连Pod也可以正常访问应用,但通过Route访问时返回默认错误页:
Application is not available
该端点当前无法为应用提供请求响应服务,应用可能尚未启动或仍处于启动过程中。
出现该页面的可能原因:
- 主机不存在。 请确认主机名输入正确,且集群中存在匹配该主机名的Route资源。
- 主机存在但无匹配路径。 请检查输入的URL路径是否正确,且创建Route时已配置目标访问路径。
- Route与路径匹配成功但所有Pod均处于异常下线状态。 请确认Route关联的暴露资源(Pod、Service、DeploymentConfig等)至少有一个Pod正常运行。
核心故障原因
注意:oc port-forward会绕过Service、Router链路直接转发流量到Pod,能正常访问就说明应用进程、Pod基础网络完全正常,排查时无需浪费时间检查应用启动状态、应用内部配置。故障点全部集中在Route到Pod的转发链路上,常见触发原因:
- Service配置错误:标签选择器与Pod实际标签不匹配、端口映射规则和应用实际监听端口不一致
- Route配置错误:访问主机名/路径与Route配置不匹配、TLS转发模式和后端应用协议不兼容、Route指向的Service或目标端口错误
- 链路组件异常:Service未生成正确的后端Endpoint列表、openshift-ingress项目下的HAProxy Router Pod运行异常
- 流量拦截规则:项目内自定义NetworkPolicy缺失放通规则,拦截了Router组件发来的请求
- 健康检查配置错误:Readiness探针探测失败,导致处于Running状态的Pod未被加入Service的可用后端池
排查步骤与解决方案
按从后端到入口的顺序逐段验证,每一步确认正常后再进入下一环:
1. 核验Service与Pod的关联状态
这是该场景最高发的故障点,优先排查:
- 执行命令查看目标Service的配置详情:
oc get svc <你的Service名称> -o yaml- 核对
spec.selector下的所有标签键值,和运行中Pod的标签完全一致(大小写、特殊字符偏差都会导致匹配失败) - 核对
spec.ports.targetPort值,和Pod内应用实际监听的端口完全一致,比如应用监听8080端口时,targetPort配置为80会直接导致转发失败
- 核对
- 执行命令查看Service关联的Endpoint列表:
oc get endpoints <你的Service名称>- 正常返回结果的
ENDPOINTS列会列出所有匹配Pod的IP+端口,如果列表为空,说明Service没有匹配到任何可用后端,修正标签选择器或端口配置即可 - 如果Endpoint列表存在有效地址,可进入openshift-ingress项目下的HAProxy Pod,直接curl对应Endpoint的IP+端口验证连通性,不通则检查是否存在网络策略拦截。
- 正常返回结果的
2. 核验Route配置正确性
确认Service配置无问题后,排查Route本身的配置错误:
- 执行命令查看目标Route的配置详情:
oc get route <你的Route名称> -o yaml- 核对
spec.to.name字段,确保指向的是你实际使用的Service,spec.port.targetPort和Service暴露的端口一致 - 如果配置了路径路由(
spec.path字段非空),确认访问的URL路径和配置的路径前缀匹配,比如Route配置path为/app时,直接访问根路径/会触发无匹配路径错误 - 核对TLS配置:后端为HTTP服务时,不要使用
passthrough模式(该模式要求后端直接提供HTTPS服务),选用edge模式即可;后端为HTTPS服务时,确认证书、SNI配置正确
- 核对
- 核对访问的主机地址:执行
oc get route获取Route自动分配的HOST值,和浏览器输入的地址完全一致,拼写错误、漏写子域名都会触发主机不存在的错误。
3. 核验链路组件与流量规则
如果前两步配置均正常,排查链路组件和拦截规则问题:
- 检查Router组件运行状态:
如果存在处于CrashLoopBackOff、Pending、Error状态的Router Pod,先恢复Router运行,Router异常会导致所有Route转发失效。oc get pods -n openshift-ingress - 检查项目下的NetworkPolicy配置:
默认配置会放通来自openshift-ingress项目的流量,如果自定义过NetworkPolicy,需要新增规则放通该命名空间的入站流量,否则Router的请求会被直接拦截。oc get networkpolicy -n <你的应用所在项目> - 检查Pod Readiness探针状态:
执行oc describe pod <你的Pod名称>查看事件记录,如果存在Readiness probe failed的报错,说明探针配置错误(探测端口、路径、超时时间不合理),探针失败的Pod不会被加入Service后端池,修正探针配置确保探测成功即可。
快速验证技巧
排查过程中可以给同一个Service创建一个最简临时Route,不配置自定义路径、自定义证书、自定义主机名,使用集群默认分配的配置,如果临时Route可以正常访问,说明问题完全出在原有Route的配置上,对比两个Route的配置差异即可快速定位错误点。
内容的提问来源于stack exchange,提问作者Sourav Mehra
相关产品推荐
相关产品推荐

