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(1)调整连接队列大小 nginx 进程监听 socket 套接字的 连接队列大小默认为 511 ,在高并发场景下 默认的队列大小不足以快速处理业务流量洪峰,连接队列过小会造成队列溢出、部分请求无法建立 TCP 连接,因此我们调整了 nginx 进程连接队列大小。 sysctl -w net.core.somaxconn=32768nginx 进程充当反向代理时 会作为客户端与 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=1048576nginx 进程充当反向代理时 会作为客户端与 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 |