概述
目录
- 前言
- kube-proxy ipvs和iptables的异同
- 查看kube-proxy使用的模式
- kube-proxy 切换为ipvs模式
- 二进制部署的kube-proxy也是同样修改
前言
环境: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
最后
以上就是知性纸飞机为你收集整理的kube-proxy 切换为ipvs模式的全部内容,希望文章能够帮你解决kube-proxy 切换为ipvs模式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复