<a id="traffic-splitting"></a>

# Распределение трафика

Ниже приведен пример использования ресурса `VirtualServer` для настройки распределения трафика в приложении `Cafe`.

Относительно базовой конфигурации были внесены следующие изменения:

- Вместо одной версии сервиса `coffee` теперь есть две: `coffee-v1-svc` и `coffee-v2-svc`.
- 90% трафика направляется на `coffee-v1-svc`, а оставшиеся 10% — на `coffee-v2-svc`.
- Для упрощения примера убраны TLS-терминация и сервис `tea`.

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

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

## Настройка распределения трафика

1. Создайте Deployment и Service для `coffee`:
   ```yaml
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: coffee-v1
   spec:
     replicas: 2
     selector:
       matchLabels:
         app: coffee-v1
     template:
       metadata:
         labels:
           app: coffee-v1
       spec:
         containers:
         - name: coffee-v1
           image: angiesoftware/angie-hello:plain-text
           ports:
           - containerPort: 8080
   ---
   apiVersion: v1
   kind: Service
   metadata:
     name: coffee-v1-svc
   spec:
     ports:
     - port: 80
       targetPort: 8080
       protocol: TCP
       name: http
     selector:
       app: coffee-v1
   ---
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: coffee-v2
   spec:
     replicas: 2
     selector:
       matchLabels:
         app: coffee-v2
     template:
       metadata:
         labels:
           app: coffee-v2
       spec:
         containers:
         - name: coffee-v2
           image: angiesoftware/angie-hello:plain-text
           ports:
           - containerPort: 8080
   ---
   apiVersion: v1
   kind: Service
   metadata:
     name: coffee-v2-svc
   spec:
     ports:
     - port: 80
       targetPort: 8080
       protocol: TCP
       name: http
     selector:
       app: coffee-v2
   ```

   Примените настройки:
   ```console
   $ kubectl create -f cafe.yaml
   ```
2. Настройте балансировку нагрузки.

   Создайте ресурс `VirtualServer`:
   ```yaml
   apiVersion: k8s.angie.software/v1
   kind: VirtualServer
   metadata:
     name: cafe
   spec:
     host: cafe.example.com
     upstreams:
     - name: coffee-v1
       service: coffee-v1-svc
       port: 80
     - name: coffee-v2
       service: coffee-v2-svc
       port: 80
     routes:
     - path: /coffee
       splits:
       - weight: 90
         action:
           pass: coffee-v1
       - weight: 10
         action:
           pass: coffee-v2
   ```

   Примените настройки:
   ```console
   $ kubectl create -f cafe-virtual-server.yaml
   ```
3. Проверьте, что конфигурация успешно применена, просмотрев события `VirtualServer`:
   ```console
   $ kubectl describe virtualserver cafe
   ```

   Пример вывода:
   ```console
   Events:
     Type    Reason          Age   From                      Message
     ----    ------          ----  ----                      -------
     Normal  AddedOrUpdated  5s    anic                      Configuration for default/cafe was added or updated
   ```
4. Проверьте работу приложения с помощью `curl`.
   Используйте `--resolve`, чтобы указать IP-адрес и HTTP-порт ANIC для домена `cafe.example.com`.
   Выполните несколько запросов, чтобы убедиться, что ANIC направляет трафик на разные версии сервиса `coffee`:
   ```console
   $ curl --resolve cafe.example.com:$IC_HTTP_PORT:$IC_IP http://cafe.example.com:$IC_HTTP_PORT/coffee
   ```

   Результат:
   - 90% запросов будут направлены на `coffee-v1-svc`:
     ```console
     Server address: 10.16.0.151:80
     Server name: coffee-v1-78754bdcfb-7xp27
     ...
     ```
   - 10% запросов будут направлены на `coffee-v2-svc`:
     ```console
     Server address: 10.16.0.152:80
     Server name: coffee-v2-7fd446968b-lwhgcd
     ...
     ```
