Балансировка TCP\UDP трафика ingress-контроллером
У Ingress-контроллера nginx существует функция опубликования не только HTTP портов, но любых других TCP\UDP портов: https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/
Настройка данного функционала требует изменения нескольких компонентов кластера, которые будут рассмотрены далее.
1. Тестовая задача
Допустим, у нас есть Deployment, поды которого слушают TCP порты 1540 и 1541. У нас в кластере уже созданы сервисы для каждого пода и теперь нам нужно опубликовать данные порты наружу с помощью ingress-контроллера.
2. Реализация
Для выполнения данной задачи нам потребуется внести изменения в 2 объекта:
-
ConfigMap -
nova-ingress-public-tcp-services-config -
Service -
nova-ingress-public-controller
Так как service nova-ingress-public-controller управляется с помощью FluxCD, изменения будут вноситься не напрямую в объект Service, а через объект Kustomization nova-release-ingress-public-main
-
Откройте в браузере веб-интерфейс Nova Console и перейдите в раздел Workloads → ConfigMaps. Переключите фильтр Namespace на
nova-ingress-publicи из списка ConfigMaps выберитеnova-ingress-public-tcp-services-config
-
На открывшейся странице перейдите на вкладку YAML и вставьте следующие строки в редактор:
data: 1540: "1c-test/1c-1540:1540" 1541: "1c-test/1c-1541:1541"В данном примере строка имеет следующий формат:
<порт_который_слушает_nginx>: "<namespace>/<service>:<порт_который_слушает_service>"После внесения изменений нажмите "Cохранить":
-
Перейдите в раздел Networking → Services, переключите фильтр Namespace на
nova-ingress-publicи из списка выберитеnova-ingress-public-controller
-
На открывшейся странице перейдите на вкладку YAML. Так как у данного объекта присутствуют следующие лейблы, это означает что service
nova-ingress-public-controllerуправляется с помощью FluxCD, изменения будут вноситься не напрямую в объект Service, а через объект Kustomizationnova-release-ingress-public-main:app.kubernetes.io/managed-by: Nova kustomize.toolkit.fluxcd.io/name: nova-release-ingress-public-main kustomize.toolkit.fluxcd.io/namespace: nova-gitops
-
Откройте еще одну вкладку браузера с веб-интерфейсом Nova Console и перейдите в раздел Administration → ClusterSettings
-
На открывшейся странице перейдите на вкладку "Конфигурация компонентов" и выберите из списка "Cluster Kustomizations"
-
На открывшейся странице найдите имя объекта Kustomization из п.4 (nova-release-ingress-public-main)
-
На открывшейся странице перейдите на вкладку YAML. Здесь нам нужно применить патч для изменения объекта
Service\nova-ingress-public-controller. Существует несколько способов применения патчей к объектам Kustomization, которые подробно описаны в документации FluxCD https://fluxcd.io/flux/components/kustomize/kustomizations/#patches
В данном примере мы будем использовать формат патча JSON6902. Для этого нам нужно добавить к текущему манифесту раздел patches, в котором мы опишем наш patch.
Наш патч имеет следующий вид:patches: - patch: | - op: add (1) path: /spec/ports/0 (2) value: { "name": "1c-1540", "port": 1540, "targetPort": 1540, "protocol": "TCP"} (3) - op: add (1) path: /spec/ports/1 (2) value: { "name": "1c-1541", "port": 1541, "targetPort": 1541, "protocol": "TCP"} (3) target: (4) kind: Service name: nova-ingress-public-controller namespace: nova-ingress-public1 Параметр opописывает действиеadd(добавить).2 Параметр pathописывает место в манифесте, куда стоит внести изменения. В данном случае указывается список портов, поэтому можно добавить новые порты в уже существующий список указывая номер списка. Данные которые уже присутствуют в списке не удаляются, а сдвигаются дальше по списку.3 Параметр valueописывает значение, которое нужно добавить в данное место.4 Параметр targetописывает к какому объекту будет применен патч, в нем мы указываем тип объекта, имя и namespace.Вставьте данный патч в редактор в секцию spec и нажмите "Сохранить"
-
Вернитесь на вкладку с объектом
service/nova-ingress-public-controllerиз п.4 и убедитесь, что в YAML манифесте объекта появилось описание новых портов (возможно понадобится нажать кнопку "Обновить"):
Теперь ingress-контроллер слушает указанные порты на worker-узлах (или выделенных ingress-узлах) и перенаправляет запросы в соответствии с конфигурацией.