Kubernetes Ingress 未重定向到正确的路径

标签 kubernetes kubernetes-ingress nginx-ingress

我有一个 Django 应用程序托管在 Kubernetes 集群内的 Apache 上,作为部署运行。应用程序在端口 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

image1

但是当我用/而不是/tascaty 替换入口资源内的路径时,它工作正常。

最佳答案

入口路径发生了什么 /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>

此外,您需要将其从入口 list 中删除:

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

✌️<​​/p>

关于Kubernetes Ingress 未重定向到正确的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63532836/

相关文章:

docker - 将持久卷声明添加到容器中的现有文件

kubernetes - 得到这个错误!与服务器localhost:8080的连接被拒绝-您是否指定了正确的主机或端口?

kubernetes - GKE 流式传输大文件下载失败并出现部分响应

nginx - Nginx Controller 的入口不起作用,地址丢失

ssl - 支持 TLS : Kubernetes Ingress on GKE 的通配符域

ssl - Kubernetes Ingress TLS 不是使用 headless 服务创建的

kubernetes - 无法使用Vagrant初始化Kubernetes集群

kubernetes - Traefik 入口 404

kubernetes - GKE 入口;将重写应用于特定服务

Kubernetes nginx ingress 0.22 不尊重 cookie 亲和性注释?