web-dev-qa-db-ja.com

Kubernetes Ingressパスの書き換え

Kubernetsの一部のサービスでIngressを実行しています。サービスはそれらのクラスターIPにリダイレクトされますが(ある程度正しく)、これらの基本パスの後にパスを正しく解決する方法がわかりません。たとえば、パス/にTomcatがあり、パス/nginxにNginxがあります。/以降のTomcatパスは解決されず、/のNginxパスも解決されません。 nginx.ingress.kubernetes.io/rewrite-target: /はすでにingress.yamlに設定されています。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: Tomcat-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  namespace: kube-system
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: Tomcat-deployment-service 
          servicePort: 8080
      - path: /nginx
        backend:
          serviceName: nginx-deployment-service 
          servicePort: 80

たとえば、Tomcatが/main.cssファイルを必要とする場合、ブラウザは/main.cssをフェッチしようとしますが、これはdefault-backendを返します。

また、Nginxサーバーで/nginx/をヒットしようとしている)にアクセスしようとすると、Nginxは/nginxが見つからない(明らかに)と言います。

2019/03/02 08:12:04 [error] 8#8: *343 open() "/usr/share/nginx/html/nginx" failed (2: No such file or directory), client: 10.128.0.7, server: localhost, request: "GET /nginx HTTP/1.1", Host: "REDACTED_SERVER_IP"
10.128.0.7 - - [02/Mar/2019:08:12:04 +0000] "GET /nginx HTTP/1.1" 404 153 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:65.0) Gecko/20100101 Firefox/65.0" "REDACTED_CLIENT_IP, REDACTED_SERVER_IP"
10.40.1.1 - - [02/Mar/2019:08:12:05 +0000] "GET /nginx HTTP/1.1" 404 153 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:65.0) Gecko/20100101 Firefox/65.0" "REDACTED_CLIENT_IP, REDACTED_SERVER_IP"
2019/03/02 08:12:05 [error] 8#8: *344 open() "/usr/share/nginx/html/nginx" failed (2: No such file or directory), client: 10.40.1.1, server: localhost, request: "GET /nginx HTTP/1.1", Host: "REDACTED_SERVER_IP"

ingress.yamlで指定されたpathの後にパスを作成するには、サービスから見たパスの最初の部分を考慮して解決しますか?

つまり.

  1. Tomcatが/Tomcatに入力パスされている場合、/Tomcat/main.cssをTomcatサーバーに/main.cssとして表示するにはどうすればよいですか(デフォルトのバックに解決されません)?
  2. Nginxが/nginxへの入力パスである場合、/nginxをNginxサーバーに対して/として表示するにはどうすればよいですか(/nginxとしては表示されません)?

これは/rewrite-targetが想定していることだと思いました。

ワイルドカードなどを使用する必要がありますか?

私のイングレスは次のとおりです:

Name:             Tomcat-ingress
Namespace:        kube-system
Address:          REDACTED_SERVER_IP
Default backend:  default-http-backend:80 (10.40.0.6:8080)
Rules:
  Host  Path  Backends
  ----  ----  --------
  *         
        /        Tomcat-deployment-service:8080 (10.40.2.15:8080)
        /nginx   nginx-dep-ser:80 (10.40.0.26:80,10.40.1.46:80)
Annotations:
  ingress.kubernetes.io/url-map:                     k8s-um-kube-system-Tomcat-ingress--b0fc8aa23db1001d
  kubectl.kubernetes.io/last-applied-configuration:  {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"nginx.ingress.kubernetes.io/rewrite-target":"/"},"name":"Tomcat-ingress","namespace":"kube-system"},"spec":{"rules":[{"http":{"paths":[{"backend":{"serviceName":"Tomcat-deployment-service","servicePort":8080},"path":"/"},{"backend":{"serviceName":"nginx-dep-ser","servicePort":80},"path":"/nginx"}]}}]}}

  nginx.ingress.kubernetes.io/rewrite-target:  /
  ingress.kubernetes.io/backends:              {"k8s-be-30985--b0fc8aa23db1001d":"HEALTHY","k8s-be-31229--b0fc8aa23db1001d":"HEALTHY","k8s-be-32736--b0fc8aa23db1001d":"HEALTHY"}
  ingress.kubernetes.io/forwarding-rule:       k8s-fw-kube-system-Tomcat-ingress--b0fc8aa23db1001d
  ingress.kubernetes.io/target-proxy:          k8s-tp-kube-system-Tomcat-ingress--b0fc8aa23db1001d
Events:
  Type    Reason  Age                From                      Message
  ----    ------  ----               ----                      -------
  Normal  CREATE  33m                nginx-ingress-controller  Ingress kube-system/Tomcat-ingress
  Normal  ADD     33m                loadbalancer-controller   kube-system/Tomcat-ingress
  Normal  UPDATE  3m (x65 over 33m)  nginx-ingress-controller  Ingress kube-system/Tomcat-ingress
  Normal  CREATE  3m (x31 over 33m)  loadbalancer-controller   ip: REDACTED_SERVER_IP
3
Display name

私はあなたが非常に最近のバージョンのイングレスコントローラーを持っていると仮定し、 documentation に従って:

バージョン0.22.0以降、アノテーションnginx.ingress.kubernetes.io/rewrite-targetを使用した上り定義は、以前のバージョンとの下位互換性がありません。バージョン0.22.0以降では、書き換えられたパスに渡す必要がある要求URI内の部分文字列は、キャプチャグループで明示的に定義する必要があります。

例えば:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
  name: Tomcat-ingress
  namespace: default 
spec:
  rules:
  - Host: rewrite.bar.com
    http:
      paths:
      - backend:
          serviceName: Tomcat-deployment-service
          servicePort: 8080
        path: /Tomcat/?(.*)
      - backend:
          serviceName: nginx-deployment-service
          servicePort: 80
        path: /nginx/?(.*)

現在の設定は、//nginxの宛先で、最新バージョンのIngressコントローラーでのみ正常に機能します。

もう1つの重要なことは、Ingressオブジェクトは、それが参照するサービスと同じ名前空間に作成する必要があることです。それ以外の場合、ingress-nginxは通常503 Service Temporarily Unavailableエラーを返します。

また、serviceNameの別の名前空間にあるサービスを参照することはできません。

dNS-1035ラベルは、小文字の英数字または「-」で構成され、英字で始まり、英数字で終わる必要があります(例:「my-name」または「abc-123」、検証に使用される正規表現は「 az? ')

3
VAS