我有以下入口资源
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: /
的路径下替换时,它起作用了。
但是我无法找到解决问题的方法,任何有助于理解或解释这一问题的帮助都很好。
答案 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版开始,使用注释
中明确定义请求URI中需要传递到重写路径的所有子字符串。nginx.ingress.kubernetes.io/rewrite-target
的入口定义与以前的版本不向后兼容。在0.22.0及更高版本中,必须在capture groupCaptured 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