VK Cloud logo
Обновлена 15 апреля 2024 г. в 08:50

Развертывание Ingress-контроллера с HTTP-балансировщиком

Ingress-контроллер можно развернуть в связке с HTTP-балансировщиком нагрузки платформы VK Cloud. Далее для примера будут созданы простые демо-приложения и ресурс Ingress для проверки работоспособности контроллера.

Далее предполагается, что будет развернут NGINX Ingress Controller. Однако предложенные подходы можно адаптировать и под другие Ingress-контроллеры, например, Traefik. При таком развертывании Ingress нужно вручную добавлять worker-узлы в правила балансировщика нагрузки. Это верно как при ручном изменении размера worker-группы, так и при включении автомасштабирования.

1. Подготовительные шаги

  1. Создайте кластер Kubernetes самой актуальной версии.

    При создании кластера выберите опцию Назначить внешний IP.

    Прочие параметры кластера выберите на свое усмотрение.

  2. Убедитесь, что аддон NGINX Ingress (ingress-nginx) не установлен в кластере. В демонстрационных целях Ingress-контроллер будет установлен вручную.

  3. Убедитесь, что вы можете подключиться к кластеру с помощью kubectl.

  4. Установите Helm, если утилита еще не установлена.

  5. Установите curl, если утилита еще не установлена.

2. Разверните демо-приложения

К этим приложениям будет организован доступ через Ingress-контроллер с помощью ресурса Ingress.

Для демонстрации будут использованы приложения tea и coffee из примера Cafe от NGINX. Каждое приложение состоит из ReplicaSet, Deployment и Service, соотвествующего этому Deployment.

Чтобы развернуть демо-приложения:

  1. Загрузите манифест cafe.yaml.

  2. Примените этот манифест в кластере:

    kubectl apply -f ./cafe.yaml

Для проверки состояния компонентов приложений выполните команду:

kubectl get svc,rs,deployment -n default

Вывод команды должен быть похож на этот:

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGEservice/coffee-svc   ClusterIP   ...              <none>        80/TCP    ...service/tea-svc      ClusterIP   ...              <none>        80/TCP    ...NAME                                DESIRED   CURRENT   READY   AGEreplicaset.apps/coffee-7c86d7d67c   2         2         2       ...replicaset.apps/tea-5c457db9        3         3         3       ...NAME                     READY   UP-TO-DATE   AVAILABLE   AGEdeployment.apps/coffee   2/2     2            2           ...deployment.apps/tea      3/3     3            3           ...

3. Установите Ingress-контроллер

  1. Добавьте Helm-репозиторий NGINX:

    helm repo add nginx-stable https://helm.nginx.com/stablehelm repo update
  2. Установите Ingress-контроллер с сервисом NodePort, выполнив команду:

    helm install nginx-ingress-http nginx-stable/nginx-ingress \ --create-namespace --namespace example-nginx-ingress-http \ --set controller.service.type=NodePort \ --set controller.service.httpsPort.enable=false \ --set controller.service.externalTrafficPolicy=Local
  3. Дождитесь завершения установки Ingress-контроллера и назначения контроллеру порта.

    Для проверки состояния Ingress-контроллера выполните команду:

    kubectl get svc -n example-nginx-ingress-http

    Вывод команды должен быть похож на этот:

    NAME                               TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                     AGEnginx-ingress-http-nginx-ingress   NodePort   ...            <none>        80:<назначенный порт>/TCP   ...

4. Создайте HTTP-балансировщик нагрузки

HTTP-балансировщик нагрузки будет терминировать SSL/TLS-соединения и перенаправлять на Ingress-контроллер только HTTP-трафик.

