Настройка службы Kubernetes в качестве устройства UPnP
проблема
Я настроил двухузловой кластер из чистого металла с настройками weavenet и metallb. Я хотел бы, чтобы службы, размещенные в этом кластере, обнаруживали и взаимодействовали с устройствами UPnP в моей домашней сети. Я считаю, что для того, чтобы это работало, пакеты обнаружения UPnP должны быть настроены для повторной многоадресной передачи в мою домашнюю сеть. Как правильно настроить переадресацию между виртуальной сетью weavenet и локальной сетью?
Моя сеть
- Моя домашняя сеть включена
192.168.1.0/24
, как с главным, так и с подчиненным узлами. - Kubernetes развертывает модули, используя настройку weavenet по умолчанию, которая размещает все узлы где-то в
10.32.0.1/12
оверлейная сеть. - У меня есть возможность развертывать сервисы с помощью METALB LoadBalancer, который будет предоставлять IP-адрес LoadBalancer где-то в пределах
192.168.2.192/26
,
Что я пробовал
Я могу выполнить тестовый сценарий обнаружения, который обнаруживает мои устройства UPnP с помощью многоадресной рассылки (239.255.255.250:1900
) с любого компьютера в моей домашней сети. После развертывания в кластере ( как это) устройства UPnP больше не обнаруживаются. Я вижу пакеты UPnP из других модулей в кластере, но не с компьютеров, напрямую подключенных к моей домашней сети.
Я полагаю, что решение этой проблемы будет включать повторную передачу пакетов UPnP из weavenet в мою домашнюю сеть и обратное проксирование ответов... но я не знаю, как сделать что-то подобное с weave net. Как я могу настроить любой вид службы / развертывания / модуля / сети, который будет взаимодействовать с моими устройствами UPnP так, как это делает мой тестовый скрипт при использовании сети хоста?
1 ответ
Проблема: UDP-широковещательная рассылка uPnP поступает с внутреннего адреса модуля и отбрасывается узлом до его выхода в домашнюю сеть.
т.е. пакет будет выглядетьIP 10.32.0.x.45196 > 239.255.255.250.1900: UDP, length 215
Согласно документам на https://kubernetes.io/docs/tutorials/services/source-ip/
Тип: LoadBalancer - автоматически отправит NAT на IP-адрес узла.
type: NodePort - автоматически отправит NAT на IP-адрес узла узла.
ИспользованиеNodePort с hostNetwork свяжет NodePort модуля с IP-адресом узла, поэтому широковещательная UDP-рассылка будет поступать с юридического адреса.
Ограничения этой настройки:
- Одновременно может быть запущен только один экземпляр вашего модуля uPnP. Предполагая, что домашней сети этого будет достаточно. Это связано с прямым отображением в сети хоста.
- NodePorts может предоставлять только непривилегированные порты в диапазоне от 30000 до 32767.
Решение:
См. Terrarium-service-udp.yaml для распределения NodePort.
См. Terrarium-deploy.yaml для объявления hostNetwork.
Террариум-сервис-udp.yaml:
kind: Service
metadata:
annotations:
metallb.universe.tf/allow-shared-ip: terrarium
creationTimestamp: null
labels:
io.kompose.service: terrarium
name: terrarium-udp
spec:
ports:
- name: '32767'
port: 32767
protocol: UDP
targetPort: 54321
- name: '31900'
port: 31900
protocol: UDP
targetPort: 1900
selector:
io.kompose.service: terrarium
type: NodePort
Террариум-deployment.yaml:
kind: Deployment
metadata:
annotations:
creationTimestamp: null
labels:
io.kompose.service: terrarium
name: terrarium
spec:
replicas: 1
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
io.kompose.service: terrarium
spec:
hostNetwork: true
containers:
- image: docker.lan/terrarium
name: terrarium
ports:
- containerPort: 80
- containerPort: 32767
protocol: UDP
- containerPort: 1900
protocol: UDP
resources: {}
restartPolicy: Always
У меня есть рабочая конфигурация для минидлна. Если вам это нужно для сравнения, дайте мне знать, и я буду загружать на GitHub.