无法阻止 Kubernetes Ingress 将路径向下发送到目标 pod

Can't prevent Kubernetes Ingress to send path down to target pod

这可能看起来像 duplicate 但它不是,因为链接线程中的解决方案对我不起作用。

我将 Ingress 配置为根据路径将请求分派到不同的 pods

期望的行为:

public_ip/app1 -> pod1_ip:container1_port/
public_ip/app2 -> pod2_ip:container2_port/
public_ip/app3 -> pod3_ip:container3_port/

实际行为:

public_ip/app1 -> pod1_ip:container1_port/app1
public_ip/app2 -> pod2_ip:container2_port/app2
public_ip/app3 -> pod3_ip:container3_port/app3

所以我们在 app1、app2、app3 上得到 404

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: some_name
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    acme.cert-manager.io/http01-edit-in-place: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  ingressClassName: "nginx"
  tls:
  - hosts:
    - some.host
    secretName: tls-cafe-ingress
  rules:
  - host: some.host
    http:
      paths:
      - path: /app1(/|$)(.*)
        backend:
          serviceName: app1
          servicePort: 1234
      - path: /app2(/|$)(.*)
        backend:
          serviceName: app2
          servicePort: 2345
      - path: /app3(/|$)(.*)
        backend:
          serviceName: app3
          servicePort: 3456

问题是 Ingress 忽略路径规范,一旦其中有正则表达式。这个可以通过查看Ingress的日志看出:

k logs -n nginx-ingress ingress-pod-name

这里我们可以看到 hat nginx 在日志中有对 /appX 的请求,并尝试从本地 html 文件夹为它们提供服务,换句话说,yaml 中定义的路径被忽略。

如果正则表达式从它工作的路径中删除,但随后路径被发送到下游的目标 pod,这会破坏应用程序

有两个流行的使用 Nginx 的 K8s Ingress 控制器:

适用于这种情况的主要区别在于注释的使用。对于您使用的社区入口控制器:

nginx.ingress.kubernetes.io/<annotation_type>

对于 nginxinc 使用:

nginx.org/<annoation_type> 

要查看更多差异,请访问 this 文档。