Для настройки балансировщика:

  1. Соберите нужные данные:

    • Имена сети и подсети, в которой располагаются узлы кластера.
    • Имена инстансов сервиса Cloud Servers, которые соответствуют master-узлам и worker-узлам кластера.
    • Номер порта, который был назначен Ingress-контроллеру на предыдущем шаге.
  2. Создайте балансировщик:

    1. Перейдите в личный кабинет VK Cloud.
    2. Выберите проект, где находится нужный кластер.
    3. Перейдите в раздел Виртуальные сети → Балансировщики нагрузки.
    4. Нажмите кнопку Добавить.
    5. В появившемся окне:
      1. Задайте название балансировщика (любое).

      2. Выберите сеть и подсеть, которые совпадают с таковыми у кластера.

      3. Задайте DNS-имя (любое).

      4. Убедитесь, что опция Назначить внешний IP включена.

      5. Задайте параметры обработки для каждого типа трафика:

        1. В блоке Правила балансировки нажмите ссылку + Добавить правило.

        2. Выберите Протокол назначения HTTP, задайте для него порт, который был назначен Ingress-контроллеру.

        3. В блоке Разрешенные CIDR нажмите ссылку + Добавить адрес. Введите 0.0.0.0/0.

        4. Выберите опцию Отправлять заголовок X-Forwarded-For.

        5. В блоке Применить для следующих инстансов добавьте все инстансы сервиса Cloud Servers, которые соответствуют master-узлам и worker-узлам кластера.

          Выставьте одинаковые веса для всех инстансов, равные 1.

        6. Нажмите кнопку Следующий шаг.

        7. Нажмите кнопку Добавить.

    Начнется операция создания балансировщика, которая займет некоторое время.

  3. После создания балансировщика скопируйте его публичный IP-адрес, он понадобится для доступа к опубликованным через Ingress ресурсам.

5. Создайте ресурс Ingress

Ресурс Ingress опубликует сервисы coffee-svc и tea-svc на домене cafe.example.com через Ingress-контроллер, таким образом предоставив доступ к приложениям.

Далее будет продемонстрировано, как создать ресурс Ingress, который работает исключительно с HTTP-трафиком, который приходит от HTTP-балансировщика, настроенного ранее:

  1. Создайте файл манифеста cafe-ingress.yaml со следующим содержимым:

  2. Примените этот манифест в кластере:

    kubectl apply -f ./cafe-ingress.yaml

    Будет создан ресурс Ingress cafe-ingress.

  3. Проверьте, что ресурс успешно создался, выполнив команду:

    kubectl describe ingress cafe-ingress

    Вывод команды должен быть похож на этот:

    Name:             cafe-ingress-httpLabels:           <none>Namespace:        defaultAddress:Ingress Class:    nginxDefault backend:  <default>Rules:  Host              Path  Backends  ----              ----  --------  cafe.example.com                    /tea      tea-svc:80 (10.100.54.15:8080,10.100.54.16:8080,10.100.54.17:8080)                    /coffee   coffee-svc:80 (10.100.54.13:8080,10.100.54.14:8080)

6. Проверьте доступность приложений

  1. Проверьте, что поды с именами tea и coffee существуют, получив список всех подов в пространстве имен default:

    kubectl get pods
  2. Выполните команду:

    curl -k --resolve cafe.example.com:443:<публичный IP-адрес HTTP-балансировщика> https://cafe.example.com/coffee

    На запрос должен ответить один из двух подов coffee. В ответе будет содержаться имя пода, который ответил (Server name), например:

    Server address: ...:8080Server name: coffee-7c86d7d67c-zsmwzDate: ...URI: /coffeeRequest ID: ...

    Получение подобных ответов означает, что Ingress-контроллер корректно настроен:

    • взаимодействует с HTTP-балансировщиком нагрузки VK Cloud (который терминирует SSL\TLS-сессии);
    • обеспечивает доступ к сервисам, соответствующим развернутым приложениям.

Удалите неиспользуемые ресурсы

  1. Если созданные ресурсы Kubernetes вам больше не нужны, удалите их.

    kubectl delete -f ./cafe-ingress.yamlkubectl delete -f ./cafe.yamlhelm uninstall nginx-ingress-http -n example-nginx-ingress-httpkubectl delete namespace example-nginx-ingress-http
  2. Работающий кластер потребляет вычислительные ресурсы. Если он вам больше не нужен: