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

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

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

  • Вместо одной версии сервиса coffee теперь есть две: coffee-v1-svc и coffee-v2-svc.

  • 90% трафика направляется на coffee-v1-svc, а оставшиеся 10% — на coffee-v2-svc.

  • Для упрощения примера убраны TLS-терминация и сервис tea.

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

  1. Установите ANIC с включенными пользовательскими ресурсами.

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

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

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

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

  1. Создайте Deployment и Service для coffee:

    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
    

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

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

    Создайте ресурс VirtualServer:

    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
    

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

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

    $ kubectl describe virtualserver cafe
    

    Пример вывода:

    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:

    $ curl --resolve cafe.example.com:$IC_HTTP_PORT:$IC_IP http://cafe.example.com:$IC_HTTP_PORT/coffee
    

    Результат:

    • 90% запросов будут направлены на coffee-v1-svc:

      Server address: 10.16.0.151:80
      Server name: coffee-v1-78754bdcfb-7xp27
      ...
      
    • 10% запросов будут направлены на coffee-v2-svc:

      Server address: 10.16.0.152:80
      Server name: coffee-v2-7fd446968b-lwhgcd
      ...