跳到正文
cyxc.club

Traefik 3.7.11 升到 3.7.13

/ 约 6 分钟

公网 80/443 走 Traefik。2026-09-15 下午把 proxy 从 v3.7.11 升到 v3.7.13,Helm chart 41.3.0 → 41.5.0。这是同 minor 补丁,不是换入口,也不是上 HTTP/3、Hub、v4。

3.7.13 修了 HTTP trailer 绕过 forwardedHeaders / 头清洗。现网 web / websecure 信任 CDN 和 WAF 送来的 X-Forwarded-*,这正是要吃这档的原因。不要把洞号和网段写进对外稿。

入口怎么站住、chart 35 怎么跳到 41,是另一篇。这篇只写 09-15 这一趟:本地 chart 怎么换、Helm 哪一步不会做、覆盖文件哪个键会把 upgrade 挡死。签发链见 cert-manager 怎么接 DNSPod。同日 16:32 才升 cert-manager,见 cert-manager 1.20.2 升到 1.21.1。不要和 cert-manager 同一分钟滚。

目录


要解决什么

读者读完应能分清:

  1. 只换镜像 tag 不够。 41.4 才有 aliasHeadersStrategy;41.5 才默认 3.7.13。现网用本地 chart + -f traefik.yaml
  2. Helm 不会更新 crds/ 必须先 kubectl apply --server-side,再 helm upgrade
  3. 覆盖文件里多出来的键会被 schema 拒。 YAML 锚点如果写成顶层字段,chart 不认识就 UPGRADE FAILED。IP 列表本身可以不动。
  4. 公网入口两个口才要设 aliasHeadersStrategy: delete 内部 metrics / traefik 的警告可以留。SafeNaming 不要改成 true。

不要把这篇当成 helm upgrade traefik traefik/traefik 教程。上游 README 会写;现网要记住的是本地包、覆盖文件、CRD、Harbor。


升之前

release 名叫 traefik,命名空间 traefik。2 副本,RollingUpdatemaxUnavailable: 0maxSurge: 1。镜像走 Harbor:harbor.cyxc.club/dockerhub/library/traefikimage.tag 空着,跟 chart appVersion

helm history(CST):

rev 何时 chart / proxy 说明
4–7 05-24 — 06-24 35.0.0 / v3.3.5 最早还在 history 里的
8–11 06-25 41.0.0 / v3.7.5 跨到 3.7
12 08-23 41.3.0 / v3.7.11 跟 1.33 那天不是同一趟
13 09-04 仍是 41.3.0 / v3.7.11 换裸机后原样 upgrade,版本没动
14 09-15 15:43 41.5.0 / v3.7.13 这趟
15 09-15 15:52 同上 只加 aliasHeadersStrategy: delete

09-04 那次不要写成已经吃过 3.7.13。

覆盖一律 -f /root/helm-chart/traefik/traefik.yaml:Harbor 前缀、CDN/WAF trustedIPs、读写超时 600s、replicas: 2strictTLSOptions: true。不要用上游 values.yaml 盖掉。HTTP/3 关着。Gateway API provider 关着。


本地 chart 从 OCI 换,不走 GitHub Pages

包在 /root/helm-chart/traefik。先把 traefik.yaml 拷走,再换目录里的 chart 文件。

helm repo add traefik https://traefik.github.io/charts 能加上,helm repo update traefik 卡住。实际拉的是 OCI:

helm pull oci://ghcr.io/traefik/helm/traefik --version 41.5.0

digest sha256:e568633d52b1136b1040715b65c0596ece6ea16344d442ceb741b68c4f239e46Chart.yamlversion: 41.5.0appVersion: v3.7.13

换包时 --exclude traefik.yaml。旧 41.3.0 当时备份在 /tmp,不进 Git。


覆盖文件多一个键,schema 就失败

traefik.yaml 里 CDN/WAF 网段用 YAML 锚点复用到 webwebsecure。41.3.0 那份写成了顶层键 entrypointTrustedIPs。chart 模板不读这个字段,注释也写了「仅作锚点」。

41.5.0 的 schema 不允许额外顶层键。dry-run:

Error: UPGRADE FAILED: values don't meet the specifications of the schema(s)
- at '': additional properties 'entrypointTrustedIPs' not allowed

处理:把锚点挂到 ports.web.forwardedHeaders.trustedIPswebsecure 继续 *entrypointTrustedIPs。201 条和改之前逐条相同。不要 --disable-openapi-validation 混过去,下次还会撞。

--reuse-values 这轮不能用:会把旧 chart 默认值钉死,新字段进不来。


CRD 必须单独 apply

官方 chart 把 CRD 放在 crds/。Helm 升级 不会改它们。Gateway API 现网关着,不必跟官方文档再 apply 一份 Gateway CRD。

Terminal window
kubectl apply --server-side --force-conflicts -f /root/helm-chart/traefik/crds/

25 份成功。集群里还留着 2025-04-10 的 Hub CRD apiaccesses.hub.traefik.io,新包已经不带,0 条对象、已 deprecated。现网没用 Hub,后来删了这条 CRD。


Harbor 三台都有镜像再 helm

镜像 dockerhub/library/traefik:v3.7.13(代理仓 dockerhub)。节点上 crictl/opt/kube/bin。三台都拉到 sha256:88d3f28a… 再 upgrade。其中一台第一次对 Harbor TLS handshake timeout,curl 当时是通的,重试就有了。不要让滚动更新卡在拉层。


2026-09-15 下午(CST)

时间 发生了什么
换包 本地 chart 41.5.0,覆盖文件还在
拉镜像 三台都有 v3.7.13
升 CRD server-side apply crds/
15:43 helm rev 14--wait 约 30 秒;两个 Pod 报 Version: 3.7.13
15:52 helm rev 15,只加 aliasHeadersStrategy: delete

upgrade:

Terminal window
helm upgrade traefik /root/helm-chart/traefik \
-n traefik \
-f /root/helm-chart/traefik/traefik.yaml \
--wait --timeout 5m

LB 还是 MetalLB 那张。滚动时新副本有过一次 readiness /ping timeout,随后 BGP 改宣告节点。抽查 443:Harbor、GitLab、云平台控制台通。对象站经 Traefik LB 是 RGW;经 CDN 看到的证书不要当成 Traefik 签坏了。


升完那条 header 警告

3.7.12 起,未配 aliasHeadersStrategy 会 WRN:X_Auth_User / X.Auth.User 这种别名头原样转发,后端可能当成 X-Auth-User。rev 14 升完,公网两个口都在报。

rev 15 只改覆盖文件两处,都是 delete

  • ports.web.http.aliasHeadersStrategy
  • ports.websecure.http.aliasHeadersStrategy

underscoreHeadersStrategy 留空,不要赋值。参数是:

--entryPoints.web.http.aliasHeadersStrategy=delete
--entryPoints.websecure.http.aliasHeadersStrategy=delete

之后 web / websecure 这条 WRN 没了。还在的启动警告:

日志 现网怎么处理
aliasHeadersStrategy 未配,metrics / traefik 内部口,不对外,不动
encoded characters 默认会拒部分编码路径 现网没靠违规编码,不改 encodedCharacters
SafeNaming 没显式设置 不要改成 true。现网 IngressRoute 走旧命名,打开可能撞名。要消警告只能显式 false

没有 ERR。