Kubernetes Ingress 解析 — 路由、TLS 与真实案例

发布: (2025年12月26日 GMT+8 11:47)
6 min read
原文: Dev.to

Source: Dev.to

Ingress 是您集群的智能 HTTP 入口点。它将流量路由与 Service 暴露分离,并让您能够集中管理 TLS。

为什么 Ingress 很重要

问题未使用 Ingress 时会发生什么
服务暴露每个 Service 都需要自己的 NodePortLoadBalancer
成本100 个 Service → 100 个 LoadBalancer → 100 个公网 IP → 100 条独立计费项。
路由逻辑在 Kubernetes 之外处理(外部负载均衡、手动 DNS)。Kubernetes 对此没有可见性或控制。
TLS 管理每个 Service 都需要自己的证书 → 续订、轮换和配置变得容易出错。

Ingress 通过提供单一的第 7 层(HTTP/HTTPS)入口点来解决上述所有问题,它可以:

  • 主机 和/或 路径 路由流量
  • 集中终止 TLS(HTTPS)
  • 将流量转发到相应的 Service

⚠️ Ingress 只是一个声明式资源。它需要一个 Ingress Controller(NGINX、Traefik、HAProxy、云特定控制器等)来实际处理流量。

Ingress 工作原理(示意图)

Client (Browser)

Ingress Controller (NGINX / Traefik / …)

Ingress Rules (host / path / TLS)

Service (stable endpoint)

Pods (managed by Deployment)

Source:

Ingress 基础 – YAML 示例

1️⃣ 简单的基于 Host 的 Ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
spec:
  rules:
    - host: app.sharon.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: app-service
                port:
                  number: 80

功能说明

  • 接收 app.sharon.com 的流量
  • 将所有请求路由到 Service app-service
  • Service 将流量负载均衡到其 Pods

2️⃣ 基于路径的路由(多个 Service)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: multi-app-ingress
spec:
  rules:
    - host: sharon.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: api-service
                port:
                  number: 80
          - path: /web
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80

路由行为

请求Service
sharon.com/apiapi-service
sharon.com/webweb-service

3️⃣ 基于 Host 的路由(多个域名)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: host-ingress
spec:
  rules:
    - host: api.sharon.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: api-service
                port:
                  number: 80
    - host: web.sharon.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80

路由行为

主机名Service
api.sharon.comapi-service
web.sharon.comweb-service

4️⃣ 使用 Secret 的 TLS 终止

创建 TLS Secret(每个域名一次):

kubectl create secret tls app-tls \
  --cert=cert.pem \
  --key=key.pem

使用该 Secret 的 Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tls-ingress
spec:
  tls:
    - hosts:
        - app.sharon.com
      secretName: app-tls
  rules:
    - host: app.sharon.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: app-service
                port:
                  number: 80

功能说明

  • 在 Ingress Controller 处终止 HTTPS
  • 集群内部流量仍为 HTTP(无需在 Pod 中配置 TLS)
  • 证书统一管理,而不是每个 Service 单独管理

Ingress 与 LoadBalancer(功能比较)

特性IngressLoadBalancer
OSI 层L7(HTTP/HTTPS)L4(TCP/UDP)
路由基于主机和路径无(单一 Service)
TLS是(集中式 secret)受限(每个 LB)
成本低 – 单个外部负载均衡器高 – 每个 Service 一个 LB
可扩展性高(多个 Service 共享一个入口)受限(每个 Service 一个 LB)
典型用例HTTP/HTTPS 应用非 HTTP 工作负载或简单暴露

常见陷阱(不要做的事)

  • 在没有 Ingress 控制器的情况下创建 Ingress – 该资源永远不会激活。
  • 为每个 Service 使用 LoadBalancer – 会导致不必要的成本和复杂性。
  • 忘记 DNS 配置 – Ingress 规则中的主机名必须解析到 Ingress 控制器的外部 IP。
  • 混合 Service 暴露和路由逻辑 – 将 Service 类型(ClusterIP)与 Ingress 路由分开。
  • 为每个 Service 单独管理 TLS – 这违背了集中式 TLS 终止的目的。

何时使用 Ingress

当您满足以下情况时使用 Ingress:

  • 运行 HTTP/HTTPS 应用程序。
  • 需要 按域名或路径进行路由(多租户或微服务架构)。
  • 想要 集中管理 TLS(每个域名一个 secret)。
  • 想要 通过共享单个外部 IP 来降低云负载均衡器成本

端到端流程(完整视图)

Internet
   |
   v
DNS(域名 → Ingress Controller 的外部 IP)
   |
   v
Ingress Controller(NGINX / Traefik / …)
   |
   v
Ingress Rules(主机 / 路径 / TLS)
   |
   v
Service(ClusterIP – 稳定端点)
   |
   v
Pods(由 Deployment / ReplicaSet 管理)

健康 Ingress 设置快速检查清单

  1. 部署 Ingress 控制器(NGINX、Traefik、HAProxy、云厂商专用等)。
  2. 创建 DNS 记录,将你的域名指向控制器的外部 IP。
  3. 定义 Ingress 资源,并写好所需的 host/path 规则。
  4. 创建 TLS secret(如果需要 HTTPS),并在 Ingress 规范中引用它们。
  5. 将 Service 类型设为 ClusterIP(不需要对外暴露)。
  6. 验证 流量是否通过 curl/浏览器到达正确的 Pod,以及 TLS 终止是否正常(openssl s_client -connect …)。

TL;DR

  • Ingress = 为多个 Service 提供单一、智能的 HTTP 入口点。
  • Ingress Controller = 使 Ingress 规则生效的引擎。
  • 优势: 成本低、路由集中、TLS 管理统一。

祝你集群愉快! 🚀

每个 Service 都需要自己的 TLS 证书。

证书必须进行续期、轮换,并针对每个 Service 进行配置。

为数十个 Service 管理 HTTPS 容易出错且难以扩展。

在生产环境中 Ingress 并非可选——它是 Kubernetes 中 HTTP 流量的控制平面。

Back to Blog

相关文章

阅读更多 »

我对 Kubernetes 的看法

文章 URL: https://garnaudov.com/writings/how-i-think-about-kubernetes/ 评论 URL: https://news.ycombinator.com/item?id=46396043 点赞数: 31 评论数: 13