У меня есть программа, которую я пытаюсь запустить в кластере Kubernetes.
Программа представляет собой сервер, который говорит по нестандартному протоколу на основе UDP.
Протокол в основном состоит из коротких пар «запрос / ответ», аналогично DNS.
Одним из основных отличий от DNS является то, что и «сервер», и «клиенты» могут отправлять запросы, т.е. сообщение может быть инициировано любой из сторон.
Клиентами являются встроенные устройства, настроенные с IP-адресом сервера.
Клиенты отправляют свои запросы на этот IP.
Они также проверяют, что входящие сообщения исходят с этого IP, отбрасывая сообщения с других IP.
У меня вопрос, как я могу использовать Kubernetes для настройки сервера таким образом, чтобы
- Сервер принимает входящие UDP-сообщения на определенный IP-адрес.
- Реальные исходные IP-адреса клиента видны серверу.
- Любые ответы (или другие сообщения), отправляемые серверами, имеют тот же IP-адрес, что и их источник (чтобы клиенты их принимали).
Одна вещь, которую я попробовал, но она не работает, это настроить Service
с type: LoadBalancer
и externalTrafficPolicy: Local
(последняя для сохранения исходных IP-адресов для требования 2).
Эта настройка удовлетворяет требованиям 1 и 2 выше, но поскольку исходящие сообщения не проходят через балансировщик нагрузки, их исходный IP-адрес является адресом любого узла, на котором запущен модуль, содержащий сервер.
Я использую Kubernetes на облачной платформе Google (GKE).