我想对/ auth / api /请求/ api /的请求进行重写.
使用Ingress(Nginx),我认为使用ingress.kubernetes.io/rewrite-target:annotation我可以这样做:
apiVersion:extensions / v1beta1
善良:Ingress
元数据:
名字:myapi-ing
注释:
ingress.kubernetes.io/rewrite-target:/ api
kubernetes.io/ingress.class:“Nginx”
规格:
规则:
– 主持人:api.myapp.com
HTTP:
路径:
– 路径:/ auth / api
后端:
serviceName:myapi
servicePort:myapi-port
然而,正在发生的是/ auth /被传递到服务/ pod并且正确地抛出了404.我一定是误解了重写注释.
有没有办法通过k8s&入节点?
解决方法:
我创建了以下示例,该示例有效,我将解释.要运行此最小示例,请运行以下命令:
$minikube start
$minikube addons enable ingress # might take a while for ingress pod to bootstrap
$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))
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。