Kubernetes 中的 Ingress 详解:HTTP 负载均衡、TLS 与路径转发实践

在微服务架构盛行的今天,如何高效、安全地暴露服务,是每一个 Kubernetes 运维与开发人员都要面临的问题。Ingress 作为 K8s 原生提供的 HTTP(S) 路由机制,不仅能统一管理外部访问入口,还支持基于路径、域名的路由转发、TLS 加密等功能。本文将带你全面了解 Ingress 的工作原理、常见控制器、实践配置及注意事项。

一、什么是 Ingress?

Ingress 是一种 Kubernetes API 对象,用于管理集群外部对服务(Service)的 HTTP 和 HTTPS 访问。

与传统 NodePort、LoadBalancer 相比,Ingress 更像是一个七层的应用网关。它借助 Ingress Controller,实现对流量的灵活调度,例如:

  • 按域名路由(example.com vs api.example.com
  • 按路径路由(/api vs /admin)
  • TLS 终止
  • 支持自定义头部、重定向、中间件等功能(需依赖具体 Controller)

二、Ingress 的架构与工作机制

Ingress 本身只是资源定义,并不具备处理请求的能力。真正转发流量的是 Ingress Controller,它通常是一个运行在集群中的 Pod,比如:

控制器 说明
NGINX Ingress 最主流、社区支持广泛,适合绝大多数场景
Traefik 动态配置强、与微服务集成紧密,支持中间件功能
HAProxy Ingress 基于 HAProxy,性能出色
Istio Gateway 与服务网格场景结合,用于高级路由控制

基本流程如下:


三、Ingress 配置实战

1. 基本示例:基于路径的转发

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: example.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

说明:

请求 example.com/api/user 将被转发到 api-service。

使用 rewrite-target 重写路径,确保后端能正确解析。

pathType 支持 Prefix、Exact、ImplementationSpecific。


2. 添加 TLS 支持

yaml 复制代码
spec:
  tls:
  - hosts:
    - example.com
    secretName: example-com-tls

TLS 证书通常由 Cert-Manager 自动申请、续签,或手动创建 Secret:

bash 复制代码
kubectl create secret tls example-com-tls \
  --cert=cert.pem \
  --key=key.pem

使用 HTTPS 能有效提升安全性,特别是在处理用户数据或提供 API 接口时。


3. 多域名支持

yaml 复制代码
spec:
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: app-service
            port:
              number: 80
  - host: blog.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: blog-service
            port:
              number: 80

这种方式适合将多个服务部署在同一集群中,按域名隔离访问入口。


四、常用 Annotation 说明(以 NGINX 为例)

Annotation 作用
rewrite-target 重写路径
nginx.ingress.kubernetes.io/ssl-redirect 是否强制 HTTPS
nginx.ingress.kubernetes.io/backend-protocol 后端协议 HTTP/HTTPS
nginx.ingress.kubernetes.io/whitelist-source-range 限制来源 IP
nginx.ingress.kubernetes.io/configuration-snippet 插入 NGINX 配置片段

例如,限制某服务只能由特定 IP 段访问:

bash 复制代码
annotations:
  nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.0.0/24"

五、Ingress 背后的负载均衡逻辑

Ingress 通常与 Service 联合使用,其中:

  • Ingress 实现 7 层(L7)负载均衡,基于域名与路径;
  • Service 的类型为 ClusterIP,Ingress Controller 内部通过访问 Service 再转发到 Pod;
  • 控制器如 NGINX 可启用 keepalive、连接池、并发控制等优化项。

如果使用云厂商的 LoadBalancer,通常是四层(TCP),不支持 HTTP 层的路由逻辑。


六、实际生产中需要注意的点

✅ 推荐做法

  • 使用 Cert-Manager 自动管理 TLS 证书
  • 结合 ExternalDNS 实现域名与 Ingress 的自动绑定
  • 使用 PathType=Prefix 明确路径匹配规则
  • 配置 健康检查与重试 提升可用性

❌ 常见误区

  • 多个 Ingress 对同一域名配置不同路径,易导致冲突
  • 忽略 Annotation 生效范围(特定于 Controller)
  • 写错 path 正则或 rewrite 导致后端 404

七、总结与最佳实践

能力 NodePort LoadBalancer Ingress
路由能力 ✅ 支持基于域名、路径等规则
HTTP 负载均衡
TLS 支持
管理多个服务入口 ✅ 一处配置多个服务入口
易于扩展与控制 中等 高(可配合中间件、插件等)

Ingress 不仅是 Kubernetes 服务暴露的利器,更是打造安全、可维护微服务架构的核心组件。掌握好路径路由、TLS 配置和常见控制器的用法,能显著提升你的 K8s 实践水平。


推荐工具与资源

  • NGINX Ingress Controller 官方文档

  • Cert-Manager 官方文档

  • ExternalDNS 项目地址


如需深入理解 NGINX Ingress 的中间件链路、自定义限流策略或与服务网格的集成,欢迎关注本系列后续内容。

相关推荐
猿饵块3 分钟前
docker--安装--原理
运维·docker·容器
边译5 小时前
内核剖析- PID Namespace 生命周期
容器
吉吉615 小时前
docker的搭建
spring cloud·docker·容器
代码老y5 小时前
从单线程到云原生:Redis 二十年演进全景与内在机理深剖
数据库·redis·云原生
江湖有缘6 小时前
Docker实战:使用Docker部署IT工具箱Team·IDE
ide·docker·容器
sohoAPI6 小时前
Docker入门笔记
笔记·docker·容器
赶路人儿9 小时前
mac OS上docker安装zookeeper
docker·zookeeper·容器
bahdkdsq15 小时前
Docker——Redis
运维·docker·容器