Estoy tratando de encontrar la mejor manera de integrar Istio en mi aplicación, que consta de una interfaz React (servida por Nginx) y una API Django Rest Framework. Pude hacer que funcionara usando la siguiente configuración de nginx y los archivos de kubernetes específicos de istio:
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 Y el frontend puede llegar al backend en localhost:443 . Tenga en cuenta que estoy sirviendo el back-end en el puerto 443 (en lugar de 8000) debido a un problema relacionado con la puerta de enlace istio que no funciona con ningún puerto que no sea 80 y 443 .
Independientemente, este enfoque expone AMBOS, el front-end y el back-end fuera del clúster, lo que se siente como una exageración. ¿Hay alguna forma de configurar esto para que solo la interfaz se exponga explícitamente y pueda transmitir el backend a través de la interfaz? ¿Usando istio o nginx?
Puede que esté muy lejos de aquí, pero parece que esto puede ser complicado porque el cliente está haciendo la llamada al backend. ¿Tendría que encontrar una manera de hacer la llamada dentro del clúster y devolverla al cliente?
Según tengo entendido, debería funcionar así.
user -> istio ingressgateway -> istio virtual service -> frontend service -> nginx -> backend serviceEl servicio virtual de Istio debería tener este aspecto, por lo que solo se expone el frontend y luego configura su nginx para que actúe como proxy del backend a través del frontend.
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: myapp spec: hosts: - '*' gateways: - myapp-gateway http: - route: - destination: host: frontend-svc port: number: 80Para empezar, recomendaría echar un vistazo a la documentación de kubernetes sobre Conectar un front-end a un back-end usando un servicio y, más específicamente, mirar la configuración de nginx que conecta el front-end con el servicio de back-end.
Y algunos tutoriales de django + reaccionar que podrían ayudar:
Finalmente descubrí esto haciendo enrutamiento basado en rutas (gracias @DavidMaze por el útil comentario):
# 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