proxy mode解析
官方解释
--proxy-mode ProxyMode |
| 使用哪种代理模式:'userspace'(较旧)或 'iptables'(较快)或 'ipvs'(实验)。如果为空,使用最佳可用代理(当前为 iptables)。如果选择了 iptables 代理,无论如何,但系统的内核或 iptables 版本较低,这总是会回退到用户空间代理。 |
不同mode架构
userspace
kube-proxy进程在用户空间监听一个本地端口,iptables规则将流量转发到这个本地端口,然后kube-proxy在其内部应用层建立到具体后端的连接,即在其内部进行转发,这是在用户空间的转发,虽然比较稳定,但效率不高
iptables
kube-proxy监控Kubernetes对Service、Endpoint对象的增删改操作。监控到Service对象的增删改,将配置iptables规则,截获到Service的ClusterIp和端口的流量并将其重定向到服务的某个后端;监控到Endpoint对象的增删改,将更新具体到某个后端的iptables规则。iptables模式基于netfilter,但因为流量的转发都是在Kernel Space,所以性能更高且更加可靠。 这种模式的缺点是,对于超大规模集群,当集群中服务数量达到一定量级时,iptables规则的添加将会出现很大延迟,因为规则的更新出现kernel local,所以此时将会出现性能问题分钟
ipvs
检查proxy mode
k -n kube-system logs kube-proxy-dlxwh |grep -i proxier | grep -i using
Using iptables Proxier.
更换为ipvs
a. 查看是否开启ipvs
b. 安装ipvs(keepvalied)、ipvsadm
c. 更新 kube-system中cm kube-porxy
kubectl -n kube-system edit cm kube-proxy # mode: "ipvs" |
重启kube-system中的pod kube-proxy-xxxxx
有如下日志
➜ kubectl -n kube-system logs kube-proxy-f7hln I1122 03:14:06.198892 1 node.go:136] Successfully retrieved node IP: 10.12.1.1 I1122 03:14:06.199021 1 server_others.go:111] kube-proxy node IP is an IPv4 address (10.122.94.40), assume IPv4 operation I1122 03:14:06.368549 1 server_others.go:259] Using ipvs Proxier. W1122 03:14:06.368584 1 server_others.go:456] detect-local-mode set to ClusterCIDR, but no cluster CIDR defined I1122 03:14:06.368594 1 server_others.go:467] detect-local-mode: ClusterCIDR , defaulting to no-op detect-local W1122 03:14:06.379595 1 proxier.go:434] IPVS scheduler not specified, use rr by default I1122 03:14:06.379945 1 server.go:650] Version: v1.19.2 I1122 03:14:06.380631 1 conntrack.go:52] Setting nf_conntrack_max to 1310720 I1122 03:14:06.381209 1 config.go:224] Starting endpoint slice config controller I1122 03:14:06.381241 1 shared_informer.go:240] Waiting for caches to sync for endpoint slice config I1122 03:14:06.381344 1 config.go:315] Starting service config controller I1122 03:14:06.381372 1 shared_informer.go:240] Waiting for caches to sync for service config I1122 03:14:06.481519 1 shared_informer.go:247] Caches are synced for endpoint slice config I1122 03:14:06.481568 1 shared_informer.go:247] Caches are synced for service config |
深入研究:
a. kube-proxy ipvs scheduler
- rr: round-robin(默认)
- lc: least connection (smallest number of open connections)
- dh: destination hashing
- sh: source hashing
- sed: shortest expected delay
- nq: never queue
b. calico & kube-proxy对比
可以简单地认为 calico/flannel 是用于分配和管理 pod ip 的,kube-proxy 是用于分配和管理 cluster ip 的