将 Kubernetes 服务配置为 UPnP 设备

ril*_*ell 5 upnp kubernetes weave

问题

我已经设置了一个配置有weavenetmetallb的两节点裸机 kubernetes集群。我希望此集群上托管的服务能够发现我的家庭网络上的 UPnP 设备并与之交互。我相信要实现此功能,需要将 UPnP 发现数据包配置为重新多播到我的家庭网络。在虚拟 weavenet 网络和本地网络之间配置重新多播的正确方法是什么?

我的网络

  1. 我的家庭网络已开启192.168.1.0/24,有主节点和从节点。
  2. Kubernetes 使用默认的 weavenet 设置来部署 Pod,该设置将所有节点放置在10.32.0.1/12覆盖网络中的某个位置。
  3. 我能够使用 Metallb LoadBalancer 部署服务,它将在192.168.2.192/26.

我尝试过的

我可以执行一个测试发现脚本,该脚本使用多播 ( ) 从我的家庭网络上的任何计算机发现我的 UPnP 设备239.255.255.250:1900。一旦我部署到集群(像这样),就不再检测到 UPnP 设备。我可以看到来自集群中其他 Pod 的 UPnP 数据包,但看不到来自直接连接到家庭网络的计算机的 UPnP 数据包。

我相信这个问题的解决方案将涉及将 UPnP 数据包从 weavenet 重新广播到我的家庭网络并反向代理响应......但我不知道如何使用 weave net 执行类似的操作。如何配置任何类型的服务/部署/pod/网络,以便与我的 UPnP 设备进行交互,就像我的测试脚本在使用主机网络时所做的那样?

小智 3

问题:来自 pod 内部地址的 uPnP UDP 广播在传出到您的家庭网络之前被节点丢弃。

即数据包看起来像 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 源到节点Pod IP。

使用带有hostNetwork的NodePort会将 pod 的 NodePort 绑定到节点 IP,因此 UDP 广播将来自合法地址。

此设置的限制:

  • 一次只能运行一个 uPnP pod 实例。假设有一个家庭网络,这就足够了。这是由于直接映射到主机网络。
  • NodePorts 只能公开 30000 - 32767 范围内的非特权端口。

解决方案

有关 NodePort 分配,请参阅 terrarium-service-udp.yaml。

有关 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我有一个 minidlna 的工作配置。如果您需要比较,请告诉我,我将上传到 GitHub。