我是一名初学者,尝试使用 HAProxy Ingress 控制器在 Kubernetes 中设置基于路径的路由。当我使用 / 作为路径时,Ingress 可以工作,但当我尝试使用 /test 这样的路径时,Ingress 会失败。以下是我的 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: /
pathType: Prefix
backend:
service:
name: web-server-service
port:
number: 5000
这是我的完整配置:
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
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-server-ingress
namespace: 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
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-server-ingress
namespace: web
spec:
ingressClassName: haproxy
rules:
- host: test.home
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-server-service
port:
number: 5000
这是我的入口控制器的配置:
controller:
ingressClassResource:
enabled: true
kind: DaemonSet
daemonset:
useHostPort: false
service:
type: LoadBalancer
我尝试从头开始重新安装所有内容并使用不同的路径进行测试。我注意到,当我指定正确的路径(例如 /test)时,我收到一条错误消息,指出找不到资源。但是,当我指定不存在的路径(例如 /nonexistent)时,我会收到 404 Not Found 错误。这表明 /test 路径的路由可能没有正确配置。
出现这个问题是因为路径默认转发到后端。例如,在您的配置中,服务是 web-server-service。但是,Ingress 将路径转发为 test.home/test,这导致您的后端不堪重负,因为它没有配置来处理此类路径。因此,没有可用资源来处理该请求。
解决方案: 我自己找到了解决方案。您可以通过向 Ingress 资源添加以下注释来解决此问题:
annotations:
haproxy-ingress.github.io/rewrite-target: /
该注解重写了路径,以便后端以规范化的方式接收请求,例如简单的web-server-service,而不是转发原始路径(例如test.home/test)。此调整可确保后端能够正确处理请求,而无需针对意外路径进行特定配置。