kube-proxy 切换为ipvs模式

前言

环境:centos7.9 k8s版本v1.22.12 kube-admin安装的k8s
我们知道kube-proxy有两种模式,iptables和ipvs两种模式,ipvs是性能最好的。

kube-proxy ipvs和iptables的异同

相同点:ipvs和iptables都是通过netfitle内核进行转发。
异同点:iptables只是为防火墙设计的,IPtable只是防火墙,而ipvs是专门用于高性能负载均衡的,并使用更高效的数据结构,如hash表并支持索引。
ipvs与iptables相比较,其优势为:
(1)ipvs为大型集群提供了更好的可扩展性和性能
(2)ipvs支持比iptables更复杂的负载均衡算法,如rr、wrr、lc、wlc
(3)ipvs支持服务健康检查和链接重试等功能
(4)ipvs可以动态修改ipset集合
目前大多数的k8s版本的kube-proxy都是默认使用iptables模式,为什么呢,因为无奈,因为主要是用户安装的Linux操作系统
和k8s集群,没有办法让用户安装ipvs,ipvs需要安装自己的模块。正是因为ipvs的高效性能,所以,将kube-proxy的模式切换为ipvs是很有必要的。

查看kube-proxy使用的模式

#先查看有几个kube-proxy
kubectl get pods -n kube-system -o wide| grep proxy
#查看现在的kube-proxy使用什么模式, 应该可以看到using iptables Proxier 这样的字眼就是iptables模式
kubectl logs kube-proxy-b5rt4 -n kube-system 
#这样也能查看现在的kube-proxy使用什么模式
kubectl exec -it kube-proxy-b5rt4 -n kube-system -- curl 127.0.0.1:10249/proxyMode

kube-proxy 切换为ipvs模式

