欢迎回来
登录你的知识库账户
忘记密码?
还没有账户?立即注册
创建账户
注册你的专属知识库
已有账户?去登录
找回密码
输入注册邮箱获取验证码
返回登录
请输入图片中的验证码以继续注册
加载中...
取消
新建收藏
手动添加你喜欢的内容
取消
编辑头像与昵称
上传新头像或修改你的显示昵称
支持 JPG/PNG,最大 2MB
取消

问题反馈

notebasewww.notebase.cn
控制台
内容库
动态
管理
账户
U
用户
--
在线
v0.8.7 · 知识库
笔记
KnowledgeBase
网络无边,知识有迹。
0笔记
0工具
30推荐

分类导航

按主题直达

编辑精选

站内用户贡献 · 真实笔记

最新收录

每日更新
继续浏览全部内容 →
>
笔记
0
加载中...
工具
0
此页用于记录用户反馈问题后的每一次改进
笔记用法

“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。

md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。

要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。

工具用法

在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。

要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。

工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。

隐藏笔记

写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。

适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。

数据安全

你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。

技术

全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。

理念

这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。

原则

不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。

更多

产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。

举报

如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。

趋势
// 点击导航加载发现
归档
// 归档为空
最近浏览
// 暂无浏览记录
发布
// 加载中...
用户发布
// 加载中...
用户管理
// 加载中...
访问统计
// 加载中...
内容审核
// 加载中...
个人信息
// 加载中...
返回首页

F5 NGINX Ingress Controller 5.3.0 新功能详解

2026/7/6计算机网络

兄弟们,最近 F5 那边放出了 NGINX Ingress Controller 5.3.0 版本,我抽空把 release notes 和几个关键 feature 翻了一遍,感觉这次更新挺实在的,不是那种刷版本号的敷衍更新。尤其是对 OpenID Connect 和 JWT 的支持,以及一些运维向的改进,值得拿出来好好聊聊。

下面我按自己的理解,把几个核心的新功能拆开揉碎了讲,配合代码示例和原理说明,希望能帮大家少踩点坑。


一、OpenID Connect (OIDC) 与 JWT 深度支持

这是 5.3.0 最大的亮点。以前我们做 API 网关认证,要么自己写 Lua 脚本对接 Keycloak,要么用第三方插件,维护成本不低。现在官方直接内置了 OIDC 和 JWT 的完整支持,配置起来清爽很多。

1.1 核心原理:OIDC 流程是怎么走的?

简单来说,OIDC 是基于 OAuth 2.0 的身份认证协议,多了个 ID Token(JWT 格式)。NGINX Ingress Controller 现在充当了 Relying Party(RP)的角色,流程大致如下:

  1. 用户访问受保护的资源,Ingress 检测到没有有效的 session,就把用户重定向到 OpenID Provider(比如 Keycloak、Okta、Azure AD)。
  2. 用户在 OP 登录,OP 返回一个 authorization code。
  3. Ingress 拿着这个 code 去 OP 的 token endpoint 换回 ID Token、Access Token 和 Refresh Token。
  4. Ingress 验证 ID Token 的签名(用 OP 的 JWKS endpoint),解析出用户信息(sub、email、groups 等),然后把这些信息注入到请求头里传给后端服务。
  5. 同时,Ingress 会设置一个加密的 cookie(或 session),后续请求直接走 cookie 验证,不用反复去 OP 认证。

关键点:整个流程对后端服务是透明的,后端只需要读请求头里的 X-User-ID、X-User-Email 等字段就能拿到用户身份,不需要自己实现 OAuth 客户端。

1.2 配置示例:对接 Keycloak

假设你的 Keycloak 跑在 auth.example.com,realm 是 myapp,client ID 是 nginx-ingress,配置如下:

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
  name: myapp
spec:
  host: app.example.com
  tls:
    secret: tls-secret
  policies:
  - name: oidc-policy
  upstreams:
  - name: backend
    service: backend-svc
    port: 8080
  routes:
  - path: /
    action:
      pass: backend
---
apiVersion: k8s.nginx.org/v1
kind: Policy
metadata:
  name: oidc-policy
spec:
  oidc:
    clientID: nginx-ingress
    clientSecret: your-client-secret
    authEndpoint: https://auth.example.com/realms/myapp/protocol/openid-connect/auth
    tokenEndpoint: https://auth.example.com/realms/myapp/protocol/openid-connect/token
    jwksURI: https://auth.example.com/realms/myapp/protocol/openid-connect/certs
    # 可选:定义要注入到后端的请求头
    headers:
      - name: X-User-ID
        claim: sub
      - name: X-User-Email
        claim: email
      - name: X-User-Groups
        claim: groups
    # 可选:session 配置
    session:
      secret: my-session-secret
      cookie:
        name: nginx-oidc-session
        secure: true
        httpOnly: true

