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

проблема

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

Моя сеть

  1. Моя домашняя сеть включена 192.168.1.0/24, как с главным, так и с подчиненным узлами.
  2. Kubernetes развертывает модули, используя настройку weavenet по умолчанию, которая размещает все узлы где-то в 10.32.0.1/12 оверлейная сеть.
  3. У меня есть возможность развертывать сервисы с помощью 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.

Другие вопросы по тегам