问题说明
kube-proxy 在 iptables 模式下,如果 Pod 升级或异常重启后,选用的 iptables 命令后端实现可能发生切换。此情况下,若 Service 后端发生变更,可能会导致 Service 访问异常。
具体受影响的 Kubernetes 版本以及 kube-proxy 版本为:
集群版本 | kube-proxy 模式 | kube-proxy 版本 |
1.24 | iptables | v1.24.4-tke.4 及以下 |
1.22 | iptables | v1.22.5-tke.10 及以下 |
1.20 | iptables | v1.20.6-tke.30 及以下 |
1.18 | iptables | v1.18.4-tke.34 及以下 |
1.16 | iptables | v1.16.3-tke.33 及以下 |
1.14 | iptables | v1.14.3-tke.27 及以下 |
具体受影响的节点操作系统版本为:
实现 iptables 双后端版本 | 系统默认后端 |
TencentOS Server 3.1(TK4) | nft |
TencentOS Server 3.1(Final) | nft |
CentOS Linux 8 | nft |
修复方案
将 kube-proxy 升级到以下版本:
TKE 集群版本 | 修复策略 |
1.24.4 | v1.24.4-tke.24 及以上 |
1.22.5 | v1.22.5-tke.33 及以上 |
1.20.6 | v1.20.6-tke.52 及以上 |
1.18.4 | v1.18.4-tke.49-rc1 及以上 |
1.16.3 | v1.16.3-tke.42-rc2 及以上 |
1.14.3 | v1.14.3-tke.33-rc2 及以上 |
kube-proxy iptables 命令后端切换场景说明
说明:
1. 受影响的节点操作系统中 iptables 命令后端同时存在 legacy 和 nft 后端。
2. 受影响的 kube-proxy 版本,iptables 后端选择逻辑为:首先判断 legacy 后端下规则数是否大于等于 10 条,如果是则使用 legacy 后端,不是则判断 legacy 后端规则数是否大于等于 nft 后端条目数,是则使用 legacy,否则使用 nft。
3. 高版本 kube-proxy 会使用节点操作系统默认的 iptables 后端。
Pod 异常重启/主动重建场景
初始时使用 nft 后端,启动后其他组件在 legacy 后端增加了规则,导致 legacy 后端规则数大于等于 10。重启后导致后端切换到 legacy。
Pod 升级场景
升级前使用 legacy 后端,升级后到切换到节点默认后端 nft。