Два приложения Flask по разным путям с ресурсом Kubernetes Ingress (nginx) - PullRequest
0 голосов
/ 29 октября 2019

Моя цель заключается в следующем: у меня есть два приложения Flask в двух отдельных контейнерах Docker, и я хочу получить к ним доступ по разным путям на одном и том же IP-адресе, например: 127.0.0.1/app1, 127.0.0.1/app2 (нос реальным IP-адресом).

Я хочу сделать это с Kubernetes.

У меня работает кластер Kubernetes (служба Azure Kubernetes), с развертыванием и службой для каждого из двух Docker. контейнеры. Модуль для каждого приложения работает нормально. Я также установил входной контроллер (Nginx) в своем кластере, и теперь я пытаюсь заставить его работать с одним ресурсом Ingress.

Если я делаю это следующим образом, он отлично работает для 1 отдельного приложения (любогоиз них работает по IP-адресу /):

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-name
  namespace: my-namespace
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: service1 (or service2)
          servicePort: 5000

Но когда я попробую следующее, это не сработает:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-name
  namespace: my-namespace
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /app1
        backend:
          serviceName: service1 
          servicePort: 5000
      - path: /app2
        backend:
          serviceName: service2 
          servicePort: 5000

Я могу увидеть HTML-страницу, которая получаетотрисовывается приложением Flask для обоих приложений по их соответствующим путям, но ни одна из функций не работает.

Кроме того факта, что пути не всегда кажутся работающими (иногда меня перенаправляют на IP-адрес/ когда я пытаюсь подключиться к IP-адресу / app1 или IP-адресу / app1 /), проблема заключается в следующем (я думаю):

Каждое из приложений Flask имеет маршрут "/ести",который принимает только запросы POST, когда выполняются соответствующие вызовы для приложений (каждое приложение является приложением AI, которое делает прогноз для заданного входа).

Вызовы для обоих приложений осуществляются на IP-адрес /прогнозировать, вместо IP-адреса / app1 / предиката или IP-адреса / app2 / предиката. Также к статическим файлам нельзя получить доступ из-за этой проблемы пути.

Я не знаю, является ли это правильным способом сделать это? Я тоже пытался поиграть с «rewrite-target», но так и не нашел решения.

Надеюсь, кто-то может объяснить мне, что я делаю неправильно.

1 Ответ

0 голосов
/ 29 октября 2019

Проверьте свою аннотацию перезаписи во входном ресурсе. Любой ваш запрос будет переписан на /. Это означает, что если вы позвоните IP: 80 / app1 , ваш контейнер получит IP: 80 /

nginx.ingress.kubernetes.io/rewrite-target: /

Если вы не хотите, чтобы это произошло,затем удалите эту переписанную аннотацию. Ваш вход будет выглядеть так:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-name
  namespace: my-namespace
spec:
  rules:
  - http:
      paths:
      - path: /app1
        backend:
          serviceName: service1 
          servicePort: 5000
      - path: /app2
        backend:
          serviceName: service2 
          servicePort: 5000

Ваши контейнеры получат полный путь на основе / app1 и / app2 .

ОБНОВЛЕНИЕ Проверьте этот пример. У меня есть два бэкэнда, которые прослушивают / и отвечают на html номером, который вы конфигурируете с помощью переменной среды.

---
apiVersion: v1
kind: Service
metadata:
  name: backend1
  namespace: default
  labels:
    mojix.service: backend1
spec:
  ports:
  - name: "8000"
    port: 8000
    targetPort: 8000
  selector:
    mojix.service: backend1
status:
  loadBalancer: {}

---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: default
  labels:
    mojix.service: backend1
  name: backend1
spec:
  replicas: 1
  selector:
    matchLabels:
      mojix.service: backend1
  template:
    metadata:
      creationTimestamp: null
      labels:
        mojix.service: backend1
    spec:
      containers:
      - name: backend1
        image: lozuwa/number_backend:latest
        env:
          - name: BACKEND_NUMBER
            value: "1"
      hostname: backend1
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: backend2
  namespace: default
  labels:
    mojix.service: backend2
spec:
  ports:
  - name: "8000"
    port: 8000
    targetPort: 8000
  selector:
    mojix.service: backend2
status:
  loadBalancer: {}

---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: default
  labels:
    mojix.service: backend2
  name: backend2
spec:
  replicas: 1
  selector:
    matchLabels:
      mojix.service: backend2
  template:
    metadata:
      creationTimestamp: null
      labels:
        mojix.service: backend2
    spec:
      containers:
      - name: backend2
        image: lozuwa/number_backend:latest
        env:
          - name: BACKEND_NUMBER
            value: "2"
      hostname: backend2
      restartPolicy: Always

У меня следующий вход.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: vizix-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /app1
        backend:
          serviceName: backend1
          servicePort: 8000
      - path: /app2
        backend:
          serviceName: backend2
          servicePort: 8000

Если вы нажмете IP/app1, вы получите Response from 1, а если вы нажмете IP/app2, вы получите Response from 2. Мои контейнеры прослушивают /, поэтому мне нужно переписать. Какой путь ожидает ваше приложение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...