Как я могу перенаправить трафик на мою веб-службу через входящие аннотации?

Я развернул экземпляр Jenkins в Kubernetes, доступный на jenkins.company.com. Я хотел бы настроить второй маршрут jenkins.company.com/admin, который будет прикреплять заголовок, а затем перенаправлять запрос в ту же службу.

Моя проблема в том, что все последующие запросы, на которые опирается домашняя страница Jenkins, возвращают 404 HTTP-ответа.

Request URL: https://jenkins.company.com/admin
Request Method: GET Status Code: 200 
Request URL: https://jenkins.company.com/static/1d6021a8/css/layout-common.css
Method: GET Status Code: 404 
Request URL: https://jenkins.company.com/static/1d6021a8/css/style.cssRequest 
Method: GET Status Code: 404 
Request URL: https://jenkins.company.com/static/1d6021a8/scripts/prototype.js
Method: GET Status Code: 404 
...

Я безуспешно экспериментировал с различными входящими аннотациями.

nginx.ingress.kubernetes.io/use-regex: "правда"

с spec.rules.paths []. path с использованием регулярных выражений в попытке получить значение rewrite-target.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/auth-realm: Authentication Required - ok
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/configuration-snippet: |-
      proxy_set_header User $remote_user;
    nginx.ingress.kubernetes.io/rewrite-target: $1
  name: jenkins-master-ingress
  namespace: default
spec:
  rules:
  - host: jenkins.company.com
    http:
      paths:
      - backend:
          serviceName: my-jenkins
          servicePort: 8080
        path: /a
  tls:
  - secretName: my-secret
status:
  loadBalancer:
    ingress:
    - {}
~                  

Интересно, что я также обнаружил, что добавление другого пути все исправило, хотя я не могу объяснить, как это сделать. Добавление «stati» в качестве пути разблокирует его, но использование «static» или «static /(.+)» разбивает его обратно и возвращает 404-е.

spec:
  rules:
  - host: jenkins.company.com
    http:
      paths:
      - backend:
          serviceName: my-jenkins
          servicePort: 8080
        path: /a
      - backend:
          serviceName: my-jenkins
          servicePort: 8080
        path: /stati

Как я могу передать файлы / static? Что не хватает моему входу?


person James    schedule 15.08.2019    source источник
comment
Вы пробовали использовать этот nginx.ingress.kubernetes.io/rewrite-target: / annotations.?   -  person Subramanian Manickam    schedule 16.08.2019
comment
Да, эта аннотация присутствует в моем примере выше.   -  person James    schedule 16.08.2019


Ответы (1)


Учтите, что аннотации, касающиеся изменения заголовка, повлияют на все правила входа и что ваши правила входа разрешают входящие запросы только для /a, а не для /static. Следовательно, он никогда не будет подан.

Теперь директива rewrite-target будет преобразовать любой входящий URI для каждого пути (например: /a) перед отправкой в ​​указанный сервер. Для этого он использует захваченные группы.

Во втором случае с фрагментом захват static/(.+) оставляет $1 с тем, что идет после static/, и полностью удаляет его из исходного URI, чтобы отправить его на бэкэнд, что всегда приводит к 404, поскольку такие URI не существуют там.

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

person yyyyahir    schedule 21.08.2019