首次Kubernetes部署失败求助:YAML配置问题排查
排查Kubernetes应用Ingress访问错误的步骤
按以下顺序逐步排查,定位问题所在:
1. 确认Ingress Controller已部署并运行
Ingress资源只是流量转发规则,必须搭配对应的Ingress Controller(比如nginx-ingress)才能生效。执行以下命令检查:
kubectl get pods -n ingress-nginx
如果没有任何运行中的Pod,说明你还没部署Ingress Controller,需要先完成这一步(比如用helm或官方yaml部署nginx-ingress)。
2. 验证Pod与Service的基础连通性
先排除Pod和Service层面的问题:
- 检查Pod状态:确保所有副本正常运行
输出里kubectl get podsSTATUS列必须是Running,如果有CrashLoopBackOff或其他异常,先查看Pod日志定位启动问题:kubectl logs <pod-name>。 - 检查Service与Pod的关联:查看Service的端点是否存在Pod IP
找到kubectl describe service app-serviceEndpoints字段,如果是空值,说明Deployment的Pod标签和Service的selector不匹配(你的配置里标签是app: learning-app-pod,看起来匹配,但可以用kubectl get pods --show-labels确认Pod实际标签)。 - 集群内测试Service访问:用临时Pod测试Service是否能返回正常响应
如果这里返回错误,说明问题出在Pod或Service,和Ingress无关,先解决这部分。kubectl run -it --rm --image=busybox:1.36 curl-test -- curl app-service:8012
3. 检查Ingress配置与状态
- 查看Ingress的同步状态和事件:
检查kubectl describe ingress app-ingressEvents字段,看是否有Ingress Controller返回的错误(比如规则同步失败)。 - 路径匹配与重写问题:
你的Ingress配置里,/abc路径会把完整的/abc请求转发给Pod,如果应用没有对应的/abc路由,就会返回404。这种情况下需要添加路径重写注解,以nginx-ingress为例,修改ingress.yaml:
这个配置会把apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-ingress labels: name: app-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: localhost http: paths: - pathType: Prefix path: "/(|$)(.*)" backend: service: name: app-service port: number: 8012 - pathType: Prefix path: "/abc(/|$)(.*)" backend: service: name: app-service port: number: 8012/abc/xxx重写为/xxx转发给应用,适配只处理根路径的应用。
4. 本地访问的网络配置问题
- 如果用Minikube:需要执行
minikube tunnel暴露Ingress的LoadBalancer端口,之后用kubectl get ingress获取的ADDRESS访问,而非直接用localhost。 - 如果用Docker Desktop:确认Ingress Controller的端口已映射到本地80端口,或者直接访问Ingress的
ADDRESS。 - 检查hosts文件:如果指定了
host: localhost,确保localhost指向Ingress Controller的IP(部分环境可能需要手动添加)。
内容的提问来源于stack exchange,提问作者Ali Salehi
相关产品推荐
相关产品推荐

