用 Ingress 统一管理多个微服务的入口

概述

你已经用 Kubernetes 部署了各种服务......

每个服务都配了一个 LoadBalancer 类型的 Service,结果:

  • AWS 账单暴涨(每个 LoadBalancer 都要钱)
  • 每个服务一个公网 IP,难以管理
  • 想加 HTTPS、路径路由?得一个个配置

如何使用 Ingress 来解决这些问题

为什么 LoadBalancer 不够用

假设你有 3 个微服务:

服务 域名 端口
用户服务 user.example.com 80
订单服务 order.example.com 80
商品服务 product.example.com 80

如果用 LoadBalancer

  • 你需要 3 个公网 IP
  • 支付 3 份负载均衡费用
  • 每个都要单独配置 TLS 证书

那么面临的问题有 成本高、运维复杂、不环保

如何只用 1 个公网 IP ,通过 域名或路径 自动路由到不同服务,这就是 Ingress 的核心价值。

什么是 Ingress

Ingress 是 Kubernetes 的一种 API 对象,用于:

  • 将外部 HTTP/HTTPS 流量路由到集群内的 Services
  • 支持基于 域名 (Host)或 路径(Path)的规则
  • 集中管理 TLS 证书、重定向、限流等

但注意:Ingress 本身只是一个"配置清单" ,真正干活的是 Ingress Controller(如 Nginx、Traefik)。

  • Ingress = 路线规划图("user.example.com → 用户服务")
  • Ingress Controller = 路由器

Ingress 的三大优势

能力 说明
统一入口 一个公网 IP 服务所有应用
基于域名/路径路由 user.example.com → 用户服务,/api/order → 订单服务
集中 TLS 管理 一张证书搞定所有子域名(通配符证书)

主流 Ingress Controller 对比

Controller 特点 适合场景
Nginx Ingress 官方维护,功能全,文档丰富 通用首选
Traefik 自动发现服务,UI 友好,支持 Let's Encrypt 快速上手、DevOps
Istio Gateway 服务网格集成,高级流量控制 已使用 Istio 的团队

新手推荐:Nginx Ingress(社区最成熟)

最佳实践:在 Minikube 上部署 Ingress

我们将:

  1. 启用 Minikube 的 Ingress 插件
  2. 部署两个微服务(用户 + 订单)
  3. 创建 Ingress 规则,通过不同路径访问它们

Step 1:启动 Minikube 并启用 Ingress

bash 复制代码
minikube start --driver=docker
minikube addons enable ingress

验证控制器是否运行:

bash 复制代码
kubectl get pods -n ingress-nginx

看到 ingress-nginx-controller-xxx 处于 Running 状态即可。

Kind 用户需手动安装 Nginx Ingress,安装方式如下:

bash 复制代码
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml

等待几分钟,直到 Pod 就绪:

bash 复制代码
kubectl wait --namespace ingress-nginx \
  --for=condition=ready pod \
  --selector=app.kubernetes.io/component=controller \
  --timeout=90s

然后通过端口转发访问:

bash 复制代码
kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller 8080:80

访问:http://localhost:808/prefix

Step 2:部署两个微服务

用户服务(user-service)

yaml 复制代码
# user-deploy.yaml
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-app
        image: nginx:alpine
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: user-svc
spec:
  selector:
    app: user
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

订单服务(order-service)

yaml 复制代码
# order-deploy.yaml
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-app
        image: nginx:alpine
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: order-svc
spec:
  selector:
    app: order
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

应用:

bash 复制代码
kubectl apply -f user-deploy.yaml
kubectl apply -f order-deploy.yaml

Step 3:创建 Ingress 规则

yaml 复制代码
# ingress-rule.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - http:
      paths:
      - path: /user
        pathType: Prefix
        backend:
          service:
            name: user-svc
            port:
              number: 80
      - path: /order
        pathType: Prefix
        backend:
          service:
            name: order-svc
            port:
              number: 80

📝 说明:

  • 访问 /user → 转发到 user-svc
  • 访问 /order → 转发到 order-svc

应用规则:

bash 复制代码
kubectl apply -f ingress-rule.yaml

Step 4:获取访问地址

bash 复制代码
minikube ip
# 输出如:192.168.49.2

现在,打开浏览器或终端:

bash 复制代码
curl http://192.168.49.2/user
curl http://192.168.49.2/order

你会看到两个不同的 Nginx 欢迎页!
同一个 IP,不同路径,访问不同服务!

Ingress vs Service

场景 推荐方案
微服务之间调用 ✅ ClusterIP Service
本地开发临时暴露 ✅ NodePort
单个公网服务(简单) ⚠️ LoadBalancer(小项目可用)
多个 HTTP 服务统一入口 Ingress
非 HTTP 流量(如 gRPC、TCP) ❌ Ingress 不支持 → 用 LoadBalancer 或 Service Mesh

Ingress 只支持 HTTP/HTTPS!其他协议需另寻方案。

常见问题

Q:Ingress 能加 HTTPS 吗?

当然!只需在 Ingress 中添加 tls 配置,并提供 Secret:

yaml 复制代码
spec:
  tls:
  - hosts:
    - user.example.com
    secretName: my-tls-secret
  rules:
  - host: user.example.com
    ...

Q:Ingress Controller 占用资源多吗?

  • Nginx Ingress:约 100~200MB 内存,轻量级
  • 一个 Controller 可服务成百上千个 Ingress 规则

Q:能做灰度发布吗?

高级 Ingress Controller(如 Nginx Plus、Istio)支持权重路由、Header 匹配等。

总结

方案 成本 管理难度 适用规模
多个 LoadBalancer 小项目
Ingress 低(1 个 LB) 中小到大型项目

有了 Ingress,你的微服务架构才真正走向生产级!

相关推荐
程序消消乐几秒前
第一章:Claude Code 记忆系统——架构总览与四种记忆类型
大数据·架构·agent·claude code
阿里云云原生2 分钟前
企业数据如何被 AI Agent 调用?EventHouse 打造 AI-Ready 数据底座
云原生
Agent产品评测局8 分钟前
企业预算管理自动化落地,编制管控全流程实现方案 —— 2026企业级智能体选型与架构深度解析
运维·人工智能·ai·架构·自动化
LONGZETECH35 分钟前
汽车故障诊断仿真教学软件【风光580】:技术架构、功能实现与落地实践
架构·汽车·汽车仿真教学软件·汽车教学软件
斯普信云原生组37 分钟前
Docker 开源软件应急处理方案及操作手册——容器运行异常处理
docker·容器·eureka
Ulyanov39 分钟前
从零构建现代化Python音频播放器:ttk深度应用与皮肤系统设计
python·架构·音视频·数据可视化
C'ᴇsᴛ.小琳 ℡42 分钟前
架构重构的技术
重构·架构
摆烂z1 小时前
对外访问网络限制*.aliyuncs.com开放也拉不下来和查看docker容器结构
运维·docker·容器
斯普信云原生组2 小时前
Docker 开源软件应急处理方案及操作手册——资源限制与性能瓶颈
docker·容器·eureka
嵌入式老牛2 小时前
SST专题3-1 基于光分路器的MMC分布式控制系统架构
分布式·架构·驱动·光纤·sst