K8s 之 ingress

Ingress ------它是 Kubernetes 集群统一的七层(HTTP/HTTPS)流量入口,专门解决 Service 暴露服务的痛点。

本节用最通俗的电商场景 ,带你吃透 Ingress 的核心作用增删改查(CRUD)全用法


一、先搞懂:Ingress 是干嘛的?(对比 Service 秒懂)

你已经会用 Service,先回忆它的短板:

  1. ClusterIP:只能集群内部访问,外网进不来;
  2. NodePort:给每个服务开一个节点端口(30000+),服务多了端口混乱、难管理;
  3. 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 规则:

  1. 路径路由(同一个域名,不同路径 → 不同服务)
  2. 域名路由(不同子域名 → 不同服务)

通用本地测试配置

本地测试需要把域名映射到 Ingress 入口IP:

  1. 查看 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也可以)。

  1. 修改本地hosts文件:

1. 增(Create):创建 Ingress 规则

示例1:路径路由(最常用)

需求

  • shop.com → 前端服务 web-svc
  • shop.com/order → 订单服务 order-svc
  • shop.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:入口IP
  • PORTS:端口(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 + 重新应用
  1. 编辑 ingress-path.yaml,比如新增 /pay 路径;
  2. 重新执行:
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 支持一键配置证书:

  1. 创建证书 Secret:
bash 复制代码
kubectl create secret tls shop-tls --cert=ssl.crt --key=ssl.key
  1. 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

总结

  1. Ingress 核心定位 :K8s 七层统一流量入口,解决 Service 多端口暴露的混乱问题;
  2. 核心依赖 :必须安装 Ingress Controller(Nginx 最常用);
  3. 核心能力 :基于域名/路径路由流量到 Service,支持 HTTPS、重写等;
  4. 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,看部署方式

  1. 生产正式环境(最常用):访问腾讯云负载均衡CLB分配的独立外网IP,不是这5台服务器任意一个原生IP
  2. 测试裸跑环境:只有运行了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都无效

最终最简结论

  1. 上线对外提供服务:用腾讯云CLB负载均衡IP访问Ingress(首选)
  2. 本地测试:查到Ingress Pod跑在哪台服务器,用那台服务器的公网IP访问
  3. 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创建时自动关联。

操作步骤

  1. 登录腾讯云容器服务TKE控制台,进入你的K8s集群
  2. 选择服务与路由 → Ingress → 新建
  3. 填写基本信息,设置路由规则(如路径/域名→后端Service)
  4. 无需额外配置CLB,保存后自动创建公网CLB并分配IP
  5. 等待几分钟,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、自定义安全组)的场景。

操作步骤

  1. 创建CLB实例

    • 登录腾讯云负载均衡CLB控制台 → 实例管理 → 新建
    • 选择:公网CLB、地域(与K8s集群一致)、网络(与集群同VPC)
    • 计费模式:按量计费(灵活)或包年包月(固定IP)
    • 点击购买,自动分配CLB公网IP
  2. Ingress绑定已有CLB

    • 在Ingress YAML中添加注解:

      yaml 复制代码
      metadata:
        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,而是绑定域名:

  1. 在域名服务商处添加A记录:demo.example.com → CLB IP
  2. Ingress规则中指定host: demo.example.com
  3. 访问时直接输入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

最终总结

  1. 自动创建最省心:TKE集群创建Ingress时自动生成CLB并分配IP,直接在Ingress详情页获取
  2. 手动创建更灵活:适合自定义CLB配置,通过注解绑定已有CLB
  3. 访问方式 :用CLB IP+端口(如http://123.123.123.1:80)或绑定域名访问
  4. 核心原则:CLB IP是Ingress的唯一对外入口,与5台服务器原生IP(1.1.1.1~5.5.5.5)无关
相关推荐
万里侯4 小时前
微服务与人生:从服务网格看人际关系
微服务·容器·k8s
疯狂成瘾者5 小时前
Kubernetes(简称K8s)
云原生·容器·kubernetes
ElevenS_it1885 小时前
K8s容器环境运维监控盲区:从Node到Pod到Service的可观测性分层实战
运维·容器·kubernetes
叶~小兮5 小时前
Kubernetes集群升级与证书更新 学习笔记
笔记·学习·kubernetes
自由且自律7 小时前
ceph实战,基于docker部署
运维·ceph·docker·容器·云计算
蜀道山老天师7 小时前
Docker Compose实战案例:一键部署WordPress+Prometheus监控平台
运维·docker·容器·prometheus
这个DBA有点耶7 小时前
2026下半年数据库趋势:多模、云原生、AI融合
数据库·人工智能·云原生
再战300年8 小时前
docker快速部署kafka集群
docker·容器·kafka
春天的菠菜8 小时前
【私服】一步部署 Docker 私服
java·docker·容器