Настройте Kubernetes Traefik Ingress с различной перезаписью пути для каждой службы.

Я нахожусь в процессе миграции нашего приложения из конфигурации Docker-compose с одним экземпляром в Kubernetes. В настоящее время у меня есть следующий пример конфигурации NGINX, работающей как обратный прокси-сервер моего приложения:

server {
  server_name             example.com;
  ssl_certificate         /etc/nginx/certs/${CERT_NAME};
  ssl_certificate_key     /etc/nginx/certs/${KEY_NAME};

  listen                  443 ssl;
  keepalive_timeout       70;

  access_log              /var/log/nginx/access.log mtail;

  ssl_protocols           xxxxxx
  ssl_ciphers             xxxxxx
  ssl_session_cache       shared:SSL:10m;
  ssl_session_timeout     10m;

  rewrite_log             on;
  resolver                127.0.0.11 ipv6=off;

  location /push/ {
        auth_basic                    "Restricted";
        auth_basic_user_file          /etc/nginx/htpasswd;
        rewrite /push/(.*)        /index.php/$1 break;
        proxy_pass                    pushinterface:3080;
  }

  location /flights/ {
        rewrite /flights/(.*)         /$1 break;
        proxy_pass                    flightstats:3090;
  }

  location /api/ {
        proxy_pass                    $api;
  }

  location /grafana/ {
        access_log                    off;
        log_not_found                 off;
        proxy_pass                    http://grafana:3000;
        rewrite ^/grafana/(.*)        /$1 break;
  }

}

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

Я пробовал следующую конфигурацию Ingress, но похоже, что она не работает:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: example-traefik 
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.frontend.rule.type: ReplacePathRegex
spec:
  rules:
  - host: example.com
    http:
      paths:
      - backend:
          serviceName: pushinterface
          servicePort: 80
        path: /push/(.*) /index/$1
      - backend:
          serviceName: flights
          servicePort: 80
        path: /flights/(.*) /$1
       - backend:
          serviceName: api
          servicePort: 80
        path: /api
      - backend:
          serviceName: grafana
          servicePort: 80
        path: /grafana/(.*) /$1

Буду признателен за любую помощь в решении этой задачи


person Alessandro Kopeldaci    schedule 13.08.2018    source источник
comment
Вы пробуете это в облаке? В помещении? Когда вы запускаете kubectl get svc, вы видите все службы? пожалуйста, удалите хост в правилах и попробуйте еще раз. пожалуйста, поделитесь дополнительной информацией   -  person Oron Golan    schedule 13.08.2018
comment
Я настраиваю его локально. Все сервисы доступны с kubectl get svc. Интересно, что всегда первая служба в списке конфигурации маршрутизируется правильно, но для других, которые должны были переписать путь, я получаю 404. И когда я получаю доступ к example.com Я также получаю первую упомянутую услугу. Я пробовал также без хоста в правилах и результат тот же.   -  person Alessandro Kopeldaci    schedule 13.08.2018


Ответы (2)


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

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite /push/(.*) /index/$1 break;
      rewrite /flights/(.*) /$1 break;
      rewrite /grafana/(.*) /$1 break;

spec:
  rules:
  - host: example.com
    http:
      paths:
      - backend:
          serviceName: pushinterface
          servicePort: 80
        path: /push
      - backend:
          serviceName: flights
          servicePort: 80
        path: /flights
       - backend:
          serviceName: api
          servicePort: 80
        path: /api
      - backend:
          serviceName: grafana
          servicePort: 80
        path: /grafana

Всем спасибо за ответы! :)

person Alessandro Kopeldaci    schedule 27.08.2018

Использование типа правила ReplacePathRegex в вашем примере не гарантирует, что входящие запросы будут перенаправлены на целевые серверные ВМ, как указано в Traefik Документация.

Чтобы направлять запросы к конечным точкам, используйте Matcher вместо Modifiers правил, поскольку они предназначены для этой цели.

Найдите отдельное обсуждение аналогичной проблемы здесь.

person Nick_Kh    schedule 14.08.2018
comment
Большое тебе спасибо. Не могли бы вы привести пример кода для Ingress, потому что я не могу найти подходящий пример для использования Matcher в Ingress? - person Alessandro Kopeldaci; 14.08.2018
comment
Проверьте эту ссылку и обратитесь к примеру маршрутизации на основе пути. - person Nick_Kh; 16.08.2018
comment
Спасибо за ссылку, но этот пример очень простой и не охватывает мой вариант использования. Я имею ввиду не каждый путь сервисов во входящем должен быть изменен. Входящий трафик, который я предоставил, является всего лишь примером, и у меня есть другие услуги. Я могу легко изменить большинство их путей, чтобы удовлетворить базовую конфигурацию входящего трафика, но некоторые службы являются сторонними, и я не могу изменить их пути. Вот почему я искал более продвинутую конфигурацию Ingress. - person Alessandro Kopeldaci; 16.08.2018
comment
Ознакомьтесь с использованием правил сопоставления Рекомендации, чтобы найти лучшее решение, подходящее для ваших конкретных случаев. - person Nick_Kh; 17.08.2018