用 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,你的微服务架构才真正走向生产级!

相关推荐
七牛云行业应用2 小时前
DeepSeek Super-agent 与 Grok Bot:开源 Agent 架构和聊天助手有何区别
人工智能·ai·架构·ai编程
天远Date Lab3 小时前
零信任架构实战:基于天远租凭分期报告构建自动化汽车以租代购免押风控网关
网络·人工智能·架构·自动化
工业一体机老司机4 小时前
Docker部署工控机采集服务 Compose编排与开机自启
运维·docker·容器
DolitD6 小时前
UE像素流与云渲染技术方案对比分析
3d·云原生·ue5·云计算·图形渲染
深圳行云创新6 小时前
智能体架构之争:单Agent加Skills,还是多加几个Agent
人工智能·架构·软件工程
这个DBA有点耶6 小时前
内核级AI与多模融合:AI数据库在海外场景的落地要点
数据库·人工智能·架构
这个DBA有点耶8 小时前
云数据库半夜卡顿,CPU才30%?深挖云盘IOPS突发限制与内核挂起机制
数据库·mysql·云原生
FII工业富联科技服务8 小时前
工业智能体技术架构解析:六级部署、核心模块与制造场景实践
人工智能·架构·制造
miaobinfei10 小时前
docker拉取dify镜像,执行docker compose up -d 报错
运维·docker·容器