当前位置:首页 > 前端开发 > 正文

Ingress负载均衡机制是什么?如何配置Ingress

Ingress是Kubernetes集群的流量门卫,它把外部HTTP/HTTPS请求按规则转发给内部Service,真正负责转发决策的负载均衡机制由Ingress Controller实现。很多人把Ingress和Service混为一谈,其实Ingress只是一套规则声明,就像贴在门上的快递分拣表,而Controller才是那个弯腰干活的快递员。

Ingress负载均衡机制是什么,它和Service有啥区别

Ingress工作原理:从请求到Pod的完整链路

一次完整的Ingress访问流程长这样:

  • 外部请求先打到Ingress Controller的监听端口,通常是宿主机的80或443
  • Controller读取Ingress资源的规则,比如域名是api.example.com,路径是/v1
  • 根据规则匹配到对应的Service
  • Service再通过Endpoints列表把请求转发到具体的Pod

整个过程中,Ingress扮演的是“路由表”角色,Controller负责“查表并转发”,业内专家指出,这种设计把四层负载和七层路由拆开,让集群入口管理变得灵活不少。

一个最简的Ingress资源长这样:

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: host: api.example.com http: paths: path: /v1 pathType: Prefix backend: service: name: api-service port: number: 8080

Ingress和Service的区别:一个管转发,一个管发现

Ingress负载均衡机制是什么?如何配置Ingress 第1张

对比项 Service Ingress
层级 四层(TCP/UDP) 七层(HTTP/HTTPS)
核心能力 Pod发现与负载均衡 域名/路径路由规则
暴露方式 ClusterIP、NodePort、LoadBalancer 依赖Controller落地
规则管理 无路由规则概念 支持路径、域名、TLS、注解
典型场景 集群内部服务间调用 对外提供HTTP服务

行业共识认为,Service解决的是“访问谁”的问题,Ingress解决的是“按什么规则访问”的问题,用大白话说,Service是小区里的楼栋号,Ingress是小区门口的访客登记表,上面写着“找张三去3栋,找李四去5栋”。

为什么有了Service还需要Ingress

NodePort虽然能暴露服务,但每个Service都要占用一个宿主机端口,服务一多端口就乱成一锅粥,LoadBalancer类型的Service在自建集群里又贵又麻烦,Ingress用一个入口收敛所有HTTP流量,还能免费给你TLS终止、URL重写、灰度发布这些能力,这是它存在的最大价值。

生产环境Ingress Controller怎么选:Nginx与Traefik对比

主流Controller现状

Kubernetes生态里的Controller不少,但生产环境最常见的主要是这几个:

  • ingress-nginx:目前社区最活跃,基于Nginx引擎,文档全,踩坑经验多
  • Traefik:云原生亲儿子,动态配置能力强,自带Dashboard,和微服务配合默契
  • HAProxy Ingress:性能取向,主打高并发四层和七层
  • 云厂商自带Ingress:阿里云、西西安全都提供托管版,免运维但灵活性略低

Nginx与Traefik选型对比

Ingress负载均衡机制是什么?如何配置Ingress 第2张

对比项 ingress-nginx Traefik
配置方式 注解为主,支持ConfigMap 动态配置,CRD + 文件多种
性能表现 稳定性强,高并发表现好 略逊于Nginx,但够用
学习曲线 需要熟悉Nginx语义 配置简单,上手快
灰度发布 支持Canary注解 原生支持,路由规则更细腻
Dashboard 依赖Grafana等外部监控 自带Web UI
社区生态 使用者众,问题方案多 社区活跃,但踩坑案例少

生产环境怎么选?如果你们团队对Nginx熟悉,业务以标准HTTP为主,直接上ingress-nginx,它是目前最稳的选择,如果你们是微服务架构,服务拆分细,路由规则变化频繁,Traefik的动态配置能力能让发布流程省不少事。

自建还是用云托管

云托管的Ingress胜在省心,升级、高可用、监控都帮你做了,但规则透传和定制能力受限,自建Ingress则要自己扛高可用和性能调优,多数情况下,中小团队建议用云托管,等规模大了再考虑自建。

国内云厂商Ingress费用贵不贵,配置要点有哪些

费用构成:别只看Ingress本身

国内环境里,阿里云、西西安全、华为云都提供Ingress托管方案,费用大头通常不在Ingress本身,而在背后的负载均衡SLB实例和流量。

  • 阿里云ACK的Ingress默认基于SLB,收费按SLB实例费 + 公网流量费
  • 西西安全TKE的Ingress基于CLB,计费方式类似,按量计费为主
  • 自建ingress-nginx则只需支付ECS服务器费用,流量按云厂商出方向单价算

据云厂商公开计费说明,托管Ingress的费用差异不大,真正拉开成本的是流量和实例规格,如果集群规模不大,用自建的ingress-nginx加一台2核4G的节点就能跑得很稳,成本远低于想象。

Ingress负载均衡机制是什么?如何配置Ingress 第3张

配置要点:注解、证书和健康检查

国内云厂商的Ingress,配置核心全在注解里,举几个高频场景:

  • HTTPS证书管理:阿里云支持自动关联SSL证书服务,西西安全支持Secret方式挂载证书
  • 连接空闲超时

    :默认超时时间较短,长连接场景需要调大keep-alive超时注解

  • 后端健康检查:云托管Ingress默认带健康检查,但自定义路径要用注解标注
  • 生产环境必做的三件事

    • 给Ingress Controller单独打节点标签,用nodeSelector调度到专用节点,避免业务应用挤占CPU
    • 开启Controller的多副本扩展,至少2个副本做高可用,分散在不同可用区
    • 配置监控告警,盯住Controller的请求延迟、错误率、Pod重启次数,别等用户反馈才发现挂了

    常见Ingress故障排查(Q&A)

    问:Ingress返回503 Service Unavailable,怎么排查?

    先看后端Pod是不是Running,再检查对应的Service能不能通,用kubectl get endpoints看有没有地址,如果Endpoints为空,说明Service的selector没匹配到Pod,最后看ingress-nginx的日志,确认它把请求转发到了哪个上游。

    问:生产环境ingress和LoadBalancer Service可以配合使用吗?

    可以,而且很常见,云厂商的Ingress本身就是SLB或CLB接入到Controller,前面是四层负载,后面是七层路由,这种架构下,SLB负责扛流量,Ingress负责精细转发,配合起来能覆盖大规模流量场景。

    问:高并发场景下,Ingress会成为性能瓶颈吗?

    任何入口层都会成为潜在瓶颈,假设你的业务峰值每秒上万请求,单副本ingress-nginx通常能扛住,但保险起见建议把副本数扩展到3个以上,并开启Pod反亲和让副本分布在不同节点,同时调大worker_processes和worker_connections,减少TLS握手开销,用长连接复用,Ingress的瓶颈大多不在软件本身,而在你没给它做资源规划。


    Ingress不是银弹,但它是Kubernetes对外暴露HTTP服务的标准姿势,把Controller选型、配置规范和故障排查这三件事做扎实,你的集群入口就能稳如老狗。

0