墨穗app.notebase.cn
控制台
内容库
动态
管理
账户
U
用户
--
在线
v1.0.165 · 墨穗笔记
笔记

Notebase墨穗
静水流深,落墨成穗。

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-07-06计算机网络

兄弟们,最近 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 流程和证书管理。等稳定了再推生产。毕竟网关这东西,一出问题整个业务都挂,稳字当头。

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

相似推荐
如何验证代理分流规则是否准确?推荐ip.net.coffeeClaude Code 桌面版接入 DeepSeek API 完整配置指南心脏出血漏洞深度解析:OpenSSL 内存泄漏危机自建邮箱23年后我放弃了:互联网邮件的寡头垄断已无法撼动Cloudflare 1.1.1.1:隐私优先的极速公共 DNS 服务技术解析YouTube 在 Firefox 上人为延迟视频加载:一场浏览器识别与用户对抗的暗战
编写使用方法
Markdown 格式 · Ctrl+Enter 确定
0 字新建笔记
欢迎回来
登录你的墨穗笔记账户
忘记密码?
还没有账户?立即注册
创建账户
注册你的专属墨穗笔记
已有账户?去登录
找回密码
输入注册邮箱获取验证码
返回登录
请输入图片中的验证码以继续注册
加载中...
取消
新建收藏
手动添加你喜欢的内容
取消
编辑头像与昵称
上传新头像或修改你的显示昵称
支持 JPG/PNG,最大 2MB
取消

问题反馈

隐私提醒

取消
编辑工具
受控分享
为这篇笔记生成限时 / 带密码的临时链接
关闭