django - 使用istio或nginx通过前端代理后端

标签 django reactjs nginx kubernetes istio

我试图找出将Istio集成到我的应用程序中的最佳方法,该方法由React前端(由Nginx提供)和Django Rest Framework API组成。我可以使用以下nginx配置和特定于istio的kubernetes文件使其工作:

server {
    listen 80;
    root /app/build;

    location / {
        try_files $uri $uri/ /index.html;
    }
}
# Source: myapp/gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: myapp-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - '*'
    - port:
        number: 443
        name: https
        protocol: HTTP
      hosts:
        - '*'
---
# Source: myapp/virtual-service.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: myapp
spec:
  hosts:
    - '*'
  gateways:
    - myapp-gateway
  http:
    - match:
        - port: 80
      route:
        - destination:
            host: frontend-svc
            port:
              number: 80
    - match:
        - port: 443
      route:
        - destination:
            host: backend-svc
            port:
              number: 8000

前端可以通过localhost:443到达后端。注意,由于some issue regarding the istio gateway not working with any port other than 80 and 443,我在端口443(而不是8000)上提供后端服务。

无论如何,这种方法都将前端和后端同时暴露在集群外部,这感觉有些过时了。无论如何要进行设置,以便仅显式公开前端,并且我可以通过前端代理后端?使用istio还是Nginx?

我可能不在这里,但是听起来这可能很棘手,因为客户端正在调用后端。我必须找出一种方法来在集群内部进行调用并将其返回给客户端?

最佳答案

据我了解,它应该像这样工作。

user -> istio ingressgateway -> istio virtual service -> frontend service -> nginx -> backend service

Istio虚拟服务应如下所示,因此仅公开前端,然后将nginx配置为通过前端代理后端。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: myapp
spec:
  hosts:
    - '*'
  gateways:
    - myapp-gateway
  http:
  - route:
    - destination:
        host: frontend-svc
        port:
          number: 80

首先,我建议您看一下有关Connect a Front End to a Back End Using a Service的kubernetes文档,更具体地说,请看一下将前端与后端服务连接起来的nginx configuration

一些django + react教程可能会有所帮助:
  • https://medium.com/@gazzaazhari/django-backend-react-frontend-basic-tutorial-6249af7964e4
  • https://blog.miguelgrinberg.com/post/how-to-create-a-react--flask-project
  • https://felipelinsmachado.com/connecting-django-reactjs-via-nginx-using-docker-containers/
  • https://github.com/felipelm/django-nginx-reactjs-docker
  • 关于django - 使用istio或nginx通过前端代理后端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61669890/

    相关文章:

    django - Selenium 测试在各个测试之间非常慢

    python - 如何访问 __init__ 方法中的 django 表单值以进行查询

    jquery - 暂停表单提交以进行验证

    javascript - 如何根据 Electron 菜单点击更改 Redux 状态?

    reactjs - Webpack 和 SASS 问题(React 应用程序)

    javascript - ReactJS - 将对象数组的元素作为 Prop 传递

    nginx - sudo certbot delete 创建的错误

    docker - 适用于域的Docker SSL

    python - 使用 Python 和 Scrapy 进行递归爬取

    php - NGINX 'Access-Control-Allow-Origin' header 包含多个值