k8s iptables-nft vs iptables-legacy
kube-proxy 不是直接“调用内核模块”,而是一个 Go 进程,把 Service 和 EndpointSlice 转成内核转发/NAT 规则。不同模式调用的用户态工具不同:
| kube-proxy 模式 | 它实际怎么下发规则 | 内核最终执行 |
|---|---|---|
iptables |
执行容器内的 iptables-restore / ip6tables-restore 批量写规则 |
xtables/netfilter;若该命令是 iptables-nft,规则会被转换进 nftables |
nftables |
执行容器内的 nft,将一批 nft 规则/集合提交为事务 |
nftables 内核框架 |
ipvs |
用 IPVS 的 netlink 接口创建 Virtual Server / Real Server,同时仍会使用少量 iptables 规则 | IPVS 内核模块 + netfilter |
所以你看到“物理机没有 iptables 客户端、但有内核模块”完全正常:执行 iptables-restore 或 nft 的是 kube-proxy 容器,不是宿主机 shell。
关键区别是:
iptables 模式
kube-proxy → iptables-restore → iptables 内核接口
└─ 若二进制为 iptables-nft → nftables 内核规则
nftables 模式
kube-proxy → nft → nftables 内核接口
因此,iptables-nft 不等于 kube-proxy 的 nftables 模式。
-
前者:kube-proxy 仍是 iptables Proxier,只是 iptables 命令的兼容后端为 nft。
-
后者:kube-proxy 是 nftables Proxier,直接生成并执行
nft规则事务。
在 kube-proxy 容器内可验证它究竟调用哪套工具:
# iptables 模式会需要/调用它
iptables-restore --version
# nftables 模式会需要/调用它
nft --version
但两套工具都在镜像中也不代表当前使用哪套;当前模式仍由 kube-proxy 的 mode 选择。官方实现上,nftables 后端当前确实是通过执行 nft CLI 下发规则,不是直接操纵 nf_tables 内核模块。 Kubernetes 相关实现说明
对。你的表描述的是 iptables 命令默认后端,不是 kube-proxy 的 proxy-mode。
kube-proxy 在 mode: iptables 时不会特意执行:
/usr/sbin/iptables-legacy
/usr/sbin/iptables-nft
它调用的是通用命令:
iptables
iptables-restore
ip6tables
ip6tables-restore
实际落到 legacy 还是 nft,取决于 kube-proxy 进程所在文件系统内 的命令链接:
iptables-restore
→ /etc/alternatives/iptables-restore
→ /usr/sbin/iptables-nft-restore # iptables-nft 后端
# 或
→ /usr/sbin/iptables-legacy-restore # legacy 后端
所以应检查的是 kube-proxy 容器内:
iptables --version
iptables-restore --version
readlink -f "$(command -v iptables)"
readlink -f "$(command -v iptables-restore)"
输出含义:
iptables v1.8.x (nf_tables)
即 kube-proxy 的 iptables 模式通过 iptables-nft 兼容层写 nftables 规则。
iptables v1.8.x (legacy)
即 kube-proxy 的 iptables 模式写 legacy xtables 规则。
而:
mode: nftables
是另一套 kube-proxy 实现;它直接调用 nft,不走 iptables / iptables-restore,也不受上述 alternatives 链接影响。
一句话:
kube-proxy mode=iptables + iptables-restore → iptables-nft
≠
kube-proxy mode=nftables + nft
浙公网安备 33010602011771号