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

相关推荐
Max_uuc2 小时前
【架构心法】跨越“脑”与“脊髓”的鸿沟:异构系统(ROS+RTOS)的通信边界与实时性剥离
架构
jcLee955 小时前
Stolon实现云原生环境下的PostgreSQL高可用架构概述
postgresql·云原生·架构
hrhcode9 小时前
【云原生】三.Kubernetes核心对象(上):Pod与Label详解
云原生·k8s
廋到被风吹走10 小时前
演进式架构深度解析:绞杀者模式与抽象分支模式
架构
yangyanping2010810 小时前
系统监控Prometheus之三自定义埋点上报
分布式·架构·prometheus
浣熊88812 小时前
天机学堂虚拟机静态ip无法使用(重启后ip:192.168.150.101无法使用连接Mobaxterm数据库等等,或者无法使用修改之后的Hosts域名去访问nacos,jenkins)
java·微服务·虚拟机·天机学堂·重启之后静态ip用不了
only_Klein14 小时前
Kubernetes发布策略之蓝绿发布与金丝雀发布
云原生·容器·kubernetes
sunny_15 小时前
前端构建产物里的 __esModule 是什么?一次讲清楚它的原理和作用
前端·架构·前端工程化
爱吃糖的小秦同学16 小时前
腾讯微云容量校准
容器