热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

k8s七层代理Ingresscontroller高并发优化

     ▲ 点击上方"DevOps和k8s全栈技术"关注公众号在k8s部署业务服务pod时,如果将该Pod以k8s svc  NodePort类型负载出来,这时压测应用的响应性能较高,可以达到10w

     ▲ 点击上方"DevOps和k8s全栈技术"关注公众号

a69d84c144167aaab065ffdda11e84da.png

在k8s部署业务服务pod时,如果将该Pod以k8s svc  NodePort类型负载出来,这时压测应用的响应性能较高,可以达到10w多的QPS;将这个k8s svc再用Ingress代理,压测应用发现只有5w多的QPS了。这个性能开销非常大,差了大概一半的性能,所以需要对nginx-ingress-controller进行优化处理。

da09411c9d3db6a5e7bf8cf1fdb78a7e.png

我们知道,nginx-ingress-controller的原理实际上是扫描Kubernetes集群中的Ingress资源,根据Ingress资源的定义自动为每个域名生成一段nginx虚拟主机及反向代理的配置,最后由nginx读取这些配置,完成实际的HTTP请求流量的处理,整个HTTP请求链路如下:

client ->nginx -> upstream(kubernetes service) -> pods

nginx的实现中必然要对接收的HTTP请求进行7层协议解析,并根据请求信息将HTTP请求转发给upstream。

而client直接请求kubernetes service有不错的QPS值,说明nginx这里存在问题。

8965a6789f6e1bd95bce12e5b7c74386.png

1)使用ipvs代替iptables

[root@xianchaomaster1 ~]#yum install -y ipset ipvsadm

[root@xianchaomaster1~]#cat <<'EOF' > /etc/sysconfig/modules/ipvs.modules

#!/bin/bash

ipvs_modules=(ip_vsip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_ship_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack_ipv4)

forkernel_module in ${ipvs_modules[*]}; do

/sbin/modinfo -Ffilename ${kernel_module} > /dev/null 2>&1

if [ $? -eq 0 ];then

/sbin/modprobe${kernel_module}

fi

done

EOF

[root@xianchaomaster1~]#chmod +x /etc/sysconfig/modules/ipvs.modules

[root@xianchaomaster1~]# /etc/sysconfig/modules/ipvs.modules

[root@xianchaomaster1~]# kubectl -n kube-system edit cm kube-proxy

......

mode:"ipvs"

......

[root@xianchaonode1~]# yum install -y ipset ipvsadm

[root@xianchaonode1~]#cat<<'EOF' > /etc/sysconfig/modules/ipvs.modules

#!/bin/bash

ipvs_modules=(ip_vsip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_ship_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack_ipv4)

forkernel_module in ${ipvs_modules[*]}; do

/sbin/modinfo -Ffilename ${kernel_module} > /dev/null 2>&1

if [ $? -eq 0 ];then

/sbin/modprobe${kernel_module}

fi

done

EOF

[root@ xianchaonode1~]# chmod +x /etc/sysconfig/modules/ipvs.modules

[root@ xianchaonode1~]#/etc/sysconfig/modules/ipvs.modules

[root@xianchaomaster1~]# kubectl -n kube-system get pod -l k8s-app=kube-proxy | grep -v 'NAME' | awk'{print $1}' | xargs kubectl -n kube-system delete pod

[root@xianchaomaster1~]# iptables -t filter -F; iptables -t filter -X; iptables -t nat -F; iptables-t nat -X;

[root@ xianchaonode1~]#iptables -t filter -F; iptables -t filter -X; iptables -t nat -F; iptables -tnat -X;

修改ipvs模式之后过5-10分钟测试在k8s创建pod是否可以正常访问网络

[root@xianchaomaster1~]# kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox-- sh

/ # pingwww.baidu.com

PING www.baidu.com(39.156.66.18): 56 data bytes

64 bytes from110.242.68.4: seq=0 ttl=127 time=37.319 ms

#通过上面可以看到能访问网络

/# exit

测试dns是否正常

[root@xianchaomaster1 ~]# kubectl run busybox--image busybox:1.28 --restart=Never --rm -it busybox -- sh

/ # nslookup kubernetes.default.svc.cluster.local

Server:    10.96.0.10

Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:     kubernetes.default.svc.cluster.local

Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local

看到上面内容,说明k8s的dns解析正常

2)k8s集群节点修改内核参数

cat <> /etc/sysctl.conf

net.core.somaxcOnn= 655350

net.ipv4.tcp_synCOOKIEs= 1

net.ipv4.tcp_timestamps= 1

net.ipv4.tcp_tw_reuse= 1

net.ipv4.tcp_fin_timeout= 30

net.ipv4.tcp_max_tw_buckets= 5000

net.nf_conntrack_max= 2097152

net.netfilter.nf_conntrack_max= 2097152

net.netfilter.nf_conntrack_tcp_timeout_close_wait= 15

net.netfilter.nf_conntrack_tcp_timeout_fin_wait= 30

net.netfilter.nf_conntrack_tcp_timeout_time_wait= 30

net.netfilter.nf_conntrack_tcp_timeout_established= 1200

EOF

$ sysctl -p –system

3)k8s集群节点修改最大打开文件数

ulimit -n 655350

cat /etc/sysctl.conf

...

fs.file-max=655350

...

sysctl -p--system

cat/etc/security/limits.conf

...

* hard nofile655350

* soft nofile655350

* hard nproc6553

* soft nproc655350

root hard nofile655350

root soft nofile655350

root hard nproc655350

root soft nproc655350

...

