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)暴露多个服务。

相关推荐
RickyWasYoung1 小时前
【Matlab】合并多个子图的fig文件为一个大图
前端·matlab·信息可视化
爱滑雪的码农1 小时前
React+three.js之项目搭建
前端·javascript·react.js
杨凯凡1 小时前
【033】Maven 生命周期与坐标:多模块结构
java·maven
张风捷特烈1 小时前
状态管理大乱斗#07 | Signals 源码评析 - 暗流涌动
android·前端·flutter
lihongli0001 小时前
关于c++中锁的种类与使用
java·开发语言·c++
凤凰院凶涛QAQ1 小时前
《C++转Java快速入手系列》继承与多态篇
java·c++
倒霉蛋小马1 小时前
Idea--如何同一个SpringBoot项目复制多次,模拟集群环境
java·ide·intellij-idea
IT 行者1 小时前
Spring Boot 4.1.0-RC1 发布:核心新特性解析
java·spring boot·后端
Cat_Rocky1 小时前
Ingress-Nginx 全局超时配置及生效方式
java·服务器·nginx