loadbalance和ingress和service是如何配合使用的,通俗解释一下,并给我举一些实际的案例
通俗讲解 K8s 中 Service、Ingress、LoadBalance 三者配合
先一句话定位:三者都是流量入口,只是层级、作用、使用场景不一样,从内到外层层转发。
一、先搞懂各自是干啥的(大白话)
把整个 K8s 集群想象成一栋写字楼:
Pod:写字楼里一个个办公室(真正跑业务程序的地方)
Service:写字楼内部楼层导览台,只负责集群内部转发流量,给一组 Pod 做统一入口、负载均衡。
LoadBalancer 类型 Service:给写字楼对外装了一个独立大门,外网直接走这个门进楼。
Ingress:写字楼前台 / 总服务台,统一管所有外网入口,根据域名、路径分流到不同部门(服务),比单纯 LoadBalancer 更精细、更省资源。
二、三者核心关系(流转顺序)
外网流量标准走向分两种主流架构:
架构 1:外网 → LoadBalancer Service → 内部 Service → Pod
最粗暴直接:外网直接访问 LoadBalancer 大门,直达后端服务。
架构 2(生产主流):外网 → 公网 IP → Ingress → 内部 Service → Pod
统一入口 + 精细化路由,企业线上环境几乎都用这套。
核心链条永远不变:
外部流量 → 入口层 (Ingress/LoadBalancer) → 集群 Service → 最终 Pod
三、逐个拆解 + 通俗特点
1. Service(集群内部核心,必用)作用:
给一组 Pod 起固定访问地址(Pod IP 会变,Service IP 永远不变)
自动把流量分给多个 Pod(内部负载均衡)
默认只在集群内部能访问,外网进不来
比喻:公司内部工位太多,对外只留一个 "部门对接窗口",内部同事都找这个窗口。类型区分:
ClusterIP(默认):仅集群内部访问,外网无法直达
NodePort:把端口暴露在所有节点上,外网可通过 节点IP:端口 访问
LoadBalancer:云厂商专属,给 Service 分配一个独立公网 IP,外网直接访问
2. LoadBalancer(LoadBalancer 类型的 Service)它本身就是一种 Service,不是独立组件。
出现场景:公有云(阿里云 / 腾讯云 / 华为云等)K8s 集群。作用:
云厂商在集群外给你创建一个云负载均衡器,绑定公网 IP,流量直接打到这个 Service。优缺点:
✅ 简单、开箱即用
❌ 一个服务就要一个公网 IP,服务多了 IP 浪费、成本高;不支持域名 / 路径路由3. Ingress(统一网关,上层流量管家)Ingress 不是单纯的 IP / 端口,是一个七层路由网关(基于 Nginx/Traefik 实现)。组成两部分:
Ingress Controller:实际运行的 Pod + 一个 LoadBalancer/NodePort 类型 Service(Ingress 的流量入口)
Ingress 规则:配置文件,定义「域名 / 路径 → 转发到哪个内部 Service」
作用:
只用一个公网 IP,承载成千上万服务的外网流量
按域名、URL 路径分流:
shturl.cc → 转给 A 服务
shturl.cc → 转给 B 服务
shturl.cc/2 → 接口服务
shturl.cc/vuXI → 静态资源服务
额外能力:SSL 证书、限流、黑白名单、跨域等
定位:集群外网流量总入口,生产环境标准网关。
四、完整流转链路(两种场景)
场景 1:简单应用,直接用 LoadBalancer Service(小项目、测试)
流量路径:
用户外网 → 云厂商LB公网IP → LoadBalancer Service → 多个Pod
使用场景:单服务、临时测试、对外暴露单一应用。
实操案例 1:单体应用直接 LoadBalancer
需求:部署一个 Nginx,外网直接访问。
部署 Nginx Pod(多副本)
创建 LoadBalancer 类型 Service 关联 Pod
yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-lb-svc
spec:
type: LoadBalancer # 云厂商自动分配公网IP
selector:
app: nginx
ports:
- port: 80
targetPort: 80
云平台会分配一个公网 IP,浏览器直接访问 公网IP → 流量直达 Nginx Pod。
配合关系:
这里只有 Service (LoadBalancer) + Pod,不需要 Ingress。
缺点:再加一个应用,就要再买一个公网 IP。
场景 2:生产标准架构 Ingress + ClusterIP Service(企业主流)
完整流量链路(重中之重):
plaintext
外网用户
↓
公网IP(Ingress Controller 对应的 LoadBalancer)
↓
Ingress Controller(Nginx/Traefik 网关,按域名/路径路由)
↓
内部 Service(类型固定为 ClusterIP,集群内访问)
↓
业务 Pod
使用场景:微服务、多域名、多接口、正式线上环境。
实操案例 2:多服务共用一个 Ingress(最经典)
假设业务有 3 个服务:
前台网站:web
接口服务:api
后台管理:admin
步骤 1:部署 3 组业务 Pod + 3 个 ClusterIP Service(内部服务)
所有业务 Service 一律用 ClusterIP(不直接暴露外网)
yaml
# web 服务(内部访问)
apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
type: ClusterIP
selector:
app: web
ports:
- port: 80
targetPort: 80
# api 服务
apiVersion: v1
kind: Service
metadata:
name: api-svc
spec:
type: ClusterIP
selector:
app: api
ports:
- port: 80
targetPort: 80
# admin 服务
apiVersion: v1
kind: Service
metadata:
name: admin-svc
spec:
type: ClusterIP
selector:
app: admin
ports:
- port: 80
targetPort: 80
步骤 2:部署 Ingress Controller(自带 LoadBalancer Service)
云环境下安装 Ingress-Nginx 后,它自身会创建一个 LoadBalancer 类型 Service,拿到唯一公网 IP,这是整个集群的外网总入口。
步骤 3:编写 Ingress 路由规则(核心分流)
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: business-ingress
spec:
rules:
# 域名1:shturl.cc/K → 前台web服务
- host: shturl.cc/K
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-svc
port: number: 80
# 域名2:shturl.cc/h → 接口服务
- host: shturl.cc/h
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-svc
port: number: 80
# 路径路由:shturl.cc/K/admin → 后台服务
- host: shturl.cc/K
http:
paths:
- path: /admin
pathType: Prefix
backend:
service:
name: admin-svc
port: number: 80
最终访问效果 & 流量走向
shturl.cc/t1hw5Rs4
外网 IP → Ingress → web-svc(ClusterIP) → web Pod
http://shturl.cc/h
外网 IP → Ingress → api-svc(ClusterIP) → api Pod
shturl.cc/t1hw5Rs4/admin
外网 IP → Ingress → admin-svc(ClusterIP) → admin Pod
配合总结:
Ingress:对外唯一大门、做域名 / 路径路由
ClusterIP Service:对内统一入口、负载均衡到 Pod
全程只占用 1 个公网 IP,服务再多也不用额外加 IP。
五、什么时候该用哪个?(选型口诀)
纯集群内部互访 → 只用 ClusterIP Service
单服务、测试、简单对外 → 直接用 LoadBalancer 类型 Service(不用 Ingress)
多服务、微服务、线上生产、需要域名 / SSL / 路由 → Ingress + 内部 ClusterIP Service(标准方案)
物理机 / 自建 K8s(无云厂商 LB):Ingress 前端用 NodePort 暴露,不用 LoadBalancer
六、一句话极简总结
Service:K8s 内部流量底座,所有业务都离不开。
LoadBalancer:Service 的一种,给单个服务开独立外网门。
Ingress:全局外网网关,一个大门管所有服务,搭配内部 ClusterIP Service 是生产标配。
三者协作模式:外网先到入口 (Ingress/LB),再转给内部 Service,最后落到 Pod。