注意事项:

  • clientSecret 建议用 Kubernetes Secret 引用,不要明文写在 Policy 里(虽然官方示例是明文,但生产环境别这么干)。
  • jwksURI 是用来验证 ID Token 签名的,如果 OP 的 JWKS 会轮换,NGINX 会自动缓存并定期刷新,不需要手动处理。
  • 如果后端需要获取用户的原始 ID Token(比如做更细粒度的权限判断),可以额外配置 headers 把整个 JWT 传过去,但注意 JWT 可能很大,建议用 X-ID-Token 这种自定义头。

1.3 JWT 验证(不依赖 OIDC 流程)

如果你已经有 JWT(比如来自移动端或 SPA),不需要完整的 OIDC 重定向流程,可以直接用 JWT 验证功能。这个适合 API 网关场景,后端只信任由 Ingress 验证过的 JWT。

apiVersion: k8s.nginx.org/v1
kind: Policy
metadata:
  name: jwt-policy
spec:
  jwt:
    realm: MyApp
    token: $http_authorization  # 从 Authorization Header 取 Bearer Token
    # 或者从 cookie 取:token: $cookie_my_token
    jwksURI: https://auth.example.com/.well-known/jwks.json
    # 也可以直接指定 RSA public key(适合测试环境)
    # key: |
    #   -----BEGIN PUBLIC KEY-----
    #   MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
    #   -----END PUBLIC KEY-----

原理:NGINX 会缓存 JWKS,每次请求进来时,用 JWK 里的公钥验证 JWT 的签名、exp、nbf、iss 等字段。验证通过后,可以把 JWT 里的 claims 注入到请求头,比如 X-User-Role: admin。

坑点:如果 JWT 的 aud(受众)字段包含多个值,NGINX 默认只检查第一个,建议在配置里显式指定 expectedAudiences:

    jwt:
      # ...
      expectedAudiences:
        - myapp-api
        - myapp-web

二、可观测性增强:OpenTelemetry 与日志改进

2.1 OpenTelemetry 支持(实验性)

以前 NGINX Ingress 的 tracing 主要靠 Jaeger 的 native 支持,但 OpenTelemetry 已经成为行业标准。5.3.0 开始实验性支持 OTLP(OpenTelemetry Protocol)导出,可以直接把 trace 数据发给任何兼容 OTel 的后端(如 Grafana Tempo、Datadog、Honeycomb)。

配置方式:通过 ConfigMap 或 annotation 开启:

# ConfigMap
data:
  opentelemetry: "true"
  opentelemetry-collector-host: "otel-collector.monitoring.svc.cluster.local"
  opentelemetry-collector-port: "4318"  # OTLP HTTP 默认端口
  opentelemetry-trust-incoming-span: "true"  # 信任上游传来的 span context

或者用 annotation 按 Ingress 粒度控制:

annotations:
  nginx.org/opentelemetry: "true"
  nginx.org/opentelemetry-collector-host: "otel-collector.monitoring.svc.cluster.local"
  nginx.org/opentelemetry-collector-port: "4318"

效果:每个请求会生成一个 span,包含上游响应时间、状态码、请求路径等属性。配合 OTel 的采样策略(比如只采样错误请求或高延迟请求),可以节省存储成本。

注意:目前是实验性功能,官方说可能会在后续版本改配置方式,生产环境慎用。但我个人觉得可以先用 sidecar 模式跑一个 OTel Collector,把数据先收起来,等稳定了再切。

2.2 日志格式可配置

以前改 NGINX 日志格式得自己写 log_format 指令,现在可以直接通过 ConfigMap 配置:

data:
  log-format: '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for" $request_time'
  log-format-escape: json  # 可选,用 JSON 格式输出,方便日志系统解析

实用场景:把 $upstream_response_time、$upstream_status 加进去,排查上游慢查询时不用再 grep 半天。如果用了 OIDC,还可以把 $http_x_user_id 加进去,方便按用户追踪请求。


三、性能与稳定性改进

3.1 连接池优化

5.3.0 改进了 upstream 的连接复用逻辑,特别是针对 HTTP/2 和 gRPC 场景。以前在高并发下,NGINX 可能会频繁创建新连接导致 CPU 飙升,现在增加了 keepalive_requests 和 keepalive_timeout 的动态调整能力。

配置示例(通过 annotation):

annotations:
  nginx.org/keepalive: "256"          # 每个 worker 最多保持 256 个空闲连接
  nginx.org/keepalive-requests: "1000" # 每个连接最多处理 1000 个请求后关闭
  nginx.org/keepalive-timeout: "60s"   # 空闲连接超时

原理:这其实是 NGINX 的 upstream keepalive 指令的暴露。默认值比较保守(keepalive=32),如果你的后端是 Go 或 Java 写的,建议调大,减少 TCP 握手开销。但别太大,否则 worker 内存占用会涨。

3.2 健康检查增强

新增了 grpc-health 类型的健康检查,专门针对 gRPC 服务。以前只能通过 HTTP 的 /healthz 端点检查,但 gRPC 服务可能没有 HTTP 端口,现在可以直接用 gRPC 的健康检查协议(定义在 grpc.health.v1.Health/Check)。

