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

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

Ingress-контроллер можно развернуть в связке с TCP-балансировщиком нагрузки платформы VK Cloud. Далее для примера будут созданы простые демо-приложения и ресурс Ingress для проверки работоспособности контроллера. Далее предполагается, что будет развернут NGINX Ingress Controller. Однако предложенные подходы можно адаптировать и под другие Ingress-контроллеры, например, Traefik.

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-контроллер

При установке выберите режим работы c использованием PROXY-протокола, так как это необходимо для полноценного взаимодействия с TCP-балансировщиком нагрузки. Если установить Ingress-контроллер без поддержки этого протокола, то контроллер не сможет обрабатывать заголовки, содержащие информацию о непосредственном источнике запросов.

Чтобы установить NGINX Ingress Controller с поддержкой PROXY-протокола:

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

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

    helm install nginx-ingress-tcp nginx-stable/nginx-ingress --set-string 'controller.config.entries.use-proxy-protocol=true' --create-namespace --namespace example-nginx-ingress-tcp
  3. Дождитесь завершения установки Ingress-контроллера и получения контроллером внешнего IP-адреса.

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

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

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

    NAME                            TYPE     CLUSTER-IP    EXTERNAL-IP                PORT(S) AGEnginx-ingress-tcp-nginx-ingress LoadBalancer ... <назначенный балансирощику IP-адрес> ... ...

Проверьте работоспособность Ingress-контроллера, перейдя в браузере по адресу http://<назначенный балансирощику IP-адрес>. Если контроллер настроен корректно, отобразится страница со статусом HTTP 404.

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

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

Далее будет продемонстрировано, как создать ресурс Ingress с терминированием SSL\TLS-сессий на Ingress-контроллере. Если вы планируете использовать HTTPS, терминирование сессий должно выполняться именно на контроллере, так как TCP-балансировщик нагрузки не имеет технической возможности терминировать SSL\TLS-сессии.

Чтобы создать ресурс Ingress:

  1. Создайте секрет Kubernetes, который будет содержать в себе данные о сертификате. Он будет использоваться Ingress-контроллером при работе с HTTPS-трафиком.

    В этом секрете содержатся публичная и приватная части самоподписанного сертификата NGINX, который используется для доступа к опубликованным приложениям на домене cafe.example.com.

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

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

    kubectl apply -f ./cafe-secret.yaml

    Будет создан секрет cafe-secret.

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

    kubectl describe secret cafe-secret

    Будет выведена основная информация о секрете.

  5. Создайте ресурс Ingress, который будет обрабатывать входящие запросы к хосту cafe.example.com:

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

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

      kubectl apply -f ./cafe-ingress.yaml

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

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

    kubectl describe ingress cafe-ingress

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

    Name:             cafe-ingressLabels:           <none>Namespace:        defaultAddress:          <назначенный балансирощику IP-адрес>Ingress Class:    nginxDefault backend:  <default>TLS:  cafe-secret terminates cafe.example.comRules:  Host              Path  Backends  ----              ----  --------  cafe.example.com                    /tea      tea-svc:80 (...)                    /coffee   coffee-svc:80 (...)

    Обратите внимание, что назначенный Ingress IP-адрес должен совпадать с IP-адресом, назначенном Ingress-контроллеру. Этот адрес принадлежит TCP-балансировщику платформы VK Cloud, который направляет входящий трафик в Ingress-контроллер.

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

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

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

    curl -k --resolve cafe.example.com:443:<IP-адрес Ingress> https://cafe.example.com/coffee

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

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

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

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

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

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

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