將 Kubernetes 服務配置為 UPnP 設備
問題
我已經建立了一個配置了weavenet和metallb的兩節點裸機 kubernetes集群。我希望託管在此集群上的服務能夠發現我的家庭網路上的 UPnP 設備並與之互動。我相信,要使其正常工作,需要將 UPnP 發現數據包配置為重新多播到我的家庭網路。在虛擬 weavenet 網路和本地網路之間配置重新多播的正確方法是什麼?
我的網路
- 我的家庭網路已開啟
192.168.1.0/24
,主節點和從節點都有。- Kubernetes 使用預設的 weavenet 設置部署 pod,該設置將所有節點放置在
10.32.0.1/12
覆蓋網路中的某個位置。- 我有能力使用 metallb LoadBalancer 部署服務,該服務將在
192.168.2.192/26
.我試過的
我可以執行一個測試發現腳本
239.255.255.250:1900
,該腳本使用多播 ( ) 從家庭網路上的任何電腦發現我的 UPnP 設備。一旦我部署到集群(像這樣),就不再檢測到 UPnP 設備。我可以看到來自集群中其他 pod 的 UPnP 數據包,但看不到來自直接連接到家庭網路的電腦的 UPnP 數據包。我相信這個問題的解決方案將涉及將 UPnP 數據包從 weavenet 重新廣播到我的家庭網路並反向代理響應……但我不知道如何用 weavenet 做類似的事情。我如何配置任何類型的服務/部署/pod/網路,這些服務/部署/pod/網路將與我的 UPnP 設備互動,就像我的測試腳本在使用主機網路時所做的那樣?
問題:來自 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 綁定到 Node 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
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。