“写笔记”支持四种格式——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 新功能详解
兄弟们,最近 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)的角色,流程大致如下:
- 用户访问受保护的资源,Ingress 检测到没有有效的 session,就把用户重定向到 OpenID Provider(比如 Keycloak、Okta、Azure AD)。
- 用户在 OP 登录,OP 返回一个 authorization code。
- Ingress 拿着这个 code 去 OP 的 token endpoint 换回 ID Token、Access Token 和 Refresh Token。
- Ingress 验证 ID Token 的签名(用 OP 的 JWKS endpoint),解析出用户信息(sub、email、groups 等),然后把这些信息注入到请求头里传给后端服务。
- 同时,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,有几个点要注意:
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镜像 tag 变化:从
nginx/nginx-ingress:5.2.0换成nginx/nginx-ingress:5.3.0,注意如果是私有仓库,提前 pull 好。默认行为变更:
log-format的默认值变了,如果你的日志采集系统依赖旧的格式,升级后需要检查。新默认格式增加了$request_time和$upstream_response_time。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 流程和证书管理。等稳定了再推生产。毕竟网关这东西,一出问题整个业务都挂,稳字当头。
有什么问题欢迎留言讨论,我尽量回复。