无法从Kubernetes群集中公开TFTP服务

无法从Kubernetes群集中公开TFTP服务,kubernetes,kubernetes-ingress,Kubernetes,Kubernetes Ingress,我正在使用Rancher的nginx ingress控制器,Rancher/nginx ingress控制器:0.21.0-rancher3,它应该基于AFAIK 我的udp服务配置为: apiVersion: v1 kind: ConfigMap metadata: name: udp-services namespace: ingress-nginx data: 69: "default/tftp:69" 8881: "default/test:8881" 在default

我正在使用Rancher的nginx ingress控制器,
Rancher/nginx ingress控制器:0.21.0-rancher3
,它应该基于AFAIK

我的udp服务配置为:

apiVersion: v1
kind: ConfigMap
metadata:
  name: udp-services
  namespace: ingress-nginx
data:
  69: "default/tftp:69"
  8881: "default/test:8881"
default/test
上运行
nc-l-u-p8881
可以很好地与集群外客户端通信。这意味着udp代理可以工作,至少在某些情况下是这样。但是,tftp始终请求
default/tftp
超时

大致而言,TFTP读取应按以下方式工作:

  • 客户端端口A=>服务器端口69(请求)
  • 服务器端口B=>客户端端口A(发送数据,注意这是一个新端口B)
  • 客户端端口A=>服务器端口B(确认)
  • tcpdump
    在tftp服务器上运行表明通信如下:

  • 主机端口A=>服务器端口69(请求文件)
  • 服务器端口B=>主机端口A(将数据发送回端口A)
  • 主机=>服务器,无法访问ICMP端口(但无法访问端口A)
  • 同时,入口记录如下内容:

    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服务器本身不是问题的直接来源。问题是入口控制器如何处理请求

    我发现有一个
    --port range
    参数,可以确定tftpd可以使用哪个端口响应。我试图将其固定到端口8881(
    ——端口范围8881:8881
    ),但请求仍被丢弃

    我猜入口不会将数据包重定向回客户端,因为应答不是来自端口69,而是来自端口B


    有人成功地在Kubernetes集群中公开了TFTP服务吗?

    这不是100%的解决方案,但我找到了完全相同的解决方法。问题是tftp创建了主机状态表中未知的新出站UDP连接。因此,它将其视为发出的请求,而不是回复。我还将注意到,TFTP客户端应用程序可以很好地处理这个问题,但PXE驱动程序(至少是intel驱动程序)不能

    如果您使用印花布作为CNI,则可以在IPPool上禁用“NATEOUTING”。如果需要NAT,可以创建第二个不带NAT的IPPool

    我通过
    calicotl get ippool-oyaml | sed's/natouting:true/natouting:false/g'| calicotl apply-f-


    我相信其他CNI插件可能也有类似的解决方案,这不是100%的解决方案,但我找到了完全相同的解决方案。问题是tftp创建了主机状态表中未知的新出站UDP连接。因此,它将其视为发出的请求,而不是回复。我还将注意到,TFTP客户端应用程序可以很好地处理这个问题,但PXE驱动程序(至少是intel驱动程序)不能

    如果您使用印花布作为CNI,则可以在IPPool上禁用“NATEOUTING”。如果需要NAT,可以创建第二个不带NAT的IPPool

    我通过
    calicotl get ippool-oyaml | sed's/natouting:true/natouting:false/g'| calicotl apply-f-


    我相信其他CNI插件可能也有类似的解决方法

    您找到解决方案了吗?我需要同样的场景才能工作不。我在k8s集群外运行了一个直接为tftp服务的docker容器。有没有人在k8s内使用calico+metallb的tftp有什么运气?你找到解决方案了吗?我需要同样的场景才能工作不。我在k8s集群外运行一个直接为tftp提供服务的docker容器。有人在k8s内使用印花布+金属磅的tftp吗?感谢Roogles的领导!我的观点被限制在nginx。我暂时无法测试它。我将尝试并更新它,并尝试找出NATOUTION如何影响集群的其他部分。感谢Roogles的领导!我的观点被限制在nginx。我暂时无法测试它。我将尝试更新它,并尝试找出NATOUTION如何影响集群的其他部分。