Kubernetes Ingress 没有重定向到正确的路径
Kubernetes Ingress not redirecting to correct path
我在 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 it redirects to https://192.168.56.2:31150/login/?next=/
但我得到一个 404 Not Found
但是当我将入口资源中的路径替换为 / 而不是 /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>
此外,您需要从入口清单中删除它:
nginx.ingress.kubernetes.io/rewrite-target: /
✌️
我在 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 it redirects to https://192.168.56.2:31150/login/?next=/
但我得到一个 404 Not Found
但是当我将入口资源中的路径替换为 / 而不是 /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>
此外,您需要从入口清单中删除它:
nginx.ingress.kubernetes.io/rewrite-target: /
✌️