Не удается запретить Kubernetes Ingress отправлять путь к целевому модулю

Это может выглядеть как дубликат, но это не так, поскольку решение в связанной теме не работает для меня.

Я настроил Ingress для отправки запросов в разные модули в зависимости от пути.

Желаемое поведение:

public_ip/app1 -> pod1_ip:container1_port/
public_ip/app2 -> pod2_ip:container2_port/
public_ip/app3 -> pod3_ip:container3_port/

Фактическое поведение:

public_ip/app1 -> pod1_ip:container1_port/app1
public_ip/app2 -> pod2_ip:container2_port/app2
public_ip/app3 -> pod3_ip:container3_port/app3

Итак, мы получаем 404 на app1, app2, app3.

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: some_name
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    acme.cert-manager.io/http01-edit-in-place: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  ingressClassName: "nginx"
  tls:
  - hosts:
    - some.host
    secretName: tls-cafe-ingress
  rules:
  - host: some.host
    http:
      paths:
      - path: /app1(/|$)(.*)
        backend:
          serviceName: app1
          servicePort: 1234
      - path: /app2(/|$)(.*)
        backend:
          serviceName: app2
          servicePort: 2345
      - path: /app3(/|$)(.*)
        backend:
          serviceName: app3
          servicePort: 3456

Проблема в том, что Ingress игнорирует спецификации пути, если в нем есть регулярные выражения. Это можно увидеть, проверив логи Ingress:

k logs -n nginx-ingress ingress-pod-name

Здесь мы видим, что nginx имеет запросы к /appX в журнале и пытается обслуживать их из локальной папки html, другими словами, путь, указанный в yaml, игнорируется.

Если регулярные выражения удалены из пути, он работает, но затем путь отправляется вниз по течению к целевому модулю, который ломает приложение.

Можете ли вы подробнее рассказать о «нарушении приложения», я думаю, у вас есть живые зонды, нетронутые в вашем приложении, чтобы позаботиться о работоспособности приложения

Tushar Mahajan 11.12.2020 08:52

Не могли бы вы предоставить более подробную информацию: ваша версия k8s, тип и версия входа? Есть ли какая-то конкретная конфигурация, которую мне нужно знать, прежде чем воспроизводить это? Можете ли вы также удалить аннотацию '..use-regex: "true"' и проверить, работает ли она?

acid_fuji 11.12.2020 13:49

Удаление «..use-regex: «true»» ничего не меняет. Kube — v1.18.12+IKS (работает на уровне IBM Kubernetes Free Tier. Nginx — 1.19.3, взято с helm.nginx.com/stable — у нас есть предположение: возможно, нам нужно взять Ingress с github .com/kubernetes/ingress-nginx так как только «официальный» поддерживает эти аннотации... не уверен, но мы попробуем...

Romeo Kienzler 13.12.2020 10:27

Я протестировал ваш входной манифест, и у меня он отлично работает (я использую входной контроллер сообщества nginx). Что происходит с вами, так это то, что вы используете nginxinc и пытаетесь использовать аннотацию для сообщества nginx, что не сработает. Что вы можете сделать, так это переключиться на nginx сообщества или изменить способ перезаписи аннотаций (см. здесь).

acid_fuji 14.12.2020 11:54

Большое спасибо. Теперь это работает. Пожалуйста, не стесняйтесь добавить ответ, чтобы я мог принять и проголосовать

Romeo Kienzler 15.12.2020 18:22

@RomeoKienzler извиняюсь за поздний ответ. Я разместил ответ.

acid_fuji 21.12.2020 11:08

@thomas также извиняюсь за поздний ответ, теперь он принят, еще раз большое спасибо

Romeo Kienzler 06.01.2021 12:14
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
1
7
448
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть два популярных контроллера K8s Ingress, которые используют Nginx:

  • Один поддерживается сообществом открытого исходного кода (kubernetes/ingress-nginx) и мы привыкли называть это community ingress controller
  • Второй поддерживается NGINX и называется nginxinc/kubernetes-вход

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

nginx.ingress.kubernetes.io/<annotation_type>

И для nginxinc использует:

nginx.org/<annoation_type> 

Чтобы узнать больше о различиях, посетите этот документ.

Другие вопросы по теме