微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

nginx ingress&rewrite-target

我有一个响应对/ api /的请求的pod

我想对/ 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] 举报,一经查实,本站将立刻删除。

相关推荐