我创建了以下示例,它可以工作并且我将解释它。要运行这个最小化的示例,请运行以下命令:
我已经创建了一个可以运行的示例,接下来我会进行解释。要运行这个最小化的示例,请运行以下命令:
$ minikube start
$ minikube addons enable ingress
$ kubectl apply -f kubernetes.yaml
$ curl https://$(minikube ip)/auth/api/ --insecure
success - path: /api/
$ curl https://$(minikube ip)/auth/api --insecure
failure - path: /auth/api
$ curl https://$(minikube ip)/auth/api/blah/whatever --insecure
success - path: /api/blah/whatever
您会注意到,入口重写注释对末尾斜杠非常敏感。如果没有末尾斜杠,请求将不会被重写。然而,如果提供了末尾斜杠,请求URI将被重写,您的代理就会按预期工作。
在检查来自入口控制器内部的生成的nginx.conf
文件后,负责此行为的代码行是:
rewrite /auth/api/(.*) api/$1 break;
这行代码告诉我们只有与第一个参数匹配的请求才会被重写为第二个参数指定的路径。
我认为这是一个值得解决的错误。
kubernetes.yaml
---
apiVersion: v1
kind: Service
metadata:
name: ingress-rewite-example
spec:
selector:
app: ingress-rewite-example
ports:
- name: nginx
port: 80
protocol: TCP
targetPort: 80
type: NodePort
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: ingress-rewite-example
spec:
template:
metadata:
labels:
app: ingress-rewite-example
spec:
containers:
- name: ingress-rewite-example
image: fbgrecojr/office-hours:so-47837087
imagePullPolicy: Always
ports:
- containerPort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-rewite-example
annotations:
ingress.kubernetes.io/rewrite-target: /api
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /auth/api
backend:
serviceName: ingress-rewite-example
servicePort: 80
main.go
package main
import (
"fmt"
"strings"
"net/http"
)
func httpHandler(w http.ResponseWriter, r *http.Request) {
var response string
if strings.HasPrefix(r.URL.Path, "/api") {
response = "success"
} else {
response = "failure"
}
fmt.Fprintf(w, response + " - path: " + r.URL.Path + "\n")
}
func main() {
http.HandleFunc("/", httpHandler)
panic(http.ListenAndServe(":80", nil))
}
apiVersion: networking.k8s.io/v1beta1
和nginx.ingress.kubernetes.io/rewrite-target
。 - StackEng2010