K8s Ingress

一、Ingress 是什么?为什么需要它?

1. 先说说之前暴露服务的两种方式的缺点:

  • NodePort:每个服务都要占用集群里每台机器的一个端口,服务一多,端口就乱套了。

  • LoadBalancer:每个服务都要配一个独立的负载均衡器,太浪费钱,而且需要云服务商支持,自己没有。

2. Ingress 的作用:

  • Ingress 就像一个大门口的反向代理 (类似 Nginx),你只需要一个 NodePort 或一个 LoadBalancer,就能把外面来的请求,根据域名路径,转发给集群内部的不同服务。

  • 它工作在第七层(应用层),可以理解成:

    • 你访问 nginx.jx.com → 转发到后端的 nginx 服务

    • 你访问 nginx2.jx.com → 转发到另一个 nginx 服务

3. 两个核心概念:

  • Ingress 资源:就是一堆规则,告诉 Ingress 控制器"哪个域名/路径该找哪个 Service"。

  • Ingress Controller:真正干活的人,它监听 Ingress 规则的变化,然后自动配置 Nginx(或别的代理),让代理按照规则转发请求。

4. 大概的工作过程:

  1. 你写一个 Ingress 规则文件,提交给 K8s。

  2. Ingress Controller 一直盯着这些规则,发现有变化。

  3. 它自己生成一段 Nginx 配置文件,然后更新到运行 Nginx 的 Pod 里。

  4. Nginx 加载新配置,开始按规则转发外部流量。


二、实际怎么用?(分两种模式验证)

文档里做了两种模式:NodePort 和 LoadBalancer。

准备工作:

  1. 先部署 Ingress Controller(文档里用的是 nginx 版的,版本 v1.12.0)。

  2. 准备好一个 Deployment(3 个 nginx Pods)和一个 Service(ClusterIP 类型,对外不直接暴露)。

模式一:NodePort 模式

  • 把 Ingress Controller 自己的 Service 类型改成 NodePort

  • 然后创建一个 Ingress 规则,比如:
    nginx.jx.com 这个域名的所有请求 → 转发到内部的 nginx-svc 服务(端口 80)。

  • 由于 Ingress Controller 跑在某个 Node 上(比如 node2),你需要在访问的机器上写 hosts,把 nginx.jx.com 指向 node2 的 IP,然后访问 http://nginx.jx.com:31502(31502 是 NodePort 暴露的端口),就能看到 nginx 欢迎页。

简单说:NodePort 模式下,你依然要记住端口号,但多个服务共享同一组 NodePort,不需要每个服务开一个新端口。

模式二:LoadBalancer 模式

  • 文档里因为环境是裸机(不是云平台),所以先装了 MetalLB 来提供 LoadBalancer 能力。

  • 开启 kube-proxy 的 strictARP 模式(避免 ARP 冲突,让流量正确转发)。

  • 给 Ingress Controller 的 Service 类型改成 LoadBalancer,MetalLB 会从你指定的 IP 池里分配一个外部 IP(比如 192.168.158.136)。

  • 此时你直接访问 http://nginx.jx.com(不需要加端口),请求就会通过 LoadBalancer → Ingress Controller → 目标 Service。

  • 如果你有多个域名,可以在 Ingress 规则里加多条 host,比如 nginx2.jx.com 也指向另一个 Service。

简单说:LoadBalancer 模式更"傻瓜",直接给个对外 IP,不用记端口,像用云上的负载均衡一样。


三、额外小知识(文档里提到的)

1. externalTrafficPolicy: Local 是什么?

  • 默认情况下,外部流量进到集群,可能会跳转到别的节点上的 Pod,这样会丢失客户端真实 IP。

  • 如果设置成 Local,流量只发给本节点上的 Pod,保留客户端 IP,但可能流量分布不均(没 Pod 的节点就收不到流量)。

2. internalTrafficPolicy: Cluster 是什么?

  • 这是集群内部流量(比如一个 Pod 访问另一个 Service)的默认行为:在所有 Pod 之间均匀转发,不管它们在哪个节点上。

3. 为什么需要 metalLB?

  • 因为你本地的 Kubernetes 集群(比如用虚拟机搭的)没有云厂商提供的 LoadBalancer,metalLB 就是免费帮你实现"LoadBalancer"类型 Service 的工具。

总结一句话:

Ingress 就是一个 7 层路由网关,你只需要配好"哪个域名走哪个服务",Ingress Controller 会自动帮你搭好 Nginx 并更新配置,让你用一个入口(NodePort 或 LB)暴露多个服务。

相关推荐
圆山猫11 分钟前
[Virtualization](四):Linux KVM/RISC-V 的 vCPU 运行路径
java·linux·risc-v
布鲁飞丝28 分钟前
vivo Pulsar 万亿级消息处理实践()-Ansible运维部署
运维·ansible
XR12345678833 分钟前
企业全光网络架构选型技术白皮书:从物理层到运维层的全链路分析
运维·网络·架构
城管不管1 小时前
ReAct、Plan-and-Execute、Reflection 三大智能 Agent 范式核心区别
java·人工智能·算法·spring·ai·动态规划
郭老二1 小时前
【前端】vue3:编译步骤
前端
IT小白杨1 小时前
从环境制备到自动化工作流:多账号运营的工程化架构拆解
java·经验分享·自动化·安全架构·指纹浏览器
HiDev_1 小时前
【非标自动化】2、认识元器件(直线模组)
运维·自动化
豆瓣鸡1 小时前
算法日记 - Day3
java·开发语言·算法
萧瑟余晖2 小时前
Java深入解析篇九之NIO详解
java·网络·nio
不在逃避q2 小时前
Trae/Vs Code/Cursor命令行无法跑npm命令
前端·arcgis·npm