本地K8s集群部署Ambassador Edge Stack后Mapping访问返回404问题
核心排查步骤
步骤1:验证资源配置是否正常加载
首先执行命令检查自定义资源是否存在配置错误:# 检查Mapping资源状态 kubectl get mapping -n sample-on-ambassador-edgestack kubectl describe mapping my-mappingrules -n sample-on-ambassador-edgestack # 检查Listener资源状态 kubectl get listener -A若describe结果的Events栏存在报错,优先处理报错项。也可通过端口转发访问Ambassador诊断界面确认配置同步状态:
kubectl port-forward -n ambassador svc/edge-stack-admin 8877访问http://localhost:8877/ambassador/v0/diag/ 即可查看已生效的所有路由规则。
步骤2:排查Host头匹配问题
你测试时访问的是带端口的地址http://local.edgestack.com:32510/apple/,此时请求的Host头会自动带上端口local.edgestack.com:32510,与Mapping中配置的无端口hostnamelocal.edgestack.com无法匹配。
修复方案:修改Mapping的hostname字段,支持带任意端口的匹配:spec: hostname: "local.edgestack.com:*" # 加*通配符匹配所有端口 prefix: /apple/ service: my-apple-service.sample-on-ambassador-edgestack步骤3:确认NodePort与Listener端口匹配
检查edge-stack服务的NodePort映射关系:kubectl get svc edge-stack -n ambassador确认你访问的32510端口对应的是Listener中已配置的80/8080端口,若映射的是其他未在Listener中声明的端口,请求不会被路由规则处理。
步骤4:排查上游服务路径匹配问题
Ambassador默认会将完整请求路径转发到上游服务,即你访问/apple/时,转发到my-apple-service的路径同样是/apple/,如果你的业务服务没有对应路径就会返回404。如果需要去掉前缀转发到根路径,可在Mapping中添加rewrite规则:spec: hostname: "local.edgestack.com:*" prefix: /apple/ rewrite: / # 新增该配置,将/apple/开头的路径重写为/转发到上游 service: my-apple-service.sample-on-ambassador-edgestack步骤5:查看Ambassador日志定位匹配逻辑
执行命令查看Ambassador Pod的实时日志,发起测试请求后可直观看到请求的匹配流程、转发地址和返回状态:kubectl logs -n ambassador <edge-stack-pod名称> -f
修改配置后重新apply即可生效,生效后再次测试访问即可。
内容的提问来源于stack exchange,提问作者Brijesh Shah