echo 'sessionrequired pam_limits.so' >> /etc/pam.d/common-session

4)优化nginx-ingress-controller

参考nginx-ingress-controller的配置方法,这里优化部分如下:

$ kubectl -nkube-system edit configmap nginx-configuration

...

apiVersion: v1

data:

keep-alive:"60"

keep-alive-requests:"100"

upstream-keepalive-connections:"10000"

upstream-keepalive-requests:"100"

upstream-keepalive-timeout:"60"

kind: ConfigMap

...

此时发现性能好多了

e3f6192247f43b93c752e72c602a81f6.png

么是Keep-Alive模式?

HTTP协议采用请求-应答模式,有普通的非KeepAlive模式,也有KeepAlive模式。

非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成 之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。

启用Keep-Alive的优点

启用Keep-Alive模式肯定更高效,性能更高。因为避免了建立/释放连接的开销。下面是RFC 2616 上的总结:

TCP连接更少,这样就会节约TCP连接在建立、释放过程中,主机和路由器上的CPU和内存开销。

网络拥塞也减少了,拿到响应的延时也减少了

错误处理更优雅:不会粗暴地直接关闭连接,而是report,retry

性能大提升的原因

压测命令ab并没有添加-k参数,因此client->nginx的HTTP处理并没有启用Keep-Alive。

但由于nginx-ingress-controller配置了upstream-keepalive-connections、upstream-keepalive-requests、upstream-keepalive-timeout参数,这样nginx->upstream的HTTP处理是启用了Keep-Alive的,这样到Kuberentes Service的TCP连接可以高效地复用,避免了重建连接的开销。

作者微信:luckylucky421302

30a1a9d58835a53a926bc7a99d4950db.png

精彩文章推荐

年底了,总结下这一年,收获满满

2022年底第一波福利!

基于Jenkins+git+harbor+Helm+k8s+Istio构建DevOps流水线

基于k8s+Prometheus+Alertmanager+Grafana构建企业监控告警系统

k8s七层代理Ingress-nginx基于COOKIE、请求头、权重实现灰度发布

如何优化k8s网络插件?

修改k8s kube-proxy代理-由iptables模式变为ipvs模式

k8s控制器Deployment详细介绍:资源清单编写技巧

每周好课推荐

目前有以下几个畅销和高口碑课程,在平台所有课程中排在第一:

(1)热销课->《Docker+K8S+Istio+k8s故障排查+DevOps+Openstack+Openshift+Python+监控+日志收集+Rancher》课程折上折,现在双折扣---->点此立即学习>>https://edu.51cto.com/surl=vGfJG2

(2)福利课->Kubernetes管理员认证 (CKA)购课链接--->

课程地址:https://edu.51cto.com/course/28751.html

(3)安全课->Kubernetes安全专家认证

【零基础入门】K8S CKS认证考试培训 +k8s安全+k8s运维-->

购课链接--->https://edu.51cto.com/topic/5206.html

          点亮,服务器10年不宕机f4a81869bb0bce7d0781b768fe0d3d28.giff0a8bbcde2b3646b4dec5c83cdac5cdb.gif

点击阅读 | 了解更多


推荐阅读
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • CentOS 7 中 iptables 过滤表实例与 NAT 表应用详解
    在 CentOS 7 系统中,iptables 的过滤表和 NAT 表具有重要的应用价值。本文通过具体实例详细介绍了如何配置 iptables 的过滤表,包括编写脚本文件 `/usr/local/sbin/iptables.sh`,并使用 `iptables -F` 清空现有规则。此外,还深入探讨了 NAT 表的配置方法,帮助读者更好地理解和应用这些网络防火墙技术。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 微服务优雅上下线的最佳实践
    本文介绍了微服务上下线的正确姿势,避免使用 kill -9 等粗暴手段,确保服务的稳定性和可靠性。 ... [详细]
  • 过去查询Mysql的时候,都见3306对所有端口开放着,感觉不安全。netstat&nbsp;-anlp&nbsp;|&nbsp;grep&nbsp;mysqltcp&nbsp;0&am ... [详细]
  • Spring 切面配置中的切点表达式详解
    本文介绍了如何在Spring框架中使用AspectJ风格的切面配置,详细解释了切点表达式的语法和常见示例,帮助开发者更好地理解和应用Spring AOP。 ... [详细]
  • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
  • 基于Linux开源VOIP系统LinPhone[四]
    ****************************************************************************************** ... [详细]
  • 本文介绍了如何在 macOS 上安装 HL-340 USB 转串口驱动,并提供了详细的步骤和注意事项。包括下载驱动、关闭系统完整性保护、安装驱动以及验证安装的方法。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • [c++基础]STL
    cppfig15_10.cppincludeincludeusingnamespacestd;templatevoidprintVector(constvector&integer ... [详细]
  • 在分析Android的Audio系统时,我们对mpAudioPolicy->get_input进行了详细探讨,发现其背后涉及的机制相当复杂。本文将详细介绍这一过程及其背后的实现细节。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 在Java编程中,初始化List集合有多种高效的方法。本文介绍了六种常见的技术,包括使用常规方式、Arrays.asList、Collections.addAll、Java 8的Stream API、双重大括号初始化以及使用List.of。每种方法都有其特定的应用场景和优缺点,开发者可以根据实际需求选择最合适的方式。例如,常规方式通过直接创建ArrayList对象并逐个添加元素,适用于需要动态修改列表的情况;而List.of则提供了一种简洁的不可变列表初始化方式,适合于固定数据集的场景。 ... [详细]
author-avatar
曾理Aiheqihao_227
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有