Ограничение скорости запросов#

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

Предварительные действия#

  1. Установите ANIC.

  2. Сохраните публичный IP-адрес ANIC в переменной оболочки:

    $ IC_IP=XXX.YYY.ZZZ.III
    
  3. Сохраните HTTP-порт ANIC в переменной оболочки:

    $ IC_HTTP_PORT=<номер порта>
    

Развертывание веб-приложения#

  1. Создайте Deployment и Service для приложения:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: webapp
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: webapp
      template:
        metadata:
          labels:
            app: webapp
        spec:
          containers:
          - name: webapp
            image: angiesoftware/angie-hello:plain-text
            ports:
            - containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: webapp-svc
    spec:
      ports:
      - port: 80
        targetPort: 8080
        protocol: TCP
        name: http
      selector:
        app: webapp
    

    Примените настройки:

    $ kubectl apply -f webapp.yaml
    
  2. Создайте политику с именем rate-limit-policy, которая разрешает только один запрос в секунду с одного IP-адреса.

    apiVersion: k8s.angie.software/v1
    kind: Policy
    metadata:
      name: rate-limit-policy
    spec:
      rateLimit:
        rate: 1r/s
        key: ${binary_remote_addr}
        zoneSize: 10M
    

    Примените настройки:

    $ kubectl apply -f rate-limit.yaml
    
  3. Создайте ресурс VirtualServer для веб-приложения:

    apiVersion: k8s.angie.software/v1
    kind: VirtualServer
    metadata:
      name: webapp
    spec:
      host: webapp.example.com
      policies:
      - name: rate-limit-policy
      upstreams:
      - name: webapp
        service: webapp-svc
        port: 80
      routes:
      - path: /
        action:
          pass: webapp
    

    Примените настройки:

    $ kubectl apply -f virtual-server.yaml
    

    VirtualServer ссылается на политику rate-limit-policy, созданную выше.

  4. Протестируйте конфигурацию.

    Если вы будете запрашивать приложение с частотой выше одного запроса в секунду, ANIC начнет отклонять ваши запросы:

    $ curl --resolve webapp.example.com:$IC_HTTP_PORT:$IC_IP http://webapp.example.com:$IC_HTTP_PORT/
    Server address: 10.8.1.19:8080
    Server name: webapp-dc88fc766-zr7f8
    ...
    
    $ curl --resolve webapp.example.com:$IC_HTTP_PORT:$IC_IP http://webapp.example.com:$IC_HTTP_PORT/
    <html>
    <head><title>503 Service Temporarily Unavailable</title></head>
    <body>
    <center><h1>503 Service Temporarily Unavailable</h1></center>
    <hr><center>Angie/1.8.1</center>
    </body>
    </html>
    

    Примечание

    Вывод команды сокращен для наглядности примера.