Kubernetes中HAProxy Ingress基于路径的路由失效求助
问题分析与解决方案
一、先修正配置中的明显错误
你的完整配置里存在重复的Service定义和无效的Ingress配置,这会导致Kubernetes无法正确处理Ingress规则:
- 重复定义了
web-server-service,需删除其中一份 - 中间的Ingress配置错误地在
spec下写入containers字段(这是Deployment的配置项,不属于Ingress),必须删除该错误片段
修正后的基础配置(Namespace+Deployment+Service)如下:
apiVersion: v1 kind: Namespace metadata: name: web --- apiVersion: apps/v1 kind: Deployment metadata: name: web-server namespace: web spec: selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: httpd image: httpd:2.4.53-alpine ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: web-server-service namespace: web spec: selector: app: web ports: - protocol: TCP port: 5000 targetPort: 80
二、解决路径路由失效的核心问题
当你把Ingress的path设为/test时,HAProxy会将请求原封不动转发到后端httpd服务的/test路径,但默认httpd镜像仅在根路径/下有资源,因此返回404。以下两种方案可解决该问题:
方案1:修改后端服务的资源路径
直接在httpd容器中创建/test目录并添加测试页面,可通过修改Deployment的容器命令实现:
apiVersion: apps/v1 kind: Deployment metadata: name: web-server namespace: web spec: selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: httpd image: httpd:2.4.53-alpine command: ["/bin/sh", "-c"] args: - mkdir -p /usr/local/apache2/htdocs/test && echo "<h1>Test Path</h1>" > /usr/local/apache2/htdocs/test/index.html && httpd-foreground ports: - containerPort: 80
对应Ingress配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-server-ingress namespace: web spec: ingressClassName: haproxy rules: - host: test.home http: paths: - path: /test pathType: Prefix backend: service: name: web-server-service port: number: 5000
方案2:配置HAProxy路径重写(推荐)
通过Ingress注解让HAProxy将/test前缀的请求重写为后端服务的根路径,无需修改后端服务配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-server-ingress namespace: web annotations: # 重写规则:将/test开头的路径替换为根路径,保留后续子路径 haproxy.org/path-rewrite: "^/test(/.*)?$ /$1" spec: ingressClassName: haproxy rules: - host: test.home http: paths: - path: /test pathType: Prefix backend: service: name: web-server-service port: number: 5000
该规则的效果:
http://test.home/test转发到后端的/http://test.home/test/abc转发到后端的/abc
三、验证步骤
- 应用修正后的配置:
kubectl apply -f your-config.yaml
- 等待Pod和Ingress进入就绪状态:
kubectl get pods -n web kubectl get ingress -n web
- 在本地hosts文件中添加
test.home指向Ingress控制器的LoadBalancer IP - 访问
http://test.home/test验证是否正常返回内容
内容的提问来源于stack exchange,提问作者marex
相关产品推荐
相关产品推荐

