将 Kubernetes 服务配置为 UPnP 设备

将 Kubernetes 服务配置为 UPnP 设备

问题

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

我的网络

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

我尝试过的方法

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

我相信解决这个问题的方法将涉及将 UPnP 数据包从 weavenet 重新广播到我的家庭网络并反向代理响应……但我不知道如何使用 weave net 做这样的事情。我如何配置任何类型的服务/部署/pod/网络,以便以这样的方式与我的 UPnP 设备交互我的测试脚本使用主机网络时会怎样?

答案1

问题:来自 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 到节点知识产权。

类型:NodePort - 将自动将 NAT 源到节点知识产权。

用一个节点端口主机网络会将pod的NodePort绑定到Node IP,这样UDP广播就会来自合法的地址。

此设置的局限性:

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

解决方案

请参阅 terrarium-service-udp.yaml 了解 NodePort 分配。

请参阅 terrarium-deployment.yaml 以了解 hostNetwork 声明。

terrarium-服务-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。

相关内容