Administrator
发布于 2026-08-19 / 1 阅读
0
0

第十章.k8sHELM-Ingress-nginx-1

来源链接:https://www.bilibili.com/video/BV1PbeueyE8V?spm_id_from=333.788.videopod.episodes&vd_source=d8c71ff24a3359a807967fc4b5daa0e4&p=73

【K8s教程笔记】第十章:Ingress-Nginx 核心原理与实现

对应视频:薪享宏福Kubernetes v1.29 教程 p73

1. 前置铺垫:四层负载(L4)与七层负载(L7)的核心差异

1.1 四层负载(以LVS/IPVS为例)

  • 工作层级:传输层(TCP/UDP),仅做数据包转发,不解析应用层内容
  • 核心特性:一次完整的TCP连接由客户端与后端真实服务器直接建立,负载均衡器仅承担转发作用,不参与连接建立
  • 限制:要求客户端与后端服务器使用的协议完全一致,例如客户端发起HTTP请求,后端也必须支持HTTP,无法实现协议转换、路径分发等七层特性
  • K8s适配:创建四层Service时,K8s会自动创建底层IPVS负载均衡规则,无需人工配置

1.2 七层负载(以Nginx为例)

  • 工作层级:应用层(HTTP/HTTPS),可解析应用层请求内容
  • 核心特性:作为代理服务器工作,两次独立的TCP连接:客户端先与Nginx建立连接,Nginx再与后端真实服务器建立连接,全程由Nginx代理转发请求与响应
  • 核心能力:
    1. 协议转换:例如客户端使用HTTPS加密访问,Nginx在内网环境下可降级为HTTP协议与后端通信,仅Nginx承担加密解密开销,降低后端服务配置压力
    2. 路径分发:支持基于请求路径、主机名等七层特征做路由,适配微服务场景下的服务网关需求
    3. 虚拟主机:支持同一IP/端口下,基于不同域名将请求转发到不同后端服务
  • 微服务示例:教学管理系统微服务化后,拆分为教室管理、学生管理、教师管理等多个独立服务,可通过Nginx配置实现按路径路由:
    • 访问域名/classroom转发到教室管理服务
    • 访问域名/student转发到学生管理服务
    • 访问域名/teacher转发到教师管理服务

2. 手动实现七层负载的痛点

若手动在K8s中部署Nginx实现七层负载,需要完成以下操作:

  1. 部署Nginx Deployment,通过NodePort/主机端口映射将Nginx端口暴露到物理机
  2. 手动编写Nginx配置文件,配置upstream块定义后端服务地址、server块配置路由规则
  3. 为每个后端服务创建K8s Service(SVC),避免Pod地址变更后需要手动修改Nginx配置
  4. 可通过ConfigMap(CM)挂载Nginx配置,修改CM后重启Pod即可生效,无需进入容器内部修改
  • 核心问题:所有路由规则变更都需要人工修改配置并重启Nginx,自动化程度极低,无法适配动态的K8s集群环境

3. Ingress 的核心价值

Ingress是K8s中用于声明式定义七层路由规则的API资源,配合Ingress Controller(如Nginx Ingress Controller)可以实现:

  • 用户仅需编写Ingress YAML,定义主机名、请求路径、后端Service等规则,无需关心底层Nginx的配置细节
  • Ingress Controller会自动监听Ingress对象、后端Service/Pod的变化,自动生成Nginx配置并触发重载,实现全流程自动化
  • 示例Ingress规则(定义两个虚拟主机,分别转发到不同后端服务):
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: example-ingress
    spec:
      rules:
      - host: foo8.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: svc1
                port:
                  number: 80
      - host: buff.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: svc2
                port:
                  number: 80
    

4. 主流Ingress方案选型

方案 核心特性 适用场景
Nginx Ingress 当前行业普及度最高,生态完善,功能全面 通用场景,绝大多数企业生产环境首选
Apache APISIX 微服务可观测性极强,支持自动生成流量拓扑图 微服务治理、可观测性要求高的场景
Traefik 基于Go语言编写,原生适配微服务架构,配置简单 微服务、云原生快速落地场景
Contour 基于Go语言编写的云原生专属代理 云原生场景、K8s原生集成需求高的场景

5. Nginx Ingress 架构与工作原理

5.1 核心架构

Nginx Ingress Controller基于Go语言开发,采用协程(goroutine)模型运行,核心包含两类监听模块:

  1. 监听Ingress资源对象的变化,获取用户定义的路由规则
  2. 监听后端Service、Pod的变化,获取后端服务的实时地址

5.2 双同步机制

为避免频繁重载Nginx影响性能,采用两级同步策略:

  1. 重要变更同步:新增/删除Ingress规则等核心变更,由主协程直接同步到Nginx进程,立即触发配置重载
  2. 非重要变更同步:后端Pod地址变更、Pod扩缩容等非核心变更,先写入二级缓冲(FIFO队列),定期批量同步到Nginx,仅当变更累积到一定阈值或定时任务触发时才执行重载
  • 类比:如同公司董事长(Nginx进程),重要事项(Ingress规则变更)由秘书(主协程)直接汇报,小事(后端Pod变更)先记录在待办清单(二级缓冲),定期统一汇报,避免频繁打扰董事长影响正常工作

6. 四层与七层负载核心差异对比

维度 四层负载(LVS/IPVS) 七层负载(Nginx Ingress)
工作层级 传输层(TCP/UDP) 应用层(HTTP/HTTPS)
TCP连接数 1次(客户端直接连后端) 2次(客户端连Nginx,Nginx连后端)
协议支持 仅支持客户端与后端协议一致 支持协议转换,可适配不同协议场景
路由能力 仅支持基于IP+端口的转发 支持基于域名、路径、请求头等七层特征的路由
适用场景 四层负载均衡、高性能转发 微服务网关、七层路由、SSL卸载等场景

AI 总结

本章节围绕K8s生态下的Ingress-Nginx方案展开,首先通过对比四层与七层负载均衡的技术差异,明确了Ingress在七层路由、协议转换、微服务适配等场景的核心价值;再结合手动实现七层负载的痛点,引出Ingress声明式API的自动化优势;随后梳理了当前主流的Ingress实现方案,明确Nginx Ingress的行业地位;最后深入讲解了Nginx Ingress的协程架构与双同步机制,解释了其高可用、高性能的设计原理,帮助学习者完整掌握Ingress-Nginx的核心知识体系。


评论