繁体   English   中英

无法在 kubernetes [MiniKube] 中将 UDP 数据包发送到我的容器

[英]Can't get UDP packets to my container in kubernetes [MiniKube]

我是 Kubernetes 的新手,但我设法为自己构建了一个直接在 Docker 下完美运行的容器,并且似乎在 k8s 部署中运行良好。

该容器是安装在 Ubuntu 上的 github 的几个 UDP 数据包复制器的实现。

当它直接在我的机器上的 Docker 下运行时,我可以将 UDP 数据包发送到容器并将它们复制回我机器上的不同端口,以证明复制有效。 (使用netcat发送和接收数据包)。

但是,我认为我在 k8s 网络方面遗漏了一些东西。

我在我的机器上使用 MiniKube,并且我使用以下 k8s 清单来创建仅包含一个容器的部署。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: samplicator-deployment
  labels:
    app: samplicator
spec:
  replicas: 1
  selector:
    matchLabels:
      app: samplicator
  template:
    metadata:
      labels:
        app: samplicator
    spec:
      containers:
      - name: samplicator-container-01
        image: dgbes/udp-fan-out-tools:latest
        command: ["samplicate"]
        args: ["-p3160","192.168.1.159/3161","192.168.1.159/3162"]
        ports:
        - name: receiver
          protocol: UDP
          containerPort: 3160

然后我使用以下命令创建部署: kubectl apply -f create-samplicator-deployment.yaml

然后,我使用nc -ulk -p 3161nc -ulk -p 3162在我的主机上使用netcat设置了几个 UDP 侦听器。

如果然后我使用kubectl exec --stdin --tty samplicator-deployment-{randomPodName} -- /bin/bash连接到正在运行的容器并手动使用netcat将数据包发送到我的主机,我可以看到那些到达没有问题。

我使用kubectl get pod -o wide找到容器/pod IP 地址。

但是,当我尝试将数据包发送到 pod 中的采样器进程时,我没有看到任何内容返回到我的主机。

因此,我随后在容器/pod 中生成了一个 shell,检查了采样器进程是否正常运行(确实如此),并在容器实例中安装了netcat

使用netcat -u {my host machine IP} 3161我可以将数据包从容器发送到我的主机 machien 并且它们被接收没有问题。

因此,似乎问题在于将数据包发送到容器。

我通过在容器 shell 中运行nc -ulk -p 3600并将数据包从我的主机发送到容器中的该端口来确认这一点 - 容器中没有收到任何内容。

我知道端口需要在容器上公开,并且为此使用了“服务”,但我认为这就是部署模板规范中的ports:部分正在做的事情。

这并没有创建服务来公开端口,因此我在部署清单 YAML 的末尾添加了一个服务定义,如下所示:

---
apiVersion: v1       
kind: Service
metadata:
  name: samplicator-service
spec:
  selector:
    app: samplicator
  type: LoadBalancer
  ports:
  - name: receiver-service
    protocol: UDP
    port: 3160
    targetPort: 3160

我显然在这里遗漏了一些东西,如果我的 k8s 术语有点混乱,我深表歉意 - 正如我所说我对 k8s 完全陌生。

有关如何正确使 UDP 端口可访问的任何指针?

我想到了...

Service type=LoadBalancer不适用于 MiniKube,因为它显然依赖于外部云服务。

我注意到我的服务位于未分配的pending中,而ExternalIP从未被分配,这使我得到了这个答案

神奇的是在单独的终端 window 中简单地运行以下命令,然后允许将外部 IP 分配给服务。

minkube tunnel

一旦运行并分配了ExternalIP ,向该 ExternalIP 发送数据包就可以完美运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM