K8s 集群 Ingress 网关实践DevOps技术栈(三)
  

marco 13531人觉得有帮助

{{ttag.title}}
ingress 多集群隔离部署
kubernetes 集群部署业务时,某些场景下需要将 ingress 隔离部署,例如预发环境和生产环境的业务流量需要严格区分开,某些大流量业务、重保核心业务也需要进行隔离。
ingress nginx 官方提供多集群部署方案,详见官方文档:
https://kubernetes.github.io/ingress-nginx/user-guide/multiple-ingress/。
事实上,多业务共享 ingress 集群的原因在于 ingresscontroller 在监听 kubernetes apiserver 时 拉取了所有 ingress 资源对象,没有做过滤和区分。所幸 ingress nginx 官方提供“kubernetes.io/ingress.class”机制将 ingress 资源对象进行归类。
最终达到的效果是:
ingress controllerA 仅仅只 watch"属于业务 A 的 ingress 资源对象"
nginx controllerB 仅仅只 watch “属于业务 A 的 ingress 资源对象”
我们在 3.2 章节 daemonset + hostNetwork 部署方案的基础之上,结合 ingress 集群隔离部署方案,最终实现了 ingress 集群的高可用、高性能、简单易维护、特殊业务可隔离的部署架构。


性能优化
ingress-nginx 集群作为 kubernetes 集群内外通信的流量网关,需要优化性能满足业务需求,我们在 nginx 和内核配置层面做了相应的优化工作。
宿主机中断优化
ingress-nginx 物理机执行 top 命令发现每个 CPU 的 si 指标不均衡,针对此问题 我们开启了网卡多队列机制 以及中断优化。
开启网卡多队列:
ethtool -l eth0  // 查看网卡可以支持的多队列配置ethtool -L eth0 combined 8 // 开启网卡多队列机制
中断打散优化:
service irqbalance stop  // 首先关闭irqbalance系统服务sh set_irq_affinity -X all eth0  // Intel提供中断打散脚本:https://github.com/majek/ixgbe/blob/master/scripts/set_irq_affinity
我们针对内核参数也做了优化工作以提升 nginx 性能,主要基于 nginx 官方提供的性能优化方案:https://www.nginx.com/blog/tuning-nginx/
(1)调整连接队列大小
nginx 进程监听 socket 套接字的 连接队列大小默认为 511 ,在高并发场景下 默认的队列大小不足以快速处理业务流量洪峰,连接队列过小会造成队列溢出、部分请求无法建立 TCP 连接,因此我们调整了 nginx 进程连接队列大小。
sysctl -w net.core.somaxconn=32768
nginx 进程充当反向代理时 会作为客户端与 upstream 服务端建立 TCP 连接,此时会占用临时端口,Linux 默认的端口使用范围是 32768-60999,在高并发场景下,默认的源端口过少会造成端口资源耗尽,nginx 无法与 upstream 服务端建立连接,因此我们调整了默认端口使用范围。
sysctl -w net.ipv4.ip_local_port_range="1024 65000"
nginx 进程充当反向代理时 会作为服务端与接入层 nginx 建立 TCP 连接,同时作为客户端与 upstream 服务端建立 TCP 连接,即 1 个 HTTP 请求在 nginx 侧会耗用 2 条连接,也就占用 2 个文件描述符。在高并发场景下,为了同时处理海量请求,我们调整了最大文件描述符数限制。
sysctl -w fs.file-max=1048576
nginx 进程充当反向代理时 会作为客户端与 upstream 服务端建立 TCP 连接,连接会超时回收和主动释放,nginx 侧作为 TCP 连接释放的发起方,会存在 TIME_WAIT 状态的 TCP 连接,这种状态的 TCP 连接会长时间 (2MSL 时长) 占用端口资源,当 TIME_WAIT 连接过多时 会造成 nginx 无法与 upstream 建立连接。
处理 TIME_WAIT 连接通常有 2 种解决办法:
net.ipv4.tcp_tw_reuse:复用TIME_WAIT状态的socket用于新建连接net.ipv4.tcp_tw_recycle:快速回收TIME_WAIT状态连接
由于 tcp_tw_recycle 的高危性,4.12 内核已经废弃此选项,tcp_tw_reuse 则相对安全,nginx 作为 TCP 连接的发起方,因此启用此选项。
sysctl -w net.ipv4.tcp_tw_reuse=1
以上内核参数都使用 kubernetes 提供的 initContainer 机制进行设置。
initContainers:
initContainers:      - name: sysctl        image: alpine:3.10        securityContext:          privileged: true        command:        - sh        - -c        - sysctl -w net.core.somaxconn=32768; sysctl -w net.ipv4.ip_local_port_range='1024 65000'; sysctl -w fs.file-max=1048576; sysctl -w net.ipv4.tcp_tw_reuse=1

打赏鼓励作者,期待更多好文!

打赏
1人已打赏

一个无趣的人 发表于 2022-7-16 20:30
  
我在社区摸爬滚打这么多年,所谓阅人无数,就算没有见过猪走路,也总明白猪肉是啥味道的。一看到楼主的气势,我就觉得楼主同在社区里灌水的那帮小混子有着本质的差别,你一定就是传说中的最强技术牛。
暗夜星空 发表于 2021-1-10 13:52
  
多谢分享
marco 发表于 2021-1-9 19:57
  
感谢分享,
暗夜星空 发表于 2021-1-9 15:20
  
多谢分享
蟲爺 发表于 2021-1-9 13:48
  
感谢分享
gqce 发表于 2021-1-9 13:15
  
感谢分享
一一氵 发表于 2021-1-8 20:17
  
感谢分享
发表新帖
热门标签
全部标签>
每日一问
新版本体验
GIF动图学习
高手请过招
产品连连看
安装部署配置
标准化排查
安全效果
功能体验
纪元平台
【 社区to talk】
升级
测试报告
用户认证
解决方案
每周精选
社区新周刊
答题自测
技术笔记
西北区每日一问
信服课堂视频
畅聊IT
专家问答
技术圆桌
在线直播
MVP
网络基础知识
安全攻防
上网策略
日志审计
问题分析处理
流量管理
每日一记
运维工具
原创分享
sangfor周刊
VPN 对接
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
SDP百科
功能咨询
终端接入
授权
设备维护
资源访问
地址转换
虚拟机
存储
迁移
排障笔记本
产品预警公告
玩转零信任
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
2023技术争霸赛专题
卧龙计划
华北区拉练
天逸直播
以战代练
秒懂零信任
技术晨报
平台使用
技术盲盒
山东区技术晨报
文档捉虫
齐鲁TV
华北区交付直播
2024年技术争霸赛
北京区每日一练
场景专题
故障笔记
排障那些事
升级&主动服务
高频问题集锦
POC测试案例
全能先锋系列
云化安全能力
专家说
热门活动
产品动态
行业实践
产品解析
关键解决方案

本版达人

feeling

本周分享达人

新手29676...

本周提问达人