Kubernetes

將 Kubernetes 服務配置為 UPnP 設備

  • April 21, 2020

問題

我已經建立了一個配置了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.

我試過的

我可以執行一個測試發現腳本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。

使用帶有hostNetworkNodePort會將 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。

引用自:https://serverfault.com/questions/934581