Настройка ограничения скорости Ingress-Nginx rps для определенного пути

Я использую Kubernetes Kops. Я хочу установить ограничение скорости на уровне Ingress-Nginx только для определенного пути.

Я знаю о

nginx.ingress.kubernetes.io/limit-rps 

Если я установлю это в правилах Ingress, то это будет применимо для всех маршрутов. Но я хочу применить его для определенного маршрута. Скажем, когда я пытаюсь получить доступ

/login

Я хочу установить ограничение числа оборотов в секунду до 100 для пути / входа в систему

nginx.ingress.kubernetes.io/limit-rps: 100

Это моя конфигурация правил Ingress,

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: staging-ingress-rules
  namespace: staging
  annotations:
    kubernetes.io/ingress.class: 'nginx'
    nginx.ingress.kubernetes.io/proxy-body-size: '0'
spec:
  rules:
  - host: staging.mysite.com
    http:
      paths:
      - path: /login
        backend:
          serviceName: login_site
          servicePort: 80
      - path: /registration
        backend:
          serviceName: registration_site
          servicePort: 80

person cyberoy    schedule 26.05.2019    source источник


Ответы (1)


Можно немного злоупотребить конфигурацией для ingress-nginx, добавив несколько определений Ingress для одного и того же имени хоста. ingress-nginx объединит правила / маршруты вместе. Однако конфигурацией станет труднее управлять, и вы приближаетесь к пределам возможностей прокси-сервера nginx.

Другие варианты

В Traefik есть промежуточное ПО для ограничения скорости, которое можно применить к маршруты.

Также посмотрите что-нибудь вроде kong или istio, если вы хотите начать более детальное управление отдельными службами.

Конфигурация Nginx Ingress

Здесь будет важно создать структуру для ваших соглашений об именах, чтобы вы знали, в каком Ingress находится какой маршрут. Я бы начал использовать путь маршрута в Ingress name, но ваш вариант использования может отличаться:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: staging-ingress-rules-registration
  annotations:
    kubernetes.io/ingress.class: 'nginx'
    nginx.ingress.kubernetes.io/proxy-body-size: '0'
    nginx.ingress.kubernetes.io/limit-rps: '10'
spec:
  rules:
  - host: staging.mysite.com
    http:
      paths:
      - path: /registration
        backend:
          serviceName: registration-site
          servicePort: 80
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: staging-ingress-rules-login
  annotations:
    kubernetes.io/ingress.class: 'nginx'
    nginx.ingress.kubernetes.io/proxy-body-size: '0'
    nginx.ingress.kubernetes.io/limit-rps: '100'
spec:
  rules:
  - host: staging.mysite.com
    http:
      paths:
      - path: /login
        backend:
          serviceName: login-site
          servicePort: 80

Я не уверен, как аннотации на уровне хоста или сервера (например, _ 4_) необходимо будет управлять. Если все они хорошо сливаются, возможно, создадут особый Ingress только для них. В противном случае вы можете в конечном итоге управлять настройками хоста во всех конфигурациях Ingress, что будет проблемой.

person Matt    schedule 27.05.2019