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
の後にパスを作成するには、サービスから見たパスの最初の部分を考慮して解決しますか?
つまり.
/Tomcat
に入力パスされている場合、/Tomcat/main.css
をTomcatサーバーに/main.css
として表示するにはどうすればよいですか(デフォルトのバックに解決されません)?/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
私はあなたが非常に最近のバージョンのイングレスコントローラーを持っていると仮定し、 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? ')