Это может выглядеть как дубликат, но это не так, поскольку решение в связанной теме не работает для меня.
Я настроил 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, игнорируется.
Если регулярные выражения удалены из пути, он работает, но затем путь отправляется вниз по течению к целевому модулю, который ломает приложение.
Не могли бы вы предоставить более подробную информацию: ваша версия k8s, тип и версия входа? Есть ли какая-то конкретная конфигурация, которую мне нужно знать, прежде чем воспроизводить это? Можете ли вы также удалить аннотацию '..use-regex: "true"'
и проверить, работает ли она?
Удаление «..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 так как только «официальный» поддерживает эти аннотации... не уверен, но мы попробуем...
Я протестировал ваш входной манифест, и у меня он отлично работает (я использую входной контроллер сообщества nginx). Что происходит с вами, так это то, что вы используете nginxinc и пытаетесь использовать аннотацию для сообщества nginx, что не сработает. Что вы можете сделать, так это переключиться на nginx сообщества или изменить способ перезаписи аннотаций (см. здесь).
Большое спасибо. Теперь это работает. Пожалуйста, не стесняйтесь добавить ответ, чтобы я мог принять и проголосовать
@RomeoKienzler извиняюсь за поздний ответ. Я разместил ответ.
@thomas также извиняюсь за поздний ответ, теперь он принят, еще раз большое спасибо
Есть два популярных контроллера K8s Ingress, которые используют Nginx:
community ingress controller
Ключевое отличие, которое применяется в этом случае, заключается в использовании аннотации. Для контроллера входа сообщества вы используете:
nginx.ingress.kubernetes.io/<annotation_type>
И для nginxinc использует:
nginx.org/<annoation_type>
Чтобы узнать больше о различиях, посетите этот документ.
Можете ли вы подробнее рассказать о «нарушении приложения», я думаю, у вас есть живые зонды, нетронутые в вашем приложении, чтобы позаботиться о работоспособности приложения