Настроить ограничение скорости Ingress-Nginx для определенного пути - PullRequest
1 голос
/ 26 мая 2019

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

Я знаю о

nginx.ingress.kubernetes.io/limit-rps 

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

/login

, я хочу установить предел rps равным 100 для пути / входа в систему

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

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

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

1 Ответ

1 голос
/ 27 мая 2019

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

Другие опции

Traefik имеет промежуточное программное обеспечение ограничения скорости , которое можно применять к маршрутов .

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

Nginx Ingress config

Здесь важно создать структуру для ваших соглашений об именах, чтобы вы знали, какой 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

Я не уверен, каким образом нужно управлять аннотациями на уровне хоста или сервера (например, nginx.ingress.kubernetes.io/ssl-ciphers). Если они все хорошо сливаются, то, возможно, создадим специальный Ingress просто для размещения их. Если нет, то вы можете в конечном итоге управлять настройками хоста во всех конфигурациях Ingress, что будет проблематично.

...