You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Kubernetes集群内TCP通信需开放UDP端口?(Microk8s+Calico环境)

问题解答

这种情况完全正常,你的Calico集群应该启用了VXLAN隧道模式,跨节点Pod间的TCP流量会被封装在UDP数据包中传输,所以必须同时开放TCP和UDP的必要端口才能保证所有通信场景正常。

原因分析

  1. VXLAN封装机制
    Calico在Microk8s环境中默认常采用VXLAN作为overlay网络方案。VXLAN的核心逻辑是把Pod的三层IP数据包封装在UDP数据包里,通过主机间的UDP端口(默认是4789)进行跨节点传输。这就导致:即使Pod之间走的是TCP协议,底层实际传输的是UDP封装包——防火墙只允许TCP时,这些UDP封装包会被拦截,直接导致跨节点Pod的TCP通信超时失败。

  2. 不同场景的通信差异

  • 仅允许TCP时:主机直接通信(Host -> Host)、主机访问NodePort服务(Host -> Kubernetes)都是走主机网络的原生TCP流量,所以能正常通信;但跨节点Pod的TCP流量被封装成UDP,被防火墙阻断,因此失败。
  • 仅允许UDP时:跨节点Pod的VXLAN封装UDP包能正常通过,所以Pod间通信正常;但主机直接通信(如SSH这类TCP服务)、主机访问NodePort的TCP流量被防火墙拦截,因此失败。

解决方案:必须同时开放TCP和UDP端口

要覆盖所有通信场景,需要在节点防火墙开放以下端口:

  • UDP 4789:Calico VXLAN隧道的封装端口,保证跨节点Pod通信
  • TCP 6443:Kubernetes API Server端口,主机与K8s集群控制平面通信需要
  • TCP 30000-32767:Kubernetes NodePort服务的默认端口范围,主机访问NodePort服务需要
  • 额外根据需求开放主机间的TCP通信端口(如TCP 22用于SSH、TCP 2379-2380用于etcd通信等)

可选优化:切换到BGP模式

如果你的网络环境支持(主机间L3可达、网络设备允许BGP路由),可以将Calico切换为BGP模式,此时跨节点Pod通信无需UDP封装,直接通过原生IP路由转发。但BGP模式对网络基础设施要求更高,VXLAN模式仍是自托管Microk8s集群更通用的选择。

内容的提问来源于stack exchange,提问作者Martin Melka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 18:50:01