#在所有master、node节点上执行下面的脚本启动ipvs模块
touch /etc/sysconfig/modules/ipvs.modules
cat <<EOF >/etc/sysconfig/modules/ipvs.modules
#!/bin/bash
ipvs_modules_dir="/usr/lib/modules/`uname -r`/kernel/net/netfilter/ipvs"
for i in \`ls \$ipvs_modules_dir | sed -r 's#(.*).ko.xz#\1#'\`; do
      /sbin/modinfo -F filename \$i &> /dev/null
      if [ \$? -eq 0 ]; then
          /sbin/modprobe \$i
       fi
done
EOF

#再次查看一下ipvs.modules文件,反引号的都替换了
[root@master ~]# cat /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
ipvs_modules_dir="/usr/lib/modules/3.10.0-1160.71.1.el7.x86_64/kernel/net/netfilter/ipvs"
for i in `ls $ipvs_modules_dir | sed -r 's#(.*).ko.xz#\1#'`; do
      /sbin/modinfo -F filename $i &> /dev/null
      if [ $? -eq 0 ]; then
          /sbin/modprobe $i
       fi
done
[root@master ~]#
#给脚本授权
chmod +x /etc/sysconfig/modules/ipvs.modules;
#开始执行脚本来载入ipvs的模块
bash /etc/sysconfig/modules/ipvs.modules;
#查看模块是否已经载入成功,发现已经载入ipvs模块,ipvs有很多算法
lsmod | grep ip_vs
[root@master ~]# lsmod | grep ip_vs
ip_vs_wlc              12519  0 
ip_vs_sed              12519  0 
ip_vs_pe_sip           12740  0 
nf_conntrack_sip       33780  1 ip_vs_pe_sip
ip_vs_nq               12516  0 
ip_vs_lc               12516  0 
ip_vs_lblcr            12922  0 
ip_vs_lblc             12819  0 
ip_vs_ftp              13079  0 
ip_vs_dh               12688  0 
ip_vs_sh               12688  0 
ip_vs_wrr              12697  0 
ip_vs_rr               12600  0 
ip_vs                 145458  26 ip_vs_dh,ip_vs_lc,ip_vs_nq,ip_vs_rr,ip_vs_sh,ip_vs_ftp,ip_vs_sed,ip_vs_wlc,ip_vs_wrr,ip_vs_pe_sip,ip_vs_lblcr,ip_vs_lblc
nf_nat                 26583  6 ip_vs_ftp,nf_nat_ipv4,nf_nat_ipv6,xt_nat,nf_nat_masquerade_ipv4,nf_nat_masquerade_ipv6
nf_conntrack          139264  11 ip_vs,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_nat_masquerade_ipv4,nf_nat_masquerade_ipv6,nf_conntrack_netlink,nf_conntrack_sip,nf_conntrack_ipv4,nf_conntrack_ipv6
libcrc32c              12644  4 xfs,ip_vs,nf_nat,nf_conntrack
[root@master ~]# 
#在master节点,修改编辑kube-proxy 这个configmap文件,修改模式为ipvs,如下面的图所示:
[root@master ~]# kubectl edit configmaps kube-proxy -n kube-system
configmap/kube-proxy edited
[root@master ~]# 

在这里插入图片描述

#我们发现修改kube-proxy 这个configmap文件后,查看pod的日志,发现ipvs模式并没有立即生效,所以我们需要删除kube-proxy的pod,这些pod是
# 由DaemonSet控制,删除之后DaemonSet会重新在每个节点创建的
[root@master ~]# kubectl  delete pods -n kube-system -l k8s-app=kube-proxy
pod "kube-proxy-4lrt4" deleted
pod "kube-proxy-dphbz" deleted
pod "kube-proxy-tmw67" deleted
[root@master ~]# kubectl  get pods -n kube-system -l k8s-app=kube-proxy
NAME               READY   STATUS    RESTARTS   AGE
kube-proxy-dsq5s   1/1     Running   0          4s
kube-proxy-fcbtg   1/1     Running   0          4s
kube-proxy-w7w6g   1/1     Running   0          4s
[root@master ~]# kubectl  logs kube-proxy-dsq5s -n kube-system
......
I0829 06:43:46.215231       1 server_others.go:274] Using ipvs Proxier.       #已经是ipvs模式了
I0829 06:43:46.215241       1 server_others.go:276] creating dualStackProxier for ipvs.
W0829 06:43:46.215371       1 server_others.go:495] detect-local-mode set to ClusterCIDR, but no IPv6 cluster CIDR defined, , defaulting to no-op detect-local for IPv6
E0829 06:43:46.217340       1 proxier.go:379] "can't set sysctl net/ipv4/vs/conn_reuse_mode, kernel version must be at least 4.1"
I0829 06:43:46.217498       1 proxier.go:438] "IPVS scheduler not specified, use rr by default"
E0829 06:43:46.217993       1 proxier.go:379] "can't set sysctl net/ipv4/vs/conn_reuse_mode, kernel version must be at least 4.1"
I0829 06:43:46.218068       1 proxier.go:438] "IPVS scheduler not specified, use rr by default"
W0829 06:43:46.218086       1 ipset.go:113] ipset name truncated; [KUBE-6-LOAD-BALANCER-SOURCE-CIDR] -> [KUBE-6-LOAD-BALANCER-SOURCE-CID]
W0829 06:43:46.218096       1 ipset.go:113] ipset name truncated; [KUBE-6-NODE-PORT-LOCAL-SCTP-HASH] -> [KUBE-6-NODE-PORT-LOCAL-SCTP-HAS]
.......
[root@master ~]# 

至此,kube-proxy的模式已经设置为ipvs模式了。

二进制部署的kube-proxy也是同样修改

也是一样添加模块,然后在kube-proxy的配置文件添加参数:

[root@node1 ~]# cat /opt/kubernetes/config/kube-proxy.conf 
KUBE_PROXY_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/opt/kubernetes/logs \
--hostname-override=node1 \
--proxy-mode=ipvs \					#添加这个参数
--config=/opt/kubernetes/config/kube-proxy-config.yml"
[root@node1 ~]# 
[root@node1 ~]# systemctl restart kube-proxy.service #重启

#查看现在的kube-proxy使用什么模式, 应该可以看到ipvs 这样的字眼就是ipvs模式
journalctl -u kube-proxy.service 
#这样也能查看现在的kube-proxy使用什么模式
curl 127.0.0.1:10249/proxyMode

附录-安装ipvs

#一下是kubesphere安装视频里面介绍的安装ipvs方法,再了解此种安装方法即可
cat >/etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
#授权并执行
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules
#查看是否已加载
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
#安装ipvsadm
yum install ipset ipvsadm -y
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值