Ingress ------它是 Kubernetes 集群统一的七层(HTTP/HTTPS)流量入口,专门解决 Service 暴露服务的痛点。
本节用最通俗的电商场景 ,带你吃透 Ingress 的核心作用 、增删改查(CRUD)全用法。
一、先搞懂:Ingress 是干嘛的?(对比 Service 秒懂)
你已经会用 Service,先回忆它的短板:
- ClusterIP:只能集群内部访问,外网进不来;
- NodePort:给每个服务开一个节点端口(30000+),服务多了端口混乱、难管理;
- LoadBalancer:需要云厂商负载均衡,成本高,多服务要多个实例。
Ingress 核心作用
Ingress = 集群的统一大门
- 只需要一个公网入口,就能代理集群内所有 HTTP/HTTPS 服务;
- 基于域名、URL路径,把流量自动转发到对应的 Service;
- 支持 HTTPS 证书、路径重写、负载均衡、访问控制等高级功能;
- 无需给每个服务开端口,统一管理、干净简洁。
通俗比喻
- Service = 小区里的单元门(内部服务,只能内部访问);
- Ingress = 小区的正门(唯一外网入口);
- 外网用户不用找每个单元门,走正门 → 正门根据地址(域名/路径)→ 引导到对应单元(Service)。
二、前置必备:安装 Ingress Controller
关键知识点:
Ingress 只是「流量规则」,Ingress Controller 才是真正执行规则的组件(比如 Nginx-Ingress),没有它,Ingress 规则完全不生效!
我们用最常用的 Nginx Ingress Controller,一键安装:
bash
# 官方一键部署(适用于标准K8s集群,Docker Desktop/Minikube也兼容)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
验证安装成功:
bash
# 查看命名空间 ingress-nginx 下的Pod,状态为Running 即成功
kubectl get pods -n ingress-nginx
安装 ingress-nginx 时,这个命名空间 ingress-nginx 是 自动创建 的
完全不需要手动敲 kubectl create namespace ingress-nginx 这种命令
三、准备测试环境:电商3个服务
我们模拟一个电商项目 ,创建3个基础服务(前端Web、订单服务、用户服务),以及对应的 ClusterIP Service(Ingress 只需要 ClusterIP,无需 NodePort)。
直接复制以下代码,创建 Deployment + Service:
yaml
# 文件名:shop-services.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deploy # 前端服务
spec:
replicas: 1
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
selector:
app: web
ports:
- port: 80
type: ClusterIP # 仅内部访问
---
# 订单服务
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-deploy
spec:
replicas: 1
selector:
matchLabels:
app: order
template:
metadata:
labels:
app: order
spec:
containers:
- name: order
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: order-svc
spec:
selector:
app: order
ports:
- port: 80
type: ClusterIP
---
# 用户服务
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-deploy
spec:
replicas: 1
selector:
matchLabels:
app: user
template:
metadata:
labels:
app: user
spec:
containers:
- name: user
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: user-svc
spec:
selector:
app: user
ports:
- port: 80
type: ClusterIP
执行创建:
bash
kubectl apply -f shop-services.yaml
验证服务:
bash
kubectl get svc # 能看到3个ClusterIP服务
四、Ingress 增删改查(CRUD)实战
我们用电商场景做两个最常用的 Ingress 规则:
- 路径路由(同一个域名,不同路径 → 不同服务)
- 域名路由(不同子域名 → 不同服务)
通用本地测试配置
本地测试需要把域名映射到 Ingress 入口IP:
- 查看 Ingress 入口IP:
bash
kubectl get svc -n ingress-nginx ingress-nginx-controller
| 命令片段 | 含义 | 类型 |
|---|---|---|
| kubectl get svc | 查询 Service 资源 | 固定指令 |
| -n ingress-nginx | 指定在哪个命名空间里查 | 命名空间 |
| ingress-nginx-controller | 只查叫这个名字的那一个 Service | Service 名称 |
ingress-nginx-controller = 公网入口 Service, 安装 Nginx Ingress 时 和 命名空间 ingress-nginx 一样 都是 自动创建,不用管。
记录 EXTERNAL-IP(本地集群如果是<pending>,用节点IP也可以)。
- 修改本地hosts文件:
-
Windows:
C:\Windows\System32\drivers\etc\hosts -
Mac/Linux:
/etc/hosts
添加一行:192.168.x.x shop.com web.shop.com order.shop.com user.shop.com
1. 增(Create):创建 Ingress 规则
示例1:路径路由(最常用)
需求:
shop.com→ 前端服务web-svcshop.com/order→ 订单服务order-svcshop.com/user→ 用户服务user-svc
创建 Ingress YAML:
yaml
# 文件名:ingress-path.yaml
apiVersion: networking.k8s.io/v1 # K8s 1.19+ 标准版本(必须用这个)
kind: Ingress
metadata:
name: shop-ingress-path # Ingress名称
annotations:
# 声明使用 Nginx Ingress Controller
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: shop.com # 统一域名
http:
paths:
# 根路径 → 前端服务
- path: /
pathType: Prefix # 前缀匹配
backend:
service:
name: web-svc # 目标Service名称
port:
number: 80
# /order 路径 → 订单服务
- path: /order
pathType: Prefix
backend:
service:
name: order-svc
port:
number: 80
# /user 路径 → 用户服务
- path: /user
pathType: Prefix
backend:
service:
name: user-svc
port:
number: 80
为什么上面 apiVersion 是 networking.k8s.io/v1 而别的资源的创建就是 v1 ?
Ingress 属于网络扩展功能 ,所以必须带
分组前缀!而能使 apiVersion: v1 都是 K8s 核心基础资源(天生就有、最底层)
Ingress 不是 K8s 天生就有的,是后来为了解决「外网统一入口」加的功能。它专门管 HTTP/HTTPS 网络路由,所以归到 networking(网络)分组,K8s 1.19+ 之后,Ingress 正式稳定版固定为:networking.k8s.io/v1。
执行创建命令:
bash
kubectl apply -f ingress-path.yaml
示例2:域名路由(子域名区分服务)
需求:
web.shop.com→ 前端order.shop.com→ 订单user.shop.com→ 用户
yaml
# 文件名:ingress-host.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: shop-ingress-host
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: web.shop.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-svc
port:
number: 80
- host: order.shop.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: order-svc
port:
number: 80
- host: user.shop.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: user-svc
port:
number: 80
2. 查(Read):查看 Ingress 信息
① 基础查看(列表)
bash
kubectl get ingress
# 简写:kubectl get ing
输出字段解释:
NAME:Ingress 名称CLASS:使用的 Controller(nginx)HOSTS:绑定的域名ADDRESS:入口IPPORTS:端口(80/443)
② 详细查看(规则、事件)
bash
kubectl describe ing shop-ingress-path
可以看到:完整路由规则、关联的 Service、运行状态、报错信息(排错神器)。
③ 测试访问
bash
# 测试路径路由
curl shop.com
curl shop.com/order
curl shop.com/user
# 测试域名路由
curl web.shop.com
curl order.shop.com
3. 改(Update):修改 Ingress 规则
两种修改方式,推荐用 YAML 重新 apply(可追溯、规范)。
方式1:修改YAML + 重新应用
- 编辑
ingress-path.yaml,比如新增/pay路径; - 重新执行:
bash
kubectl apply -f ingress-path.yaml
K8s 会自动增量更新,无需删除重建。
方式2:命令行直接编辑(临时修改)
bash
kubectl edit ing shop-ingress-path
会打开编辑器,直接修改配置,保存后自动生效。
4. 删(Delete):删除 Ingress 规则
方式1:按YAML文件删除
bash
kubectl delete -f ingress-path.yaml
方式2:按名称删除
bash
# 删除单个Ingress
kubectl delete ing shop-ingress-path
# 删除所有Ingress
kubectl delete ing --all
五、进阶:Ingress 配置 HTTPS(加密访问)
生产环境必须用 HTTPS,Ingress 支持一键配置证书:
- 创建证书 Secret:
bash
kubectl create secret tls shop-tls --cert=ssl.crt --key=ssl.key
- Ingress 开启 HTTPS:
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: shop-ingress-ssl
spec:
tls:
- hosts:
- shop.com
secretName: shop-tls # 绑定证书
rules:
- host: shop.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-svc
port:
number: 80
六、核心命令总结(速记)
| 操作 | 命令 |
|---|---|
| 创建Ingress | kubectl apply -f xxx.yaml |
| 查看所有Ingress | kubectl get ing |
| 查看Ingress详情 | kubectl describe ing <名称> |
| 修改Ingress | kubectl apply -f xxx.yaml / kubectl edit ing <名称> |
| 删除Ingress | kubectl delete ing <名称> / kubectl delete -f xxx.yaml |
总结
- Ingress 核心定位 :K8s 七层统一流量入口,解决 Service 多端口暴露的混乱问题;
- 核心依赖 :必须安装 Ingress Controller(Nginx 最常用);
- 核心能力 :基于域名/路径路由流量到 Service,支持 HTTPS、重写等;
- CRUD 极简 :用 YAML 定义规则,
apply创建/更新,get/describe查看,delete删除。
Service + Ingress,这就是 K8s 暴露服务的标准最佳实践!
七、例子:入口 IP
5 台服务器对应的 IP 地址分别是 1.1.1.1、2.2.2.2、3.3.3.3、4.4.4.4、5.5.5.5, 共同构成的 k8s集群,使用 ingress 统一管理 其中的 service , 那么通过那个 ip 能访问到 ingress。
直白答案
5台机器IP:1.1.1.1~5.5.5.5
没有固定某一个IP一定能访问Ingress,看部署方式
- 生产正式环境(最常用):访问腾讯云负载均衡CLB分配的独立外网IP,不是这5台服务器任意一个原生IP
- 测试裸跑环境:只有运行了Ingress组件的那几台节点IP才能访问,没跑Ingress的节点IP打不开
通俗生活化例子
把整个集群比作一座5层商场
- 5个IP = 商场1楼、2楼、3楼、4楼、5楼(1.1.1.1=1楼,2.2.2.2=2楼...)
- K8s里各种Service = 商场里奶茶店、服装店、餐饮店
- Ingress = 商场唯一正门入口,所有人进商场买东西,必须先走正门
情况1:商场修了【统一室外大门】(线上正式业务)
商场不在楼层里开门,单独在路边修了一个独立大门口(腾讯云CLB独立IP)
- 顾客只找这个路边大门地址就能进商场
- 不用管1-5楼在哪,大门自动把人分流到商场任意楼层
- 对应操作:访问CLB负载均衡IP,和1.1.1.1~5.5.5.5无关
情况2:商场没修室外大门,正门只开在部分楼层(测试自用)
商场正门(Ingress)只设在1楼、3楼,2/4/5楼没有入口
- 顾客只能走1楼(1.1.1.1)、3楼(3.3.3.3) 进门逛店
- 直接去2楼、4楼、5楼找不到入口,进不去
- 对应:只有Ingress运行所在节点IP能访问
情况3:强制正门只开1楼(固定入口)
老板规定:商场正门只允许开在1楼,其他楼层一律不准设入口
- 所有人只能访问 1.1.1.1 才能进入Ingress,访问其余4个IP都无效
最终最简结论
- 上线对外提供服务:用腾讯云CLB负载均衡IP访问Ingress(首选)
- 本地测试:查到Ingress Pod跑在哪台服务器,用那台服务器的公网IP访问
- 5个服务器原生IP不全能通,只通部署了Ingress的节点
八、腾讯云CLB负载均衡IP,结合上例
核心结论 :CLB IP有两种获取方式------自动创建 (推荐,TKE集群创建Ingress时自动生成)和手动创建 (自定义需求)。获取后可在CLB控制台 或TKE Ingress详情页查看,访问Ingress时直接用这个IP+端口或绑定域名访问。
一、通俗理解:CLB IP就像商场的"统一对外大门"
延续之前的商场比喻:
- 5台服务器(1.1.1.1~5.5.5.5)= 商场5个楼层
- Ingress = 商场内部总服务台(负责分流顾客)
- CLB IP = 商场唯一对外大门地址(顾客只认这个地址,不用管内部楼层)
- 顾客(用户)→ 大门(CLB IP)→ 服务台(Ingress)→ 各楼层店铺(Service)
二、两种设置方式(自动 vs 手动)
方式1:自动创建(推荐,TKE集群默认)
适合快速上线,无需手动操作CLB,Ingress创建时自动关联。
操作步骤:
- 登录腾讯云容器服务TKE控制台,进入你的K8s集群
- 选择服务与路由 → Ingress → 新建
- 填写基本信息,设置路由规则(如路径/域名→后端Service)
- 无需额外配置CLB,保存后自动创建公网CLB并分配IP
- 等待几分钟,CLB自动配置完成,Ingress状态变为"正常"
YAML示例(自动创建CLB):
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: "qcloud" # 关键:使用腾讯云CLB Ingress控制器
spec:
rules:
- host: demo.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
方式2:手动创建(自定义CLB配置)
适合需要特定CLB参数(如包年包月、固定IP、自定义安全组)的场景。
操作步骤:
-
创建CLB实例
- 登录腾讯云负载均衡CLB控制台 → 实例管理 → 新建
- 选择:公网CLB、地域(与K8s集群一致)、网络(与集群同VPC)
- 计费模式:按量计费(灵活)或包年包月(固定IP)
- 点击购买,自动分配CLB公网IP
-
Ingress绑定已有CLB
-
在Ingress YAML中添加注解:
yamlmetadata: annotations: kubernetes.io/ingress.existLbId: "lb-xxxxxxxx" # 你的CLB实例ID kubernetes.io/ingress.class: "qcloud" -
或在TKE控制台创建Ingress时,选择"使用已有CLB"并选择你的实例
-
三、如何获取CLB IP(3种途径)
| 获取途径 | 操作步骤 | 适用场景 |
|---|---|---|
| TKE Ingress详情页 | 1. TKE集群 → 服务与路由 → Ingress 2. 点击目标Ingress → 基本信息 3. 查看"负载均衡器"栏的IP地址 | 快速查看自动创建的CLB |
| CLB控制台 | 1. 负载均衡 → 实例管理 2. 找到对应CLB实例 → 查看"公网IP"列 | 所有CLB实例统一管理 |
| kubectl命令行 | 执行:kubectl get ingress my-ingress -o wide 输出中"ADDRESS"字段即为CLB IP |
习惯命令行操作的用户 |
示例(命令行输出):
NAME CLASS HOSTS ADDRESS PORTS AGE
my-ingress <none> demo.example.com 123.123.123.1 80 10m
→ 123.123.123.1 就是你的CLB访问IP
四、关键配置与注意事项
1. 端口与协议设置
- CLB默认监听80端口(HTTP) 和443端口(HTTPS)
- 如需自定义端口,需在CLB控制台配置监听器,或通过TkeServiceConfig注解设置
2. 安全组配置(必做)
确保CLB安全组开放所需端口(如80/443),否则无法访问:
- 登录CLB控制台 → 实例管理 → 安全组 → 编辑规则
- 入站规则添加:TCP 80/443 允许所有IP访问(0.0.0.0/0)
3. 域名绑定(推荐)
访问时不直接用IP,而是绑定域名:
- 在域名服务商处添加A记录:
demo.example.com → CLB IP - Ingress规则中指定
host: demo.example.com - 访问时直接输入
http://demo.example.com,无需带端口
4. 内网CLB场景(可选)
如需仅集群内部访问Ingress,可创建内网CLB:
- 注解添加:
service.kubernetes.io/qcloud-loadbalancer-type: "internal" - 只能通过集群内其他Pod或同VPC服务器访问,无公网IP
五、快速故障排查
| 问题 | 排查步骤 |
|---|---|
| CLB IP无法访问 | 1. 检查CLB安全组是否开放端口 2. 确认Ingress状态正常(kubectl get ingress) 3. 查看CLB监听器是否正常(CLB控制台 → 监听器管理) 4. 检查后端服务是否健康(CLB控制台 → 后端服务) |
| 找不到CLB IP | 1. 确认Ingress已创建并关联CLB 2. 检查集群是否安装了qcloud-ingress-controller 3. 查看TKE事件日志(kubectl describe ingress my-ingress) |
最终总结
- 自动创建最省心:TKE集群创建Ingress时自动生成CLB并分配IP,直接在Ingress详情页获取
- 手动创建更灵活:适合自定义CLB配置,通过注解绑定已有CLB
- 访问方式 :用CLB IP+端口(如
http://123.123.123.1:80)或绑定域名访问 - 核心原则:CLB IP是Ingress的唯一对外入口,与5台服务器原生IP(1.1.1.1~5.5.5.5)无关