<a id="rate-limit"></a>

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

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

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

1. Установите ANIC.
2. Сохраните публичный IP-адрес ANIC в переменной оболочки:
   ```console
   $ IC_IP=<ваш_IP-адрес>
   ```
3. Сохраните HTTP-порт ANIC в переменной оболочки:
   ```console
   $ IC_HTTP_PORT=<номер порта>
   ```

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

1. Создайте Deployment и Service для приложения:
   ```yaml
   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
   ```

   Примените настройки:
   ```console
   $ kubectl apply -f webapp.yaml
   ```
2. Создайте политику с именем `rate-limit-policy`, которая разрешает только один запрос в секунду с одного IP-адреса.
   ```yaml
   apiVersion: k8s.angie.software/v1
   kind: Policy
   metadata:
     name: rate-limit-policy
   spec:
     rateLimit:
       rate: 1r/s
       key: ${binary_remote_addr}
       zoneSize: 10M
   ```

   Примените настройки:
   ```console
   $ kubectl apply -f rate-limit.yaml
   ```
3. Создайте ресурс VirtualServer для веб-приложения:
   ```yaml
   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
   ```

   Примените настройки:
   ```console
   $ kubectl apply -f virtual-server.yaml
   ```

   VirtualServer ссылается на политику `rate-limit-policy`, созданную выше.
4. Протестируйте конфигурацию.

   Если вы будете запрашивать приложение с частотой выше одного запроса в секунду, ANIC начнет отклонять ваши запросы:
   ```console
   $ 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
   ...
   ```

   ```console
   $ 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>
   ```

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