kube-proxy 切换 proxy mode

proxy mode解析

 官方解释

     --proxy-mode ProxyMode
使用哪种代理模式:'userspace'(较旧)或 'iptables'(较快)或 'ipvs'(实验)。如果为空,使用最佳可用代理(当前为 iptables)。如果选择了 iptables 代理,无论如何,但系统的内核或 iptables 版本较低,这总是会回退到用户空间代理。

不同mode架构

userspace

kube-proxy-userspace

kube-proxy进程在用户空间监听一个本地端口,iptables规则将流量转发到这个本地端口,然后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

kube-proxy-ipvs

检查proxy mode

k -n kube-system logs kube-proxy-dlxwh |grep -i proxier | grep -i using

     Using iptables Proxier.

更换为ipvs

a. 查看是否开启ipvs

lsmod |grep ip_vs

b. 安装ipvs(keepvalied)、ipvsadm

lsmod |grep ip_vs

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 的

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值