无法连接到在 k3s 中运行并通过 nodePort 公开的 UDP 服务

无法连接到在 k3s 中运行并通过 nodePort 公开的 UDP 服务

我正在尝试通过 k3s nodePort 公开 UDP 服务 (tftp),但似乎无法连接。TCP 服务工作正常,但 UDP 服务似乎没有公开。

部署列出了端口:

...
ports:
  - containerPort: 3000
  - containerPort: 69
    protocol: UDP

服务定义如下:

apiVersion: v1
kind: Service
metadata:
  name: netboot-nodeports
spec:
  selector:
    app: netboot
  type: NodePort
  ports:
    - name: tftp
      port: 69
      targetPort: 69
      nodePort: 32069
      protocol: UDP
    - name: webui
      port: 3000
      targetPort: 3000
      nodePort: 32070

从节点或网络上的另一台机器(即 )连接到 TCP 端口的curl http://192.168.1.154:32070工作方式与预期一致。我可以从容器内部(即kubectl exec -it netboot-64565b9c69-bmvs4n -- tftp localhost 69)连接到 tftp UDP 服务,但从节点或网络上的另一台机器(即tftp 192.168.1.154 32069)连接失败并出现超时错误。

所有这些都在单个节点上的 nixOS 上的 k3s 中运行。没有运行防火墙(configuration.nix: networking.firewall.enable = false;)。我在 k3s 日志中没有看到任何相关错误。nix k3s 配置非常简单:

services.k3s.enable = true;
services.k3s.role = "server";
services.k3s.extraFlags = toString [];

答案1

你的 k3s nodePort 中未暴露 UDP 的原因可能有以下几种:

  1. 可能是 flannel 配置在使用覆盖网络的默认 CNI 中。如果 flannel 配置错误,则可能会影响 UDP 路由覆盖。为了进行故障排除,您可以检查 Flannel pod 日志以查找与 UDP 流量路由相关的任何错误。

  2. 可能是 k3s 服务使用了该ClusterIP类型,使得它们仅在集群内部可见。您可以尝试将服务定义设置为type: NodePort.

相关内容