• 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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 ~]#
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    #给脚本授权
    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 ~]# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    #在master节点,修改编辑kube-proxy 这个configmap文件,修改模式为ipvs,如下面的图所示:
    [root@master ~]# kubectl edit configmaps kube-proxy -n kube-system
    configmap/kube-proxy edited
    [root@master ~]# 
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    #我们发现修改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 ~]# 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    至此,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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    附录-安装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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    关于轨迹跟踪以及保持路径总时间的讨论结果
    SCHNOKA施努卡:视觉检测缺陷系统 机器视觉表面缺陷检测系统
    css溢出属性
    jsp内的${}循环一次及循环几次相加出总和
    Mybatis中的#{}和${}的区别
    网络安全设备之防火墙技术详解
    汽车自动驾驶是人工智能吗,自动驾驶是人工智能
    如何获取淘宝店铺详情数据接口
    NSSCTF第13页(1)
    【ML】基于机器学习的心脏病预测研究(附代码和数据集,逻辑回归模型)
  • 原文地址:https://blog.csdn.net/MssGuo/article/details/126663453