美文网首页
kubernetes开启ipvs 模式

kubernetes开启ipvs 模式

作者: 酒馆_1916 | 来源:发表于2019-06-22 19:44 被阅读0次

    kubernetes开启ipvs 模式,主要修改kube-proxy 配置。

    前提条件:

    确保IPVS需要内核模块

    ip_vs

    ip_vs_rr

    ip_vs_wrr

    ip_vs_sh

    nf_conntrack_ipv4

    检查已编译到节点内核中

    grep -e ipvs -e nf_conntrack_ipv4 /lib/modules/$(uname -r)/modules.builtin

    是否被加载

    modprobe -- ip_vs

    modprobe -- ip_vs_rr

    modprobe -- ip_vs_wrr

    modprobe -- ip_vs_sh

    modprobe -- nf_conntrack_ipv4

    to check loaded modules, use

    lsmod | grep -e ipvs -e nf_conntrack_ipv4

    or

    cut -f1 -d " " /proc/modules | grep -e ip_vs -e nf_conntrack_ipv4

    注:

    linux kernel 4.19版本已经将nf_conntrack_ipv4 更新为 nf_conntrack, 而 kube-proxy 1.13 以下版本,强依赖 nf_conntrack_ipv4。 解决方式:

    1、降级内核到 4.18 

    2、升级kube-proxy到 1.13+ (推荐,无需重启机器,影响小)

    升级kube-proxy:

    1、下载bin文件

    https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.13.md#node-binaries

    wget https://dl.k8s.io/v1.13.2/kubernetes-node-linux-amd64.tar.gz

    2、解压后替换 kube-proxy文件,更新配置,完成重启

    tar -zxvf kubernetes-node-linux-amd64.tar.gz

    mv /usr/local/bin/kube-proxy /usr/local/bin/kube-proxy.1.12.3

    cp kubernetes/node/bin/kube-proxy /usr/local/bin/

    配置文件更新如下:

    /etc/systemd/system/kube-proxy.service

    ...

    --proxy-mode=ipvs

    ...

    systemctl restart kube-proxy.service # 重启服务

    3、 查看日志确认没有异常

    journalctl -u kube-proxy.service

    日志中输出:

    server_others.go:189] Using ipvs Proxier. 表示配置ipvs模式成功

    接下来验证 ipvs 规则: 

    (需提前安装好 ipvsadm 管理工具)

    #ipvsadm -ln

    IP Virtual Server version 1.2.1 (size=4096)

    Prot LocalAddress:Port Scheduler Flags

    -> RemoteAddress:Port Forward Weight ActiveConn InActConn

    TCP 172.17.0.1:30443 rr

    -> 10.244.0.23:443 Masq 1 0 0

    TCP 172.17.0.1:36142 rr

    我们可以看到有相关的规则,表示service 已经开始使用ipvs 进行流量负载均衡了。

    4、压力测试:

    简单启动nginx 服务, 暴露nodeport 

    #kubectl create deployment nginxtest --image=nginx:1.12

    #kubectl expose deployment nginxtest --port=80 --type=NodePort

    #kubectl get svc nginxtest

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

    nginxtest NodePort 10.68.10.190 80:35896/TCP 84s

    #kubectl get deployments nginxtest

    NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE

    nginxtest 1 1 1 1 118s

    使用ab进行测试:

    #ab -c 100 -n 100000 http://10.68.10.190/

    #ab -c 100 -n 100000 http://10.188.1.201:35896/

    如无异常,则表示ipvs功能正常可用了。

    踩的一些坑:

    #使用ab测试,发现有许多耗时非常大的请求,有时也会失败。 查看dmesg日志后发现有如下日志输出:

    net_ratelimit: 544 callbacks suppressednf_conntrack: nf_conntrack: table full, dropping packet

    -------》 提示 nf_conntrack: table full,增加如下值到 sysctl.conf中。 kube-proxy 默认会调整到 131072

    net.netfilter.nf_conntrack_max=1048576

    net.nf_conntrack_max=1048576

    apr_socket_recv: Connectionresetbypeer

    -------》 ab测试的时候出现,这个主要防止 syn***的, 内网我们可以打开 echo " net.ipv4.tcp_syncookies = 0" >> /etc/sysctl.conf && sysctl -p

    参考文献: https://kubernetes.io/zh/blog/2018/07/09/ipvs-based-in-cluster-load-balancing-deep-dive/

    https://github.com/kubernetes/kubernetes/blob/master/pkg/proxy/ipvs/README.md#run-kube-proxy-in-ipvs-mode 

    https://testerhome.com/topics/7509

    相关文章

      网友评论

          本文标题:kubernetes开启ipvs 模式

          本文链接:https://www.haomeiwen.com/subject/otgvqctx.html