我目前正在使用 Kubernetes,特别是使用 Minikube 进行开发,我遇到了一个挑战,希望得到一些指导。我的目标是为单个端口设置端口转发,可以同时处理 TCP 和 UDP 协议。
挑战
从我最初的研究和尝试来看,Kubernetes 在同时转发多个协议(TCP 和 UDP)的端口时似乎有限制或特定要求。但是,我不确定这个限制是否是由于我目前的理解、Kubernetes 的固有功能或 Minikube 处理服务定义和端口转发的方式所致。
到目前为止我尝试过的事情
我已经查看了 Kubernetes 文档并搜索了可能指示如何配置服务或使用 Minikube 在同一端口上实现多协议端口转发的任何示例或指南,但没有取得明显的成功。 我已经尝试过使用服务和部署配置来为单个端口指定 TCP 和 UDP,但尚未设法使这两种协议同时工作。
我的问题是:
对此的任何帮助将不胜感激!
根据要求,这是我迄今为止尝试过的部署。
apiVersion: apps/v1
kind: Deployment
metadata:
name: netcat-deployment
spec:
replicas: 1
selector:
matchLabels:
app: netcat
template:
metadata:
labels:
app: netcat
spec:
containers:
- name: netcat
image: subfuzion/netcat
imagePullPolicy: Always
args:
- "-lk"
- "-u"
- "12345"
ports:
- containerPort: 12345
---
apiVersion: v1
kind: Service
metadata:
name: netcat-service
spec:
type: LoadBalancer
selector:
app: netcat
ports:
- name: tcp-port
protocol: TCP
port: 12345
targetPort: 12345
- name: udp-port
protocol: UDP
port: 12345
targetPort: 12345
在 Kubernetes 中,支持同时转发 TCP 和 UDP 协议的单个端口的能力,但需要在服务定义中进行特定配置。
[Client] <--- TCP/UDP ---> [Service: netcat-service] <--- TCP/UDP ---> [Pod: netcat-deployment]
确保您的 Minikube 环境已正确设置以向外部公开服务,尤其是在使用
LoadBalancer
服务类型时,在 Minikube 中通常需要隧道或特定驱动程序来公开服务:请参阅“UDP 套接字客户端无法与Minikube 上的 UDP 套接字服务器”和“Minikube / 使用 nginx 入口控制器配置 TCP 和 UDP 服务”
Kubernetes 会单独处理 TCP 和 UDP 端口,即使它们位于相同的端口号上。这意味着您的服务定义在语法上是正确的,并且 Kubernetes 允许您为服务中的同一端口定义 TCP 和 UDP 协议。重要的部分是确保容器内的应用程序可以处理同一端口上的两种协议。
因此请仔细检查容器应用程序(在本例中为
subfuzion/netcat
)是否正确处理同一端口上的 TCP 和 UDP 流量。这更多的是关于应用程序的能力,而不是 Kubernetes。
并考虑其 Dockerfile...
FROM alpine:edge as BUILD
RUN apk add --no-cache netcat-openbsd
ENTRYPOINT [ "nc" ]
镜像本身不具备同时处理同一端口上的 TCP 和 UDP 流量的能力。该功能取决于您如何调用
nc
(Netcat)。
Netcat (
nc
) 可以在 TCP 或 UDP 模式下运行,但传统上,它不支持通过单次调用同时侦听同一端口上的 TCP 和 UDP 流量。 -u
标志用于指定 Netcat 应使用 UDP 而不是默认的 TCP。
您在 Kubernetes 部署清单中提供的参数 (
-lk -u 12345
) 表明您打算让 Netcat 使用 UDP () 在端口 12345 上以连续或“保持活动”模式 (
-l
) 监听 (
-k
) -u
)。该设置本身并不支持处理同一端口上的 TCP 流量。
该解决方案(基于
nc
)单独不支持同一端口上的双协议(TCP 和 UDP)。
您需要使用单独的端口,或者开发一个能够处理同一端口上的 TCP 和 UDP 流量的自定义应用程序。
您还可以考虑使用能够将同一端口上的 TCP 和 UDP 流量复用到不同后端进程或服务的高级网络工具或代理。可以为此类场景配置HAProxy或Envoy等工具,但需要更复杂的设置。