2017-12-15 12 views
1

を私は/ APIにリクエストに応答ポッド/Kubernetes:nginxの進入&書き換える-対象

を持っている私は、要求がに/認証/ API// API /に行くの書き換えをしたいです。イングレス(nginxの)を使用して

は、私はingress.kubernetes.io/rewrite-targetとすることを考えた:私はそれをこのような何か行うことができます注釈:しかし、何が起こっている

apiVersion: extensions/v1beta1 kind: Ingress metadata: name: myapi-ing annotations: ingress.kubernetes.io/rewrite-target: /api kubernetes.io/ingress.class: "nginx" spec: rules: - host: api.myapp.com http: paths: - path: /auth/api backend: serviceName: myapi servicePort: myapi-port

は/ということですauth /がサービス/ポッドに渡され、404が正しくスローされます。私は書き換え注釈を誤解しているはずです。

k8s &イングレスでこれを行う方法はありますか?

答えて

2

私は以下の例題を作成しました。この最小限の例を実行するには、以下のコマンドを実行します。

$ 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; 

この行は、最初の引数に一致する要求だけがパスに書き換えされることを教えてくれる2番目の引数で指定します。

私はこれがバグにふさわしいと信じています。

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)) 
} 
+0

興味深いを(私のために助け) - 私は、URLへ追加する場合:httpsをカール:// $(minikube IP)/認証/ API /何とか/それはどちらか – matt

+0

@mattをキャッチしていないものは何でもあなたのコメントにあなたが提供した例が正しく機能します(私の更新された例を見てください)。 NGINXイングレスコントローラのバージョン0.9.0-beta.15とKubernetesのv1.8.0を実行していることに注意してください。 – frankgreco

0

書き換え対象の引数の周りに引用符(")を置くようにしてください。

ingress.kubernetes.io/rewrite-target: "/api" 
関連する問題