Kubernetes ingress:NGINX Ingress与annotations

七月
七月
发布时间:2026-09-10| 7人浏览过
原创

理解 Ingress、IngressClass 与 NGINX Ingress Controller

Ingress 资源本质上是 Kubernetes 集群对外暴露 HTTP/HTTPS 服务的声明式路由规则集合,它本身并不具备网络转发能力。真正监听流量、解析规则并执行反向代理的是 Ingress Controller(如 NGINX Ingress Controller)。在路由模型中,host 定义域名匹配,path 与 pathType(如 Prefix 或 Exact)决定 URI 匹配策略,backend 指向具体的 Service,而 tls 负责证书卸载。现代 Kubernetes 强烈推荐使用 spec.ingressClassName 字段将 Ingress 与特定的控制器绑定,例如 ingressClassName: nginx。这与早期通过 metadata.annotations 添加 kubernetes.io/ingress.class: nginx 的做法有本质区别:前者是原生 API 字段,具备明确的控制器发现机制与生命周期管理;后者仅为注解,已被官方标记为废弃。明确这一边界,是避免多控制器冲突、保证路由精准投递的第一步。

展示 Kubernetes 外部请求经 NGINX Ingress Controller 按 Host/Path 路由到不同 Service/Pod 的真实架构或控制台截图
NGINX Ingress Controller 接收外部请求,并依据 Ingress/Host 将流量转发到不同应用 Pod。

编写一个可用的 NGINX Ingress:从 YAML 到路由

一个符合 networking.k8s.io/v1 规范的 NGINX Ingress YAML 需包含核心路由要素。示例如下:apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

name: web-ingress

namespace: default

spec:

ingressClassName: nginx

tls:

- hosts: ["app.example.com"]

secretName: app-tls-secret

rules:

- host: app.example.com

http:

paths:

- path: /api

pathType: Prefix

backend:

service:

name: api-svc

port:

number: 80

- path: /

pathType: Prefix

backend:

service:

name: web-svc

port:

number: 8080

该配置中,ingressClassName 指定由 NGINX 控制器处理;tls 声明 HTTPS 终止及证书引用;rules 按域名划分路由;path 配合 pathType: Prefix 实现 /api 前缀匹配,未匹配的 / 请求将转发至 web-svc。backend 明确指定目标 Service 名称与端口号,控制器会据此解析 Endpoints 并生成对应的 upstream 配置。字段间的层级关系直接决定了请求的匹配优先级与转发目标。

展示真实 Kubernetes YAML 配置文件或 kubectl 编辑/查看 Ingress 的终端截图
真实 Ingress YAML 示例,展示 host、path、backend Service 以及 NGINX Ingress 配置。

掌握 annotations:用 NGINX 注解改变请求行为

Annotations 是附加在 Ingress 元数据中的键值对,NGINX Ingress Controller 会扫描特定前缀(如 nginx.ingress.kubernetes.io/)的注解,并将其转换为底层 NGINX 配置指令。这些注解本质上是字符串,其具体语义完全依赖控制器的实现版本。常见场景包括:使用 nginx.ingress.kubernetes.io/rewrite-target: /$2 配合正则路径实现 URL 重写;通过 nginx.ingress.kubernetes.io/permanent-redirect 执行 301 跳转;利用 nginx.ingress.kubernetes.io/proxy-body-size: 50m 放宽上传限制;或通过 nginx.ingress.kubernetes.io/proxy-read-timeout: 60 调整超时阈值。需注意,注解并非 Kubernetes 标准 API 的一部分,不同控制器对同一注解的解析逻辑可能截然不同。在实际编写时,应严格对照 NGINX Ingress 官方文档的注解列表,避免拼写错误或传入非预期格式的值,否则控制器将忽略该配置或记录解析警告。

验证路由并排查常见问题

路由生效需建立完整的验证链路。首先执行 kubectl get ingressclass 确认控制器存在且状态正常;接着 kubectl get ingress 查看 ADDRESS 列是否已分配外部 IP 或主机名。若地址为空,通常意味着控制器未就绪或未正确匹配 ingressClassName。随后检查 kubectl get svc -n ingress-nginx 及对应 Pod 日志,确认无启动报错。使用 curl -H "Host: app.example.com" http://<INGRESS_IP>/api 模拟请求,观察返回状态码。若返回 404,需核对 pathType 与 Service 的 Endpoints 是否就绪;若 Service 端口与 backend.port.number 不一致,将导致 502 或连接拒绝。对于注解不生效的情况,可通过 kubectl describe ingress 查看 Events 中的警告信息,或检查控制器日志中是否出现 ignoring annotation 提示。HTTPS 验证需确保 tls.secretName 引用的 Secret 包含合法的 tls.crt 与 tls.key,且域名与证书 SAN 匹配。

annotations 使用边界与迁移避坑

Annotations 虽灵活,但存在显著的控制器绑定风险。将 NGINX 专有注解视为 Kubernetes 通用能力会导致迁移成本剧增。例如,旧版 kubernetes.io/ingress.class 注解在多控制器共存时易引发路由抢占;部分正则匹配注解(如 use-regex: true)会全局影响同一 Ingress 下的所有路径,可能引发性能损耗或意外匹配。此外,Kubernetes 社区已明确冻结 Ingress API 的演进,且 NGINX Ingress Controller 项目已宣布于 2026 年进入退役维护阶段。这意味着后续将不再提供核心功能更新与安全补丁。对于新建项目或架构升级,强烈建议同步评估 Kubernetes Gateway API。Gateway API 采用更清晰的资源分层模型(Gateway、HTTPRoute、ReferenceGrant),原生支持多租户、细粒度策略与跨命名空间路由,且已成为 CNCF 标准。在过渡期,应逐步剥离对 NGINX 特定注解的强依赖,优先使用标准 Ingress 字段或转向支持 Gateway API 的控制器,以保障长期的可维护性与生态兼容性。

展示真实 Kubernetes 官方迁移/架构资料中 Ingress NGINX、Gateway API 或替代控制器的迁移场景图
Kubernetes 官方 Gateway API 架构图,展示 GatewayClass、Gateway、HTTPRoute 与 Service 的替代式路由模型。
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。