无法从 /api 访问我的 Django 应用程序

cannot access my Django application from /api

提问人:Ali Hamza 提问时间:4/5/2023 最后编辑:Ali Hamza 更新时间:4/5/2023 访问量:58

问:

我已经在我的本地机器 Windows 笔记本电脑上的 kubernetes 上部署了我的 django Api。

我还设置了 kubernetes 部署、LoadBalancer 服务和入口文件。 但是当我尝试使用路径 http://localhost/api/my-api-endpoint 访问api时,它不起作用,并抛出错误服务器未找到。

虽然我只需使用 https://locahost/my-api-endpoint 即可成功连接

下面是我的服务文件和Docker文件:

# START Service
apiVersion: v1
kind: Service
metadata:
  name: peopledb-api-service
  labels:
    app: peopledb-api-service
spec:
  type: LoadBalancer
  ports:
    - port: 80 #port that the service exposes
      targetPort: 8000 #port that the app is receiving requests from via the pod
  selector:
    name: peopledb-api-deployment
# END SERVICE

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: django-api-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: localhost
  - http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: peopledb-api-service
            port:
              number: 80

Docker 文件:

FROM python:3.9.7-slim 
ENV PYTHONUNBUFFERED=1
WORKDIR /api
COPY requirements.txt /api/
RUN pip install -r requirements.txt
COPY . /api/
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

请注意,我没有包含任何自定义 nginx 配置文件,或者我也没有在我的 Django 应用程序设置中指定任何基本 URL。

我做错了什么?我需要使用 nginx 的自定义配置吗?如果是,那又怎样? 我是否需要在 Django 应用或 Django 应用设置的 API URL 中指定任何基本 URL?

directory structure on my pod

更新了有效的 Ingress 配置:

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: django-api-ingress
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /api/.*
        pathType: Prefix
        backend:
          service:
            name: peopledb-api-service
            port:
              number: 80
    host: localhost

请注意,在此更新中,我添加了 Host,使用正则表达式而不是 rewrite-target,并使用正则表达式更新了路径。

为了解决这个问题,我在所有 Api 端点的前面添加了前缀“api/”,它抛出错误“无法匹配配置的 django appURL 中的空路径” 例如,更新前path: api/

endoint_url = get_token

更新后endoint_url = api/get_token

Django Kubernetes 部署 kubernetes-ingress nginx-ingress

评论

0赞 Andromeda 4/5/2023
请求是否到达 python 服务器?

答:

0赞 Michał Lewndowski 4/5/2023 #1

您的定义中存在错误配置。 应该是块的一部分。ingresshosthttp

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: django-api-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: peopledb-api-service
            port:
              number: 80
    host: localhost

请参阅文档。

评论

0赞 Ali Hamza 4/5/2023
我尝试更新规则并添加主机:localhost 请求开始到达 nginx,当我使用 localhost/api 时,这会抛出与 App config.urls 中的空路径不匹配,因此我不得不在 django App.urls 中为我的所有 API 端点添加前缀。在这些更改之后它起作用了,但我仍然不知道这是否是用户入口的正确方法,或者它只是因为我在 django 应用程序中更改了我的 API URL。我也在问题中添加了更新的文件。.