我试图找出将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教程可能会有所帮助:
关于django - 使用istio或nginx通过前端代理后端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61669890/