问题
我已经设置了一个双节点裸机 Kubernetes集群配置有织网和金属。我希望托管在此集群上的服务能够发现并与我家庭网络上的 UPnP 设备交互。我认为要实现此功能,需要将 UPnP 发现数据包配置为重新多播到我的家庭网络。在虚拟 weavenet 网络和本地网络之间配置重新多播的正确方法是什么?
我的网络
- 我的家庭网络已开启
192.168.1.0/24
,有主节点和从节点。 - Kubernetes 使用默认的 weavenet 设置部署 pod,该设置将所有节点放置在
10.32.0.1/12
覆盖网络中的某个位置。 - 我有能力使用 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。