前言
环境: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 切换为ipvs模式
#先查看有几个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
#在所有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模式了。
评论区