我正在使用 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 请求始终超时。粗略地说,TFTP 读取的工作方式应如下:
default/tftp
主机端口A => 服务器端口69(请求文件)
tcpdump
来自另一个集群内容器的 TFTP 请求工作得很好。这应该意味着 TFTP 服务器本身并不是问题的直接根源。问题是入口控制器如何处理请求。
我发现
tftpd
有一个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:...
参数,可以固定 tftpd 可以使用哪些端口来响应。我尝试将其固定到端口 8881 (--port-range
),但请求仍然被丢弃。
我的猜测是入口不会将数据包重定向回客户端,因为回复不是来自端口 69,而是来自端口 B。有人成功在 Kubernetes 集群中公开 TFTP 服务吗?
这不是 100% 的解决方案,但我找到了完全相同的解决方法。问题在于 tftp 创建了主机状态表中未知的新出站 UDP 连接。因此,它将其视为传出请求而不是回复。我还要指出,TFTP 客户端应用程序可以很好地处理此问题,但 PXE 驱动程序(至少是英特尔驱动程序)则不能。
https://docs.projectcalico.org/networking/assign-ip-addresses-topology#features
我默认禁用它 --port-range 8881:8881
我确信其他 CNI 插件可能有类似的解决方法
您需要在 k8s 节点上的传入流量上设置 tftp 帮助程序
calicoctl get ippool -oyaml | sed 's/natOutgoing: true/natOutgoing: false/g' | calicoctl apply -f -