使用Nginx的K8s Ingress返回404,请求故障排查帮助
问题排查与解决方案
核心问题定位
Nginx日志提示Service "default/studio-auth-api" does not have any active Endpoint,说明Service未关联到处于就绪状态的Pod。虽然你能通过NodePort正常访问服务,但NodePort是直接暴露Pod端口,不受Pod就绪状态影响;而Service只会将标记为"就绪"的Pod加入端点列表,这是两者的核心差异。
具体修复方案
1. 修复存活探针端口错误
你的Deployment中存活探针访问的是localhost:80/health,但容器实际监听端口为8080(从Dapr配置dapr.io/app-port: "8080"、Service的targetPort:8080均可验证)。探针访问错误端口会导致持续失败,Pod被标记为未就绪,自然不会被Service纳入端点。
修改Deployment的存活探针配置:
livenessProbe: exec: command: - curl --fail http://localhost:8080/health || exit 1 failureThreshold: 3 periodSeconds: 30 timeoutSeconds: 30
2. 补充就绪探针(推荐)
仅依赖存活探针不足以确保Pod真正就绪,建议添加就绪探针,让Service仅在Pod完全可用时才将其加入端点:
readinessProbe: exec: command: - curl --fail http://localhost:8080/health || exit 1 initialDelaySeconds: 10 periodSeconds: 10
3. 验证标签匹配(兜底检查)
确认Service的selector与Pod的labels完全匹配:
- Service selector:
io.kompose.service: studio-auth-api - Pod labels:已包含
io.kompose.service: studio-auth-api,配置无误。若修复探针后仍有问题,可执行以下命令排查:
# 查看Service关联的端点状态 kubectl get endpoints studio-auth-api -n default # 查看Pod的标签和就绪状态 kubectl get pods -l io.kompose.service=studio-auth-api -n default -o wide
4. 优化Ingress路径规则
当前Ingress路径/auth(/|$)(.*)可简化为/auth(/|.*),更符合Nginx Ingress的路径匹配逻辑:
paths: - path: /auth(/|.*) pathType: ImplementationSpecific backend: service: name: studio-auth-api port: number: 8080
验证步骤
- 应用修改后的Deployment配置:
kubectl apply -f deployment.yaml -n default - 等待Pod重启并进入就绪状态:
kubectl wait pod -l io.kompose.service=studio-auth-api --for=condition=ready -n default - 确认Service已关联端点:
kubectl get endpoints studio-auth-api -n default - 重新访问
api.studio/auth/whatever验证功能正常
内容的提问来源于stack exchange,提问作者matt sharp
相关产品推荐
相关产品推荐

