/和/ *在入口规范/规则/ http / paths / path中有什么区别

时间:2019-06-28 14:29:22

标签: kubernetes minikube

我有以下入口资源


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: /的路径下替换时,它起作用了。

但是我无法找到解决问题的方法,任何有助于理解或解释这一问题的帮助都很好。

3 个答案:

答案 0 :(得分:1)

//*的含义取决于您的ingress implementation,例如,使用NGINX和GCE入口实现,可以选择不同的路径范围:

  

路径:/ foo /.*

  

路径:/ *

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

在您的情况下,假设您使用的是NGINX,则/*不会被解释为全局模式,因此仅允许直接连接到/*。其他所有内容都将发送到default backend

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您应该选中NGINX Ingress Controller - Rewrite

  

从0.22.0版开始,使用注释nginx.ingress.kubernetes.io/rewrite-target的入口定义与以前的版本不向后兼容。在0.22.0及更高版本中,必须在capture group

中明确定义请求URI中需要传递到重写路径的所有子字符串。      

Captured groups按时间顺序保存在编号的占位符中,格式为$1$2 ... $n。这些占位符可用作rewrite-target批注中的参数。

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

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: /$1
spec:
  rules:
    - host: test.my-docker-kubernetes-demo.com
      http:
        paths:
          - path: /(.*)
            backend:
              serviceName: my-demo-service
              servicePort: 3000