web-dev-qa-db-ja.com

nginxがKubernetesIngressルートで404を返すのはなぜですか?

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
1
Lars S

Nginx Ingressは、リクエストのパスを削除しません。

Ingressで/eks-testをリクエストすると、リクエストはパスを含めてサービスに転送され、コンテナで"GET /eks-test HTTP/1.0"として終了します。コンテナには404ルートがないため、コンテナは/eks-testを返します。

リクエストからパスを削除する場合は、いくつかの ルールの書き換え を構成できます(例:nginx.ingress.kubernetes.io/rewrite-target: /アノテーションの設定)。

0