Прокси-сервер через интерфейс с использованием istio или nginx - PullRequest
1 голос
/ 08 мая 2020

Я пытаюсь найти лучший способ интегрировать Istio в свое приложение, которое состоит из интерфейса React (обслуживается Nginx) и Django Rest Framework API. Мне удалось заставить его работать, используя следующие файлы конфигурации nginx и istio-specifici c 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?

Я могу быть далеко, но звучит так, как будто это может быть сложно, потому что клиент делает вызов бэкэнду. Мне нужно было найти способ сделать вызов внутри кластера и вернуть его клиенту?

Ответы [ 2 ]

1 голос
/ 08 мая 2020
• 1000 интерфейс.
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 + обучающие программы, которые могут помочь:

0 голосов
/ 12 мая 2020

Наконец понял это, выполнив маршрутизацию на основе пути (спасибо @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
...