upstreams:
- name: grpc-backend
  service: grpc-svc
  port: 50051
  type: grpc
  healthCheck:
    enable: true
    grpc-health: {}  # 使用 gRPC 健康检查
    interval: 10s
    jitter: 2s
    fails: 3
    passes: 2

好处:不需要额外暴露 HTTP 端口,减少攻击面。而且 gRPC 健康检查是标准的,所有主流 gRPC 框架都支持。

3.3 配置重载优化

以前修改 Ingress 资源后,NGINX 会执行 nginx -s reload,这会导致 worker 进程重启,丢失部分连接。5.3.0 引入了 graceful reload 机制:新的 worker 启动后,旧的 worker 会继续处理现有连接直到超时(默认 10 秒),而不是直接 kill。

配置:

data:
  worker-shutdown-timeout: "30s"  # 给旧 worker 处理完现有连接的时间
  worker-processes: "auto"        # 自动检测 CPU 核数

影响:如果配置频繁变更(比如每几分钟改一次),建议把 worker-shutdown-timeout 设短一点(比如 5s),否则旧 worker 堆积会导致内存泄漏。如果变更不频繁,设长一点(30s)用户体验更好。


四、安全相关更新

4.1 证书管理改进

支持直接从 AWS Secrets Manager、Azure Key Vault、GCP Secret Manager 拉取 TLS 证书,不再需要手动把证书存到 Kubernetes Secret 里。这对多云环境很友好。

配置方式(以 AWS 为例):

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
  name: myapp
spec:
  host: app.example.com
  tls:
    secret: arn:aws:secretsmanager:us-east-1:123456789012:secret:my-tls-cert-abc123
    # 注意:需要 IAM 角色或 access key 有权限读取该 secret

原理:NGINX Ingress Controller 内部集成了 AWS SDK,会定期(默认 1 小时)从 Secrets Manager 拉取证书并加载,同时支持证书轮换。如果证书在 Secrets Manager 里更新了,NGINX 会在下次 reload 或定时任务触发时自动生效。

坑点:如果用了外部 secret,kubectl get secret 看不到,但 NGINX 的 /status/ssl 端点能看到证书信息。排查问题时记得用这个端点。

4.2 速率限制增强

新增了 rate-limit 策略的 key 支持从请求头或 cookie 提取,比如针对用户 ID 限流:

apiVersion: k8s.nginx.org/v1
kind: Policy
metadata:
  name: rate-limit-policy
spec:
  rateLimit:
    rate: 10r/s
    key: $http_x_user_id  # 按用户 ID 限流
    zoneSize: 10M
    burst: 20
    nodelay: true

场景:防止某个用户恶意刷接口,但又不影响其他用户。配合 OIDC 注入的 X-User-ID 头使用,效果拔群。


五、升级注意事项

如果你打算从 5.2.x 升级到 5.3.0,有几个点要注意:

  1. CRD 需要更新:新版本增加了 Policy 和 VirtualServerRoute 的一些字段,需要先 apply 新的 CRD:

    kubectl apply -f https://raw.githubusercontent.com/nginxinc/kubernetes-ingress/v5.3.0/deploy/crds/k8s.nginx.org_virtualservers.yaml
    kubectl apply -f https://raw.githubusercontent.com/nginxinc/kubernetes-ingress/v5.3.0/deploy/crds/k8s.nginx.org_policies.yaml
    
  2. 镜像 tag 变化:从 nginx/nginx-ingress:5.2.0 换成 nginx/nginx-ingress:5.3.0,注意如果是私有仓库,提前 pull 好。

  3. 默认行为变更:log-format 的默认值变了,如果你的日志采集系统依赖旧的格式,升级后需要检查。新默认格式增加了 $request_time 和 $upstream_response_time。

  4. OIDC 依赖:使用 OIDC 功能需要确保 Ingress Controller 能访问 OP 的 endpoints(auth、token、jwks),如果 OP 在内网,记得配 network policy 或 DNS 解析。


总结

这次 5.3.0 的更新,我个人最看好的是 OIDC 原生支持和 OTel 集成。前者让 API 网关的认证逻辑从“自己写 Lua”变成了“配 YAML”,后者让可观测性跟上了云原生标准。性能方面的 graceful reload 和连接池优化虽然不显眼,但在生产环境中能减少不少 p99 抖动。

如果你正在用 NGINX Ingress Controller 做网关,建议先在测试环境升级,重点验证 OIDC 流程和证书管理。等稳定了再推生产。毕竟网关这东西,一出问题整个业务都挂,稳字当头。

有什么问题欢迎留言讨论,我尽量回复。

编写使用方法
Markdown 格式 · Ctrl+Enter 确定
新建笔记
预览
数据表格
点击单元格编辑 · Tab 移动
A1fx
Sheet1
BIH1H2≡🔗</>
隐私提醒

取消
编辑工具
取消