web-dev-qa-db-ja.com

KubernetesサービスをUPnPデバイスとして構成する

問題

weavenetmetallb で構成された2ノード bare-metal kubernetes クラスターをセットアップしました。このクラスターでホストされているサービスで、ホームネットワーク上のUPnPデバイスを検出して操作できるようにしたいと思います。これが機能するためには、UPnP検出パケットをホームネットワークに再マルチキャストするように構成する必要があると思います。仮想ウィーブネットネットワークとローカルネットワーク間の再マルチキャストを構成する正しい方法は何ですか?

私のネットワーク

  1. 私のホームネットワークは192.168.1.0/24にあり、マスターノードとスレーブノードの両方があります。
  2. Kubernetesは、すべてのノードを10.32.0.1/12オーバーレイネットワークのどこかに配置するデフォルトのweavenetセットアップを使用してポッドをデプロイします。
  3. 192.168.2.192/26内のどこかにLoadBalancerIPを提供するmetallbLoadBalancerを使用してサービスをデプロイすることができます。

私が試したこと

ホームネットワーク上の任意のコンピューターからマルチキャスト(239.255.255.250:1900)を使用してUPnPデバイスを検出する テスト検出スクリプト を実行できます。クラスターに展開すると( このように )、UPnPデバイスは検出されなくなります。クラスター内の他のポッドからのUPnPパケットは表示されますが、ホームネットワークに直接接続されているコンピューターからは表示されません。

この問題の解決策には、UPnPパケットをweavenetからホームネットワークに再ブロードキャストし、応答をリバースプロキシすることが含まれると思います...しかし、weavenetでそのようなことを行う方法がわかりません。ホストのネットワークを使用するときに、UPnPデバイスと相互作用するあらゆる種類のサービス/展開/ポッド/ネットワークを構成するにはどうすればよいですか? テストスクリプト

3
rileymcdowell

問題:ポッドの内部アドレスから送信されている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をnodeIPに自動的に供給します。

タイプ:NodePort-NATをノードpodIPに自動的に供給します。

NodePorthostNetworkを使用すると、ポッドのNodePortがNode IP、したがってUDPブロードキャストは正当なアドレスから送信されます。

この設定の制限:

  • 一度に実行できるuPnPポッドのインスタンスは1つだけです。ホームネットワークを想定すると、これで十分です。これは、ホストネットワークへの直接マッピングによるものです。
  • NodePortsは、30000〜32767の範囲の非特権ポートのみを公開できます。

ソリューション

NodePortの割り当てについては、terrarium-service-udp.yamlを参照してください。

HostNetwork宣言については、terrarium-deployment.yamlを参照してください。

terrarium-service-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にアップロードします。

1
GlorifiedTypist