|
2 | 2 |
|
3 | 3 | 每台机器上都运行一个 kube-proxy 服务,它监听 API server 中 service 和 endpoint 的变化情况,并通过 iptables 等来为服务配置负载均衡(仅支持 TCP 和 UDP)。 |
4 | 4 |
|
| 5 | +> **注意**: 从 Kubernetes 1.33 开始,Endpoints API 已被弃用,kube-proxy 将逐步迁移到使用 EndpointSlices API 来获取更好的性能和功能支持。 |
| 6 | +
|
5 | 7 | kube-proxy 可以直接运行在物理机上,也可以以 static pod 或者 daemonset 的方式运行。 |
6 | 8 |
|
7 | 9 | kube-proxy 当前支持以下几种实现 |
8 | 10 |
|
9 | 11 | * userspace:最早的负载均衡方案,它在用户空间监听一个端口,所有服务通过 iptables 转发到这个端口,然后在其内部负载均衡到实际的 Pod。该方式最主要的问题是效率低,有明显的性能瓶颈。 |
10 | | -* iptables:目前推荐的方案,完全以 iptables 规则的方式来实现 service 负载均衡。该方式最主要的问题是在服务多的时候产生太多的 iptables 规则,非增量式更新会引入一定的时延,大规模情况下有明显的性能问题 |
| 12 | +* iptables:传统的负载均衡方案,完全以 iptables 规则的方式来实现 service 负载均衡。该方式最主要的问题是在服务多的时候产生太多的 iptables 规则,非增量式更新会引入一定的时延,大规模情况下有明显的性能问题 |
11 | 13 | * ipvs:为解决 iptables 模式的性能问题,v1.11 新增了 ipvs 模式(v1.8 开始支持测试版,并在 v1.11 GA),采用增量式更新,并可以保证 service 更新期间连接保持不断开 |
| 14 | +* nftables:新推出的高性能模式(v1.29 开始支持 alpha 版,目前处于 beta 状态,预计 v1.33 GA),通过使用 "verdict map" 实现更高效的数据包路由,将包处理延迟从 O(n) 降低到大致 O(1),显著减少了首包延迟,特别是在大规模集群中。需要 Linux 内核 5.13 或更新版本 |
12 | 15 | * winuserspace:同 userspace,但仅工作在 windows 节点上 |
13 | 16 |
|
14 | | -注意:使用 ipvs 模式时,需要预先在每台 Node 上加载内核模块 `nf_conntrack_ipv4`, `ip_vs`, `ip_vs_rr`, `ip_vs_wrr`, `ip_vs_sh` 等。 |
| 17 | +注意: |
| 18 | +- 使用 ipvs 模式时,需要预先在每台 Node 上加载内核模块 `nf_conntrack_ipv4`, `ip_vs`, `ip_vs_rr`, `ip_vs_wrr`, `ip_vs_sh` 等。 |
| 19 | +- 使用 nftables 模式时,需要 Linux 内核 5.13 或更新版本,可能与某些现有网络组件不完全兼容,目前还不是默认模式。 |
15 | 20 |
|
16 | 21 | ```bash |
17 | 22 | # load module <module_name> |
@@ -125,16 +130,61 @@ UDP 10.0.0.10:53 rr |
125 | 130 | ## 启动 kube-proxy 示例 |
126 | 131 |
|
127 | 132 | ```bash |
128 | | -kube-proxy --kubeconfig=/var/lib/kubelet/kubeconfig --cluster-cidr=10.240.0.0/12 --feature-gates=ExperimentalCriticalPodAnnotation=true --proxy-mode=iptables |
| 133 | +# iptables 模式(传统模式) |
| 134 | +kube-proxy --kubeconfig=/var/lib/kubelet/kubeconfig --cluster-cidr=10.240.0.0/12 --proxy-mode=iptables |
| 135 | + |
| 136 | +# ipvs 模式(高性能模式) |
| 137 | +kube-proxy --kubeconfig=/var/lib/kubelet/kubeconfig --cluster-cidr=10.240.0.0/12 --proxy-mode=ipvs |
| 138 | + |
| 139 | +# nftables 模式(最新高性能模式,需要内核 5.13+) |
| 140 | +kube-proxy --kubeconfig=/var/lib/kubelet/kubeconfig --cluster-cidr=10.240.0.0/12 --proxy-mode=nftables |
129 | 141 | ``` |
130 | 142 |
|
131 | 143 | ## kube-proxy 工作原理 |
132 | 144 |
|
133 | | -kube-proxy 监听 API server 中 service 和 endpoint 的变化情况,并通过 userspace、iptables、ipvs 或 winuserspace 等 proxier 来为服务配置负载均衡(仅支持 TCP 和 UDP)。 |
| 145 | +kube-proxy 监听 API server 中 service 和 endpoint(以及 EndpointSlices)的变化情况,并通过 userspace、iptables、ipvs、nftables 或 winuserspace 等 proxier 来为服务配置负载均衡(仅支持 TCP 和 UDP)。现代版本的 kube-proxy 优先使用 EndpointSlices API 而不是传统的 Endpoints API,以获得更好的性能和扩展性。 |
134 | 146 |
|
135 | 147 |  |
136 | 148 |
|
137 | 149 | ## kube-proxy 不足 |
138 | 150 |
|
139 | 151 | kube-proxy 目前仅支持 TCP 和 UDP,不支持 HTTP 路由,并且也没有健康检查机制。这些可以通过自定义 [Ingress Controller](../../extension/ingress/) 的方法来解决。 |
140 | 152 |
|
| 153 | +## nftables 模式详细说明 |
| 154 | + |
| 155 | +nftables 模式是 kube-proxy 的最新代理模式,旨在解决 iptables 模式在大规模集群中的性能问题: |
| 156 | + |
| 157 | +### 性能优势 |
| 158 | + |
| 159 | +1. **数据平面延迟优化**:使用 "verdict map" 进行更高效的数据包路由,将包处理时间从 O(n) 降低到大致 O(1) |
| 160 | +2. **控制平面延迟优化**:相比 iptables 模式提供更增量式的更新,更新大小仅与变更的 Services 和 endpoints 成比例 |
| 161 | +3. **显著减少首包延迟**:特别是在大规模集群中表现突出 |
| 162 | +4. **消除全局锁竞争问题**:避免了 iptables 模式的全局锁竞争 |
| 163 | + |
| 164 | +### 使用要求和限制 |
| 165 | + |
| 166 | +- 需要 Linux 内核 5.13 或更新版本 |
| 167 | +- 与 iptables 模式不是 100% 兼容 |
| 168 | +- 可能与某些现有网络组件不兼容 |
| 169 | +- 目前还不是默认模式 |
| 170 | + |
| 171 | +### 启用方法 |
| 172 | + |
| 173 | +可以通过以下方式启用 nftables 模式: |
| 174 | + |
| 175 | +```bash |
| 176 | +# 直接启动 kube-proxy |
| 177 | +kube-proxy --proxy-mode nftables |
| 178 | + |
| 179 | +# 使用 kubeadm 集群 |
| 180 | +kubeadm init --config kubeadm-config.yaml # 需要在配置中指定 proxy-mode |
| 181 | + |
| 182 | +# 将现有集群从 iptables/ipvs 模式转换为 nftables 模式 |
| 183 | +kubectl patch configmap kube-proxy -n kube-system --patch '{"data":{"config.conf":"mode: nftables"}}' |
| 184 | +``` |
| 185 | + |
| 186 | +### 发展前景 |
| 187 | + |
| 188 | +- 预计在 Kubernetes v1.33 版本中达到 GA 状态 |
| 189 | +- 未来可能最终替代 IPVS 模式 |
| 190 | +- iptables 模式将继续得到支持 |
0 commit comments