gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:36:13 27 4
gpt4 key购买 nike

我正在使用Rancher的nginx入口 Controller rancher/nginx-ingress-controller:0.21.0-rancher3,该 Controller 应基于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一样工作:
  • 客户端端口A =>服务器端口69(请求)
  • 服务器端口B =>客户端端口A(发送数据,请注意这是新的端口B)
  • 客户端端口A =>服务器端口B(确认)

  • 在tftp服务器上运行的 tcpdump显示通信类似于:
  • 主机端口A =>服务器端口69(请求文件)
  • 服务器端口B =>主机端口A(将数据发送回端口A)
  • Host =>服务器,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服务器本身不是问题的直接根源。问题是入口 Controller 如何处理请求。

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

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

    有没有人成功在Kubernetes集群中公开TFTP服务?

    最佳答案

    这不是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插件可能也有类似的解决方法

    关于kubernetes - 无法从Kubernetes集群中公开TFTP服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55569322/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com