我正在使用Rancher的nginx入口控制器rancher/nginx-ingress-controller:0.21.0-rancher3
,该控制器应基于https://github.com/kubernetes/ingress-nginx AFAIK。
我的udp服务配置为:
apiVersion: v1
kind: ConfigMap
metadata:
name: udp-services
namespace: ingress-nginx
data:
69: "default/tftp:69"
8881: "default/test:8881"
在nc -l -u -p 8881
上运行default/test
可以与集群外客户端通信。至少在某些情况下,这意味着udp代理有效。但是,tftp始终要求default/tftp
超时。
大致上,TFTP读取应以below的形式工作:
tcpdump
显示通信如下:
与此同时,入口记录如下内容:
TIMESTAMP [error] ... upstream timed out (110: Connection timed out) while proxying connection, udp client: ::1, server: [::]:69, upstream: "...:69", bytes from/to client:..., bytes from/to upstream:...
来自另一个集群内容器的TFTP请求工作正常。这应该意味着TFTP服务器本身不是问题的直接根源。问题是入口控制器如何处理请求。
我发现tftpd有一个--port-range
参数可以固定tftpd可以用来响应哪些端口。我试图将其固定到端口8881(--port-range 8881:8881
),但请求仍被丢弃。
我的猜测是,入口不会将数据包重定向回客户端,因为答复不是来自端口69,而是来自端口B。
有人成功在Kubernetes集群中公开了TFTP服务吗?
答案 0 :(得分:0)
这不是100%的解决方案,但我发现了完全相同的解决方法。问题在于,tftp创建了主机状态表中未知的新出站UDP连接。因此,它将其视为外发请求而不是答复。我还将注意到,TFTP客户端应用程序可以很好地解决此问题,但是PXE驱动程序(至少是英特尔驱动程序)不能解决问题。
如果将Calico用作CNI,则可以在IPPool上禁用“ natOutgoing”。如果需要NAT,则可以创建另一个不带NAT的IPPool。
https://docs.projectcalico.org/networking/assign-ip-addresses-topology#features
我通过calicoctl get ippool -oyaml | sed 's/natOutgoing: true/natOutgoing: false/g' | calicoctl apply -f -
我确定其他CNI插件可能也有类似的解决方法