Назад | Перейти на главную страницу

Настройка службы Kubernetes как устройства UPnP

Проблема

Я установил двухузловой кубернетики без покрытия кластер настроен с Weavenet и Metallb. Я хочу, чтобы службы, размещенные в этом кластере, обнаруживали устройства UPnP в моей домашней сети и взаимодействовали с ними. Я считаю, что для этого необходимо настроить пакеты обнаружения UPnP для повторной многоадресной передачи в мою домашнюю сеть. Как правильно настроить повторную многоадресную передачу между виртуальной сетью Weavenet и локальной сетью?

Моя сеть

  1. Моя домашняя сеть включена 192.168.1.0/24, как с ведущим, так и с ведомым узлами.
  2. Kubernetes развертывает поды, используя настройку Weavenet по умолчанию, которая размещает все узлы где-то в 10.32.0.1/12 наложенная сеть.
  3. У меня есть возможность развертывать службы с помощью Metallb LoadBalancer, который предоставит IP-адрес LoadBalancer где-то в пределах 192.168.2.192/26.

Что я пробовал

Я могу выполнить сценарий обнаружения тестов который обнаруживает мои устройства UPnP с помощью многоадресной рассылки (239.255.255.250:1900) с любого компьютера в моей домашней сети. После развертывания в кластере (как это) устройства UPnP больше не обнаруживаются. Я могу видеть пакеты UPnP от других модулей в кластере, но не с моих компьютеров, напрямую подключенных к моей домашней сети.

Я считаю, что решение этой проблемы будет включать ретрансляцию пакетов UPnP из Weavenet в мою домашнюю сеть и обратное проксирование ответов ... но я не знаю, как сделать что-то подобное с Weave Net. Как я могу настроить любой вид службы / развертывания / модуля / сети, который будет взаимодействовать с моими устройствами UPnP таким образом мой тестовый сценарий делает при использовании сети хоста?

Проблема: 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.

тип: NodePort - автоматически отправит NAT на узел стручок IP.

Используя NodePort с участием hostNetwork свяжет NodePort модуля с IP-адресом узла, поэтому широковещательная передача UDP будет происходить с юридического адреса.

Ограничения этой настройки:

  • Одновременно может быть запущен только один экземпляр модуля uPnP. В случае домашней сети этого будет достаточно. Это связано с прямым отображением в хост-сеть.
  • NodePorts может открывать непривилегированные порты только в диапазоне 30000–32767.

Решение:

См. Terrarium-service-udp.yaml для распределения NodePort.

См. Объявление hostNetwork в terrarium-deployment.yaml.

террариум-сервис-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

terrarium-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

Имею рабочую конфигурацию для minidlna. Если он вам нужен для сравнения, дайте мне знать, и я загрузлю его на GitHub.