Istio 1.31.1 是面向 1.31.0 的修复版本,重点不是引入新功能,而是收紧安全边界并提高控制面、Ambient 多集群和流量配置的稳定性。正在使用 BackendTLSPolicy、远程 JWKS、Gateway API、Waypoint 或 Ambient 多集群的团队,应当把这次升级放到较高优先级。
最值得关注的是安全边界变化
本次发布修复了一个评分为 6.8、等级为 Moderate 的问题:当 BackendTLSPolicy 引用的 CA 无法解析时,Sidecar 代理可能以明文方式连接后端,也就是从预期的 TLS 验证状态“失败开放”。
这个问题的危险之处不只是连接失败,而是连接可能继续成功。监控系统如果只关注 5xx、连接错误和延迟,很可能无法发现流量已经失去 TLS 保护。升级后,还应主动检查所有策略中的 CA 引用,而不是把版本更新当作配置审计的替代品。
可以用下面的命令盘点集群中的 BackendTLSPolicy 及其状态。执行前将 KUBECONFIG 指向待检查集群:
set -euo pipefail
kubectl get backendtlspolicies.gateway.networking.k8s.io -A
kubectl get backendtlspolicies.gateway.networking.k8s.io -A \
-o custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,GENERATION:.metadata.generation,OBSERVED:.status.observedGeneration,CONDITIONS:.status.conditions[*].type,REASONS:.status.conditions[*].reason'
如果集群中没有安装该 CRD,第一条命令会返回资源类型不存在;这不代表存在故障。若策略存在,则要重点检查不存在的 Secret、ConfigMap、错误的命名空间以及未被授权的跨命名空间引用。
1.31.1 还补上了 RequestAuthentication 中 jwksUri 获取路径的 SSRF 缺口。Istiod 现在默认在拨号层阻断链路本地地址和已知云元数据地址,例如 169.254.169.254,并拒绝内容不是有效 JWKS 的响应。私有地址和回环地址仍可访问;如需进一步限制,可以通过 BLOCKED_CIDRS_IN_JWKS_URIS 配置额外网段。
与此相关的另一个修复恢复了 JWKS 请求的 HTTP/2 协商。此前用于 TLS 固定和 CIDR 拦截的自定义 Go HTTP 配置关闭了自动 HTTP/2,导致某些 HTTP CONNECT 代理后的 JWKS 获取失败。升级后,传输行为重新与 Go 默认 Transport 对齐。
另外两类边界问题也值得纳入安全复查:
istioctl analyze不再直接信任多集群 Secret 中的 kubeconfig,会像 Istiod 一样先做清理,避免恶意exec凭据插件或不安全认证字段在运行命令的机器上执行或读取本地文件。- 多个
sidecar.istio.io/*注解过去在注入模板中缺少一致的输出转义,构造过的值可能向生成的 Pod 或 Deployment 规格注入额外字段。此次修复覆盖了proxyImage、bootstrapOverride、logLevel、componentLogLevel和agentLogLevel。
可以这样快速搜索工作负载模板中相关注解:
kubectl get deployment,statefulset,daemonset -A -o yaml | \
grep -nE 'sidecar\.istio\.io/(proxyImage|bootstrapOverride|logLevel|componentLogLevel|agentLogLevel)'
升级并不意味着已有恶意配置会自动消失。发现来源不明、包含换行或结构化 YAML 片段的注解值时,应回溯 Git、Admission 审计记录和变更主体。
Ambient、Waypoint 与多集群修复更集中
1.31.1 对 Ambient 模式做了多项可靠性修复。
CNI 节点代理此前可能在重启后改变对 iptables 后端的判断,在 legacy 与 nft 之间摇摆,并向已经纳管的 Pod 重复写入重定向规则。此类问题通常表现为节点重启后网络行为异常,因此升级后应特别观察 CNI DaemonSet 重启次数、节点上的流量重定向以及 Pod 连通性。
Waypoint 的 Canary 路径也修复了两个问题:
- 服务只通过
istio.io/use-waypoint-canary引用 agentgateway Waypoint 时,该 Waypoint 现在能够获得服务对应的路由和策略,避免切到 Canary 的连接因缺少配置而被拒绝。 - Canary Waypoint 现在遵循与主 Waypoint 相同的
serviceEntryVisibility跨命名空间限制,不能再绕过NAMESPACE隔离。
在多集群场景中,远程集群凭据轮换曾可能泄漏该集群的完整缓存状态;远程集群删除或配置变化时,KRT 调试器注册项也可能持续累积。这两处内存泄漏均已修复。运行时间长、远程集群多、凭据轮换频繁的 Istiod 实例,升级后的内存曲线尤其值得对比。
MDS/WDS 增量更新也得到修正,包括仅 Address 变化时未推送、重复序列化同一工作负载,以及连接带有 initial_resource_versions 时永久保留资源名称副本的问题。这些修复会减少不必要的 CPU 和内存消耗,并提高遥测元数据的及时性。
控制面、协议和配置正确性
当 AuthorizationPolicy 数量增长时,Istiod CPU 使用率曾明显上升;1.31.1 修复了这一扩展性问题,同时优化了为指定工作负载获取 PeerAuthentication 的性能。策略规模较大的集群,应在升级前后对比 Istiod 的 CPU、推送延迟和代理同步状态。
网络与配置层面的修复还包括:
- IPv6-only 集群中的
ALLOW_ANY_DYNAMIC_DNS不再错误地使用 IPv4 回环地址连接 DNS 代理。 ca-crl.pem可通过设置空字符串或删除配置来真正清空 CRL。sidecar.istio.io/statsFlushInterval对一分钟以上及亚秒值不再生成无效 Envoy bootstrap。sidecar.istio.io/statsEvictionInterval不再静默截断亚秒精度。- 带有“存在但为空”的 workload selector 的
ServiceEntry不再错误匹配命名空间内所有工作负载。 - 远程集群 Pod 或
WorkloadEntry新成为服务端点时,会重新计算对应代理配置。 - Gateway 与同名同命名空间的
ListenerSet不再被错误视作同一个对象。 - 资源更新与排队中的旧状态写入重叠时,
observedGeneration不再永久停留在旧值。
Gateway API 的跨命名空间证书引用也调整了检查顺序:系统先验证 ReferenceGrant,再解析 TLS Secret 或 CA ConfigMap。未经授权的引用统一返回 RefNotPermitted,不会再通过 ResolvedRefs 状态泄露目标对象是否存在。
Helm 用户还应注意,默认 Chart 中 ValidatingWebhookConfiguration 硬编码 failurePolicy: Ignore 所引发的 Server-Side Apply 字段管理冲突已经修复。Kiali 插件则更新到了 v2.31.0。
一套可执行的升级前后检查
下面的流程适用于从 1.31.0 升级到 1.31.1。假设你已经按照组织现有的软件供应链取得并校验了 1.31.1 的 istioctl;如果使用 Helm、修订版控制面或 GitOps,请继续沿用原有安装方式,不要临时切换工具。
set -euo pipefail
export ISTIO_NAMESPACE=istio-system
export ISTIOCTL=./istioctl-1.31.1
# 确认客户端版本,并对当前集群执行升级前检查
"${ISTIOCTL}" version --remote=false
"${ISTIOCTL}" x precheck
# 保存升级前状态
kubectl get pods -n "${ISTIO_NAMESPACE}" -o wide
"${ISTIOCTL}" proxy-status
"${ISTIOCTL}" analyze -A
# 这里执行团队既有的 Helm、GitOps 或 istioctl 升级流程。
# 不要在不了解现有 values/profile 的情况下直接套用默认配置。
# 升级完成后等待控制面和 CNI 就绪
kubectl rollout status deployment/istiod \
-n "${ISTIO_NAMESPACE}" --timeout=5m
if kubectl get daemonset istio-cni-node -n "${ISTIO_NAMESPACE}" >/dev/null 2>&1; then
kubectl rollout status daemonset/istio-cni-node \
-n "${ISTIO_NAMESPACE}" --timeout=5m
fi
# 检查代理同步和配置分析结果
"${ISTIOCTL}" proxy-status
"${ISTIOCTL}" analyze -A
若使用修订版升级,还要确认新旧修订版对应的工作负载数量,并按命名空间或应用逐批重启。Ambient 集群则应补充验证 ztunnel、Waypoint、跨命名空间引用和远程集群凭据轮换。
升级决策清单
建议按以下顺序推进:
- 使用
BackendTLSPolicy或远程 JWKS:优先升级,同时核查 CA 与 JWKS 引用是否有效。 - 使用 Ambient、Waypoint 或多集群:进行灰度升级,并持续观察 Istiod 内存、CNI 重启和端点更新。
- 拥有大量
AuthorizationPolicy:记录升级前后的 CPU、配置推送延迟与代理同步情况。 - 使用 Helm Server-Side Apply:在预发布环境复现现有升级命令,确认字段管理冲突消失。
- 依赖 Gateway API 跨命名空间证书:检查
ReferenceGrant是否完整,不要依赖旧版本的解析顺序。 - 使用 Sidecar 注解定制代理:审计注解来源,并验证代理 bootstrap 能正常生成。
1.31.1 的价值主要体现在“失败时如何表现”:TLS 配置不完整时不应悄悄退回明文,未经授权的引用不应泄露对象存在性,外部 JWKS 获取也不应成为访问云元数据的通道。对生产网格而言,这些边界修复比新增一个可见功能更值得尽快落地。