You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

三、验证步骤

  1. 应用修正后的配置:
kubectl apply -f your-config.yaml
  1. 等待Pod和Ingress进入就绪状态:
kubectl get pods -n web
kubectl get ingress -n web
  1. 在本地hosts文件中添加test.home指向Ingress控制器的LoadBalancer IP
  2. 访问http://test.home/test验证是否正常返回内容

内容的提问来源于stack exchange,提问作者marex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:35:13