KubernetesIngressが正しいパスにリダイレクトされない

Aug 22 2020

デプロイとして実行されているKubernetesクラスター内のApacheでホストされているDjangoアプリケーションがあります。アプリケーションはポート8080で実行されており、アプリのルートは「/」です。誰かが/ tascatyに入ると、入力がアプリケーションにリダイレクトされるようにしたいのですが、入力リソースに/ tascatyとしてパスを入力するとこれは発生しません。しかし、パスを/として設定すると、機能します。以下は私のAPPの詳細です

アプリケーション用のApache構成ファイル:

Listen 8080
<VirtualHost *:8080>

        WSGIDaemonProcess tascaty_dev python-path=/usr/local/lib/python3.8/dist-packages

        <Location />
                WSGIProcessGroup tascaty_dev
                WSGIApplicationGroup %{GLOBAL}
        </Location>

        WSGIScriptAlias / /usr/local/lib/python3.8/dist-packages/tascaty_project/wsgi.py
        <Directory /usr/local/lib/python3.8/dist-packages/tascaty_project/>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>

        Alias /static /usr/local/lib/python3.8/dist-packages/static
        <Directory /usr/local/lib/python3.8/dist-packages/static>
                Require all granted
        </Directory>
</VirtualHost>

アプリのデプロイ:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tascatyk8s-deployment
  namespace: tascaty
spec:
  replicas: 1
  selector:
    matchLabels:
      component: tascatyk8s
  template:
    metadata:
      labels:
        component: tascatyk8s
    spec:
      volumes:
        - name: tascatyk8s-mount
          persistentVolumeClaim:
            claimName: tascatyk8s-pvc
      containers:
        - name: tascatyk8s
          image: abdul8423/tascatyk8s:v3
          ports:
            - containerPort: 8080
          volumeMounts:
            - mountPath: /usr/local/lib/python3.8/dist-packages/users/migrations
              name: tascatyk8s-mount
              subPath: users
            - mountPath: /usr/local/lib/python3.8/dist-packages/tascaty/migrations
              name: tascatyk8s-mount
              subPath: tascaty
            - mountPath: /usr/local/lib/python3.8/dist-packages/leaves/migrations
              name: tascatyk8s-mount
              subPath: leaves
            - mountPath: /usr/local/lib/python3.8/dist-packages/blog/migrations
              name: tascatyk8s-mount
              subPath: blog
          env:
            - name: TASCATY_HOST
              valueFrom:
                configMapKeyRef:
                  name: tascatyk8s-dep-configmap
                  key: TASCATY_HOST
            - name: TASCATY_PORT
              valueFrom:
                configMapKeyRef:
                  name: tascatyk8s-dep-configmap
                  key: TASCATY_PORT
            - name: TASCATY_DB
              valueFrom:
                configMapKeyRef:
                  name: tascatyk8s-dep-configmap
                  key: TASCATY_DB
            - name: TASCATY_USER
              valueFrom:
                configMapKeyRef:
                  name: tascatyk8s-dep-configmap
                  key: TASCATY_USER
            - name: TASCATY_PASS
              valueFrom: 
                secretKeyRef:
                  name: tascaty-secret
                  key: MYSQL_PASSWORD
      nodeSelector:
        component: tascaty

アプリサービス

apiVersion: v1
kind: Service
metadata:
  name: tascatyk8s-cluster-ip-service
  namespace: tascaty
spec:
  type: ClusterIP
  selector:
    component: tascatyk8s
  ports:
    - port: 8080
      targetPort: 8080

Ingress Controllerは、を使用してインストールされます

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/baremetal/deploy.yaml

入力リソース:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: tascatyk8s-deployment-ingress
  namespace: tascaty
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /tascaty
        backend:
          serviceName: tascatyk8s-cluster-ip-service
          servicePort: 8080

アクセスしようとすると https://192.168.56.2:31150/tascaty にリダイレクトします https://192.168.56.2:31150/login/?next=/ しかし、私は 404 Not Found

しかし、入力リソース内のパスを/ tascatyではなく/に置き換えると正常に機能します。

回答

1 Rico Aug 22 2020 at 13:05

入力パスで何が起こっているのか/tascaty

Apache / WSGIサーバーがリダイレクトを実行しています。にリダイレクトした後、/クライアントは入力に戻り、入力はそれを処理する方法を知らないため、404

入力パスで何が起こっているのか/

Apache / WSGIサーバーがリダイレクトを実行しています。にリダイレクトした後、/クライアントは入力に戻り、入力は処理方法を知って/おり、すべてうまく機能します。

したがって、入力(nginxを実行している)とApacheの両方が常に同じパスで合意する必要があります。したがって/、入力で使用するか、Apache構成を変更してサービスを提供し/tascaty、リダイレクトする代わりににリダイレクトする/ようにし/tascatyます。

後者の例:

Listen 8080
<VirtualHost *:8080>

        WSGIDaemonProcess tascaty_dev python-path=/usr/local/lib/python3.8/dist-packages

        <Location /tascaty>
                WSGIProcessGroup tascaty_dev
                WSGIApplicationGroup %{GLOBAL}
        </Location>

        WSGIScriptAlias /tascaty /usr/local/lib/python3.8/dist-packages/tascaty_project/wsgi.py
        <Directory /usr/local/lib/python3.8/dist-packages/tascaty_project/>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>

        Alias /tascaty/static /usr/local/lib/python3.8/dist-packages/static
        <Directory /usr/local/lib/python3.8/dist-packages/static>
                Require all granted
        </Directory>
</VirtualHost>

また、これを入力マニフェストから削除する必要があります。

    nginx.ingress.kubernetes.io/rewrite-target: /

✌️