入口中的 / 和 /* 有什么区别 spec/rules/http/paths/path

what is the difference between / and /* in ingress spec/rules/http/paths/path

我有以下入口资源


apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kubernetes-demo-ing
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: \"false\"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: test.my-docker-kubernetes-demo.com
      http:
        paths:
          - path: /*
            backend:
              serviceName: my-demo-service
              servicePort: 3000

我的应用无法在此处访问 test.my-docker-kubernetes-demo.com 我正在访问 too many redirects error

但是当我在 path: /* to path: / 的路径下替换时,它起作用了。

但我找不到它是如何解决问题的,如果能帮助理解或解释这个问题,那就太好了。

您可以在 k8s.io/api/extensions/v1beta1 中找到 spec.rules[].http.paths[].path 的简短说明。

你应该检查 NGINX Ingress Controller - Rewrite

Starting in Version 0.22.0, ingress definitions using the annotation nginx.ingress.kubernetes.io/rewrite-targetare not backwards compatible with previous versions. In Version 0.22.0 and beyond, any substrings within the request URI that need to be passed to the rewritten path must explicitly be defined in a capture group

Captured groups are saved in numbered placeholders, chronologically, in the form </code>, <code> ... $n. These placeholders can be used as parameters in the rewrite-target annotation.

您可以通过以下方式查看版本:

kubectl exec -it <nginx-ingress-controller-pod-name> -n ingress-nginx -- /nginx-ingress-controller --version

我认为您的 Ingress 应该如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kubernetes-demo-ing
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: test.my-docker-kubernetes-demo.com
      http:
        paths:
          - path: /(.*)
            backend:
              serviceName: my-demo-service
              servicePort: 3000

//* 的含义取决于您的 ingress implementation,例如,使用 NGINX 与 GCE 入口实现有不同的方式来选择一系列路径:

path: /foo/.*

path: /*

您可以通过设置 kubernetes.io/ingress.class 注释来选择要使用的实现。

在您的情况下,假设您使用的是 NGINX,/* 不会被解释为 glob 模式,因此只允许直接连接到 /*。其他任何内容都会发送到 default backend.