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



我正在试图找出将Istio集成到我的应用程序中的最佳方法,该应用程序由React前端(由Nginx提供服务(和Django Rest Framework API组成。我能够使用以下nginx-config和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处命中后端。注意,我在端口443(而不是8000(上为后端提供服务,因为istio网关不能与80和443以外的任何端口一起工作。

无论如何,这种方法同时暴露集群外的前端和后端,这感觉有些过头了。是否有任何设置,以便只显式地暴露前端,并且我可以通过前端代理后端?使用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

首先,我建议查看kubernetes关于使用服务将前端连接到后端的文档,更具体地说,查看连接前端和后端服务的nginx配置。


还有一些django+react教程,可能会有所帮助:

  • https://medium.com/@gazzazaazhari/django-后端反应器前端基本技术-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

最终通过基于路径的路由解决了这一问题(感谢@DavidMaze的有益评论(:

# 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:
- '*'
---
# Source: myapp/virtual-service.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: myapp
spec:
hosts:
- '*'
gateways:
- myapp-gateway
http:
- match:
- uri:
prefix: '/api'
route:
- destination:
host: backend-svc
port:
number: 8000
- route:
- destination:
host: frontend-svc
port:
number: 80

最新更新