【Envoy Gateway】运维与升级:CRD 与 Helm 所有权分叉如何静默失败

💡 原文中文,约11200字,阅读约需27分钟。
📝

内容提要

Envoy Gateway v1.9.0升级需注意:CRD与控制器分离管理,VAP策略移入chart需补Helm所有权或关闭渲染;TCP/UDP路由需先升级Gateway API v1.6否则静默跳过;xDS接收上限增至32MiB,断流可能无NACK。升级需按层检查,避免流量静默中断。

🔎

延伸解读

CRD 与控制器分离:升级顺序为何关键

Envoy Gateway 的 Helm chart 默认不会在升级时更新 CRD,这导致 chart 版本与 CRD 版本可能脱节。官方明确要求先升级 CRD 再升级控制器,否则新控制器可能无法 reconcile 新资源。对于使用云提供商管理的 Gateway API CRD 的集群,必须通过 crds.enabled=false 关闭内置 CRD 安装,避免所有权冲突。这种分离设计虽增加了操作复杂度,但能防止 Helm 误删集群级 schema。

VAP 所有权迁移:GitOps 下的隐藏陷阱

v1.9 将 safe-upgrades ValidatingAdmissionPolicy 从 CRD bundle 移入 chart templates,目的是避免 Flux 等工具将其当作 CRD 处理。若单独安装 CRD,需手动为已有 VAP 补充 Helm 所有权注解,否则 helm upgrade 无法接管;若由云提供商管理,则需显式关闭渲染。漏做任一操作都可能导致 admission 策略失效或双份策略并存,且失败可能无显式报错。

TCP/UDP 静默跳过:版本门禁的代价

Envoy Gateway v1.9 仅通过 gateway.networking.k8s.io/v1 reconcile TCPRoute/UDPRoute,若 Gateway API CRD 未升级到 v1.6,这些路由会被静默跳过,不产生错误事件或 NACK。standard channel 下 v1alpha2 停止 serving,需提前改写清单 apiVersion;experimental channel 虽兼容,但存储版本迁移仍需手动执行。此外,HTTPRoute 的 sessionPersiste

xDS 32MiB 上限:断流可能无 NACK

v1.9 将 xDS 接收消息上限从 4MiB 提升至 32MiB,但该限制仅作用于控制器接收的上行请求,不限制下发配置。大集群重连时,若 DiscoveryRequest 超过上限,gRPC 会直接断流,代理可能不发出 NACK,导致 xds_nack_total 为零,而代理停留在旧快照。升级后应关注控制器日志中的消息大小错误,而非仅依赖 NACK 指标。同时,默认开启的 EndpointSliceIndex 会增加控制器内存,需复核内存限制。

Q&A

Envoy Gateway v1.9.0 升级时,为什么 TCP/UDP 路由会静默消失?

因为 v1.9.0 改为通过 gateway.networking.k8s.io/v1 来 reconcile TCPRoute 和 UDPRoute,如果 Gateway API CRDs 没有先升级到 v1.6,这些路由会被静默跳过,不会报错,也不会产生 NACK。

Envoy Gateway v1.9.0 中 safe-upgrades VAP 移到 chart 后,单独安装 CRD 时需要做什么?

需要给已有的 ValidatingAdmissionPolicy 和 Binding 对象补上 Helm 所有权元数据,包括注解 meta.helm.sh/release-name、meta.helm.sh/release-namespace 和标签 app.kubernetes.io/managed-by=Helm,否则 Helm 无法接管这些资源。

如果集群的云提供商已经管理了 Gateway API CRD,安装 Envoy Gateway v1.9.0 时应该注意什么?

应该避免使用 install.yaml 盲目安装,而是使用 gateway-crds-helm 只安装 Envoy Gateway CRDs,并在安装 gateway-helm 时设置 crds.enabled=false,同时如果提供商也管理 safe-upgrades VAP,需要设置 crds.gatewayAPI.safeUpgradePolicy.enabled=false 来关闭 chart 渲染 VAP。

Envoy Gateway v1.9.0 中 xDS 接收消息上限默认值是多少?它有什么作用?

默认上限从 4MiB 提升到 32MiB,用于限制控制器接收到的消息大小,避免大集群重连时因上行 DiscoveryRequest 过大导致 gRPC 断流,从而防止代理停留在旧快照。

升级 Envoy Gateway 到 v1.9.0 时,为什么需要先从 HTTPRoute 中删除 sessionPersistence.idleTimeout 字段?

因为 Gateway API v1.6 中删除了 HTTPRoute 的 SessionPersistence.IdleTimeout 字段,如果 CRD 升级前不删除该字段,CRD 升级会因非法字段而被拒绝。

Envoy Gateway v1.9.0 中,如果使用 gateway-crds-helm 安装 CRD,升级时如何更新 CRD?

由于 Helm 对 templates/ 中超大 CRD 有已知限制,需要使用 helm template 生成 YAML 后通过 kubectl apply --server-side 来应用,而不是直接使用 helm upgrade。

Envoy Gateway v1.9.0 中,如果集群中已有兼容的 Gateway API CRD,但 channel 是 standard 且版本低于 v1.6,升级后 TCP/UDP 路由会怎样?

由于 standard channel 在 v1.6 不再 serving v1alpha2,且 Envoy Gateway v1.9.0 只 reconcile v1 版本,TCP/UDP 路由会被静默跳过,即使 Helm 安装成功,流量也会中断。

🏷️

标签

➡️

继续阅读