2つのnginxWebサーバーをセットアップしています。 1つはAWSElastic Beanstalkでセットアップされ、もう1つはstable/nginx-ingressヘルムチャートを使用してKubernetesでセットアップされます。
Elastic Beanstalkウェブサーバーは、ドメインのすべてのサブルートからのトラフィックをKubernetesnginxウェブサーバーに転送します。 Kubernetes nginxのログを確認することで、これらが正しく転送されていることを確認できます。 Ingressリソースを使用して、このトラフィックが適切なKubernetesサービスに転送されていることを確認します。
ここに問題があります:2つのルートの1つであるメインの/
ルートが正しいサービスに転送され、200が返されます。もう1つのルートである/eks-test
が想定されます。同じサービスにルーティングしますが、404を返します。これはどのように可能ですか?
仕様:
Kubernetesのnginxはnginx0.25.1
を実行しています。
Nginxログ:
172.16.10.103 - [172.16.10.103] - - [12/Sep/2019:08:05:09 +0000] "GET / HTTP/1.0" 200 8 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36" 703 0.004 [default-eks-test-repo-80] [] 172.16.10.100:8080 8 0.004 200 90dfa37364a5c43e57f12c5fb1a2d86f
172.16.40.108 - [172.16.40.108] - - [12/Sep/2019:08:05:12 +0000] "GET /eks-test HTTP/1.0" 404 9 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36" 730 0.002 [default-eks-test-repo2-80] [] 172.16.43.125:8080 9 0.004 404 ef1c81bba75dff2bdd2376799aa93c56
最初のnginx構成(Elastic Beanstalk):
server {
listen 80;
server_name my.domain.com;
location / {
proxy_pass http://internal.my.domain.lan/;
proxy_set_header Host $Host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Kubernetes Ingressリソース:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: internal
name: eks-test
namespace: default
spec:
rules:
- Host: my.domain.com
http:
paths:
- path: /
backend:
serviceName: eks-test-repo
servicePort: 80
- path: /eks-test
backend:
serviceName: eks-test-repo
servicePort: 80
Kubernetesサービス:
kind: Service
apiVersion: v1
metadata:
name: eks-test-repo
namespace: default
labels:
name: eks-test-repo
spec
ports:
- port: 80
targetPort: 80
selector:
app: eks-test-repo
type: ClusterIP
Nginxヘルムチャートの値(デフォルトではない値):
controller.ingressClass: internal
Nginx Ingressは、リクエストのパスを削除しません。
Ingressで/eks-test
をリクエストすると、リクエストはパスを含めてサービスに転送され、コンテナで"GET /eks-test HTTP/1.0"
として終了します。コンテナには404
ルートがないため、コンテナは/eks-test
を返します。
リクエストからパスを削除する場合は、いくつかの ルールの書き換え を構成できます(例:nginx.ingress.kubernetes.io/rewrite-target: /
アノテーションの設定)。