一、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. 大概的工作过程:
-
你写一个 Ingress 规则文件,提交给 K8s。
-
Ingress Controller 一直盯着这些规则,发现有变化。
-
它自己生成一段 Nginx 配置文件,然后更新到运行 Nginx 的 Pod 里。
-
Nginx 加载新配置,开始按规则转发外部流量。
二、实际怎么用?(分两种模式验证)
文档里做了两种模式:NodePort 和 LoadBalancer。
准备工作:
-
先部署 Ingress Controller(文档里用的是 nginx 版的,版本 v1.12.0)。
-
准备好一个 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)暴露多个服务。