<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>K3s on F嘉阳</title><link>https://blog.fjy8018.top/tags/k3s/</link><description>Recent content in K3s on F嘉阳</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sat, 07 Nov 2026 18:35:00 +0800</lastBuildDate><atom:link href="https://blog.fjy8018.top/tags/k3s/index.xml" rel="self" type="application/rss+xml"/><item><title>PVE 更换物理机后 K3s TLS 异常排查</title><link>https://blog.fjy8018.top/archives/k3s-tls-cpu-model/</link><pubDate>Sat, 07 Nov 2026 18:35:00 +0800</pubDate><guid>https://blog.fjy8018.top/archives/k3s-tls-cpu-model/</guid><description>&lt;h2 id="背景"&gt;&lt;a href="#%e8%83%8c%e6%99%af" class="header-anchor"&gt;&lt;/a&gt;背景&#10;&lt;/h2&gt;&lt;p&gt;之前在 &lt;a class="link" href="https://blog.fjy8018.top/archives/292/" &gt;ArgoCD 落地 GitOps&lt;/a&gt; 中记录过这套 K3s 环境。最近将 PVE 从 Intel N150 物理机迁移到 AMD Ryzen 5 5600H 后，集群看起来还能正常工作，但日志持续出现 TLS 错误。&lt;/p&gt;&#10;&lt;p&gt;节点是 &lt;code&gt;Ready&lt;/code&gt;，大部分时间 Pod 也全部就绪，普通 API 查询正常。问题主要出现在持续运行的资源监听连接上，偶尔还影响租约更新、身份认证和 webhook 调用。&lt;/p&gt;&#10;&lt;p&gt;最终有效的调整是：保留原磁盘和集群数据，将这台虚拟机的 CPU 类型从 &lt;code&gt;x86-64-v2-AES&lt;/code&gt; 改为 &lt;code&gt;host&lt;/code&gt;。截至本次排查结束，连续 15 分钟观察未再复发，随后复核也正常。&lt;/p&gt;&#10;&lt;p&gt;这个结果支持故障与虚拟 CPU 特性及其影响的执行路径有关，但还没有定位到具体的 Go、内核或 KVM 缺陷。下面记录判断过程，而不是把 &lt;code&gt;host&lt;/code&gt; 当作所有 TLS 错误的通用修复。&lt;/p&gt;&#10;&lt;h2 id="环境"&gt;&lt;a href="#%e7%8e%af%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;环境&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;项目&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;配置&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;迁移前物理 CPU&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Intel N150&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;迁移后物理 CPU&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AMD Ryzen 5 5600H&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;PVE&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;8.4.1，内核 6.8.12-9-pve&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;QEMU 软件包&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;pve-qemu-kvm 9.2.0-5&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;虚拟机&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2 核，14 GiB 内存，Ubuntu 24.04.2&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;guest 内核&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;6.8.0-147-generic&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;原虚拟 CPU 类型&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;x86-64-v2-AES&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;K3s&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;v1.33.6+k3s1，Go 1.24.9&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Rancher&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;v2.13.0，Go 1.24.10&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;数据存储&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SQLite 和 local-path 持久卷&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="故障现象"&gt;&lt;a href="#%e6%95%85%e9%9a%9c%e7%8e%b0%e8%b1%a1" class="header-anchor"&gt;&lt;/a&gt;故障现象&#10;&lt;/h2&gt;&lt;p&gt;最常见的错误有三种：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;local error: tls: bad record MAC&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tls: unexpected message&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;http2: frame too large&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;11 月 7 日零点至 17:40 左右，K3s 累计记录约 1.28 万条相关日志，集中在 323 个秒级时间点。&lt;/p&gt;&#10;&lt;p&gt;这里不能把日志条数当作独立故障次数。HTTP/2 的一条连接承载多个资源监听，一次断连可能同时结束大量 watch，随后出现成批的 reflector 错误。&lt;/p&gt;&#10;&lt;p&gt;另外，&lt;code&gt;bad record MAC&lt;/code&gt; 中的 MAC 是消息认证码，不是网卡 MAC 地址。它表示 TLS 记录校验失败，单凭这句话无法判断是证书、数据传输、端点处理还是运行环境的问题。&lt;/p&gt;&#10;&lt;h2 id="先拆开两个不同的问题"&gt;&lt;a href="#%e5%85%88%e6%8b%86%e5%bc%80%e4%b8%a4%e4%b8%aa%e4%b8%8d%e5%90%8c%e7%9a%84%e9%97%ae%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;先拆开两个不同的问题&#10;&lt;/h2&gt;&lt;h3 id="网络等待超时"&gt;&lt;a href="#%e7%bd%91%e7%bb%9c%e7%ad%89%e5%be%85%e8%b6%85%e6%97%b6" class="header-anchor"&gt;&lt;/a&gt;网络等待超时&#10;&lt;/h3&gt;&lt;p&gt;系统启动时，&lt;code&gt;systemd-networkd-wait-online&lt;/code&gt; 等待约两分钟后超时，系统状态为 &lt;code&gt;degraded&lt;/code&gt;。网卡虽然已经拿到静态 IPv4 地址，却一直停留在 &lt;code&gt;configuring&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;检查发现，系统通过 sysctl 禁用了 IPv6，但 Netplan 没有设置 &lt;code&gt;link-local&lt;/code&gt;，仍默认要求生成 IPv6 链路本地地址。&lt;/p&gt;&#10;&lt;p&gt;在原网卡配置下补充一行即可使两边配置一致：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ethernets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ens18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 原有 addresses、nameservers、routes 保留&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;accept-ra&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dhcp6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;link-local&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这是原配置的局部示意，不能用它覆盖已有的静态地址和路由。修改前备份原文件，再执行：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo netplan generate&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo networkctl reload&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo networkctl reconfigure ens18&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart systemd-networkd-wait-online&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;networkctl status ens18&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl is-system-running&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修复后，网卡变为 &lt;code&gt;configured&lt;/code&gt;，系统恢复为 &lt;code&gt;running&lt;/code&gt;，并通过了后续重启验证。&lt;a class="link" href="https://netplan.readthedocs.io/en/stable/netplan-yaml/#properties-for-physical-device-types" target="_blank" rel="noopener"&#10; &gt;Netplan 官方说明&lt;/a&gt;明确规定，空的 &lt;code&gt;link-local&lt;/code&gt; 列表会关闭链路本地地址配置。&lt;/p&gt;&#10;&lt;p&gt;但 TLS 错误仍然复发，说明这是两个不同的问题。&lt;/p&gt;&#10;&lt;h3 id="历史时间同步异常"&gt;&lt;a href="#%e5%8e%86%e5%8f%b2%e6%97%b6%e9%97%b4%e5%90%8c%e6%ad%a5%e5%bc%82%e5%b8%b8" class="header-anchor"&gt;&lt;/a&gt;历史时间同步异常&#10;&lt;/h3&gt;&lt;p&gt;迁移后确实发生过约 8 小时的时钟回拨，需要认真核对证书有效期和时间同步状态。不过，在宿主机和虚拟机均已同步、没有新增校时记录的时段，TLS 错误仍持续发生。&lt;/p&gt;&#10;&lt;p&gt;因此，历史时间异常值得修复，却不能解释当前全部故障。&lt;/p&gt;&#10;&lt;h2 id="从-rancher-日志扩展到整个节点"&gt;&lt;a href="#%e4%bb%8e-rancher-%e6%97%a5%e5%bf%97%e6%89%a9%e5%b1%95%e5%88%b0%e6%95%b4%e4%b8%aa%e8%8a%82%e7%82%b9" class="header-anchor"&gt;&lt;/a&gt;从 Rancher 日志扩展到整个节点&#10;&lt;/h2&gt;&lt;p&gt;最初 Rancher 的错误最显眼，聚合 API 的证书控制器还反复打印证书更新日志，很容易怀疑证书轮换。&lt;/p&gt;&#10;&lt;p&gt;核对 APIService 的 CA、Secret 内的证书和后端实际返回的证书后，证书链、域名和有效期均正常。结合 Rancher 源码，watch 失败后重启证书控制器、重新加载同一张证书，也会打印更新日志，不能将其直接理解为重新签发证书。&lt;/p&gt;&#10;&lt;p&gt;继续扩大日志检查范围，发现错误还出现在：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;K3s 自身访问 &lt;code&gt;127.0.0.1:6443&lt;/code&gt; 的 TokenReview 身份认证接口。&lt;/li&gt;&#10;&lt;li&gt;K3s 访问 &lt;code&gt;127.0.0.1:6444&lt;/code&gt; 的资源监听。&lt;/li&gt;&#10;&lt;li&gt;metrics-server 的 HTTP/2 响应读取。&lt;/li&gt;&#10;&lt;li&gt;cert-manager 的领导者租约更新。&lt;/li&gt;&#10;&lt;li&gt;kube-state-metrics 等其他控制器的 watch。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这些证据说明故障并非只存在于 Rancher，更不能只靠 Rancher 日志数量判断责任端。&lt;/p&gt;&#10;&lt;p&gt;还有一个需要纠正的判断：日志中的 &lt;code&gt;an error on the server&lt;/code&gt; 不一定是服务端主动返回的错误。Kubernetes 客户端的 &lt;a class="link" href="https://github.com/kubernetes/apimachinery/blob/v0.33.6/pkg/watch/streamwatcher.go" target="_blank" rel="noopener"&#10; &gt;StreamWatcher&lt;/a&gt; 会将本地解码失败包装为 Error 事件，再向上层传播。必须结合原始请求和底层错误判断，不能按字面归因。&lt;/p&gt;&#10;&lt;h2 id="验证网络和数据完整性"&gt;&lt;a href="#%e9%aa%8c%e8%af%81%e7%bd%91%e7%bb%9c%e5%92%8c%e6%95%b0%e6%8d%ae%e5%ae%8c%e6%95%b4%e6%80%a7" class="header-anchor"&gt;&lt;/a&gt;验证网络和数据完整性&#10;&lt;/h2&gt;&lt;p&gt;物理网卡更换后，桥接绑定和地址冲突仍需要检查：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# PVE 宿主机&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;qm config &amp;lt;VMID&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip -br link&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bridge link&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bridge fdb show&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 虚拟机&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip -br address&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip route&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip neigh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;本次虚拟机配置、guest 网卡、PVE 转发表，以及迁移前多个快照中的虚拟 MAC 一致，未发现其他虚拟机使用重复 MAC。物理网卡和虚拟网卡本来就有各自的 MAC，换物理机不等于虚拟 MAC 必须变化。&lt;/p&gt;&#10;&lt;p&gt;更关键的是，部分出错连接走本机回环，根本不经过物理网卡。这个事实降低了物理网卡绑定异常作为统一解释的可能性。&lt;/p&gt;&#10;&lt;p&gt;抓包也提供了更直接的证据。对一次真实 Rancher 故障连接，在 Pod 网卡与节点 veth 两侧重组双向 TCP 数据，约 164 KB 的载荷逐字节一致，没有缺口或冲突。这次样本没有显示数据在两个抓包点之间被改写，但不能据此排除所有内核和端点内存问题。&lt;/p&gt;&#10;&lt;p&gt;其他检查结果如下：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;检查&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;结果&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;能说明什么&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SQLite 只读 quick_check&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ok&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;未发现本次检查覆盖的数据库结构损坏&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;K3s 二进制 SHA-256&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;与官方发布一致&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;安装文件未发现变化&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;普通 TCP 回环传输&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;512 MiB 校验通过&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;本轮普通传输数据一致&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;独立 OpenSSL 回环传输&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AES-GCM、ChaCha20 合计 512 MiB 通过&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;不能认为所有加密运算都不正常&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;独立 Go HTTP/2 watch&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;16 路、128 路测试均通过&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;简化客户端未复现生产故障&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;其中一次独立 Go 客户端通过测试时，真实 Rancher 连接在同一时间窗口报错。因此，“短请求正常”“独立测试通过”都不能证明间歇性故障不存在。&lt;/p&gt;&#10;&lt;p&gt;取证链路本身也要校验。期间一次 SSH 上传的压缩数据校验失败，另一次长测试的 SSH 回传中断，这两次都没有作为有效测试结果。后续执行诊断程序前，分别校验压缩包和可执行文件的 SHA-256；传输复测三次通过，但那次异常的原因没有确证，也不能用来证明物理 CPU 损坏。&lt;/p&gt;&#10;&lt;h2 id="用重启和-cpu-类型做对照"&gt;&lt;a href="#%e7%94%a8%e9%87%8d%e5%90%af%e5%92%8c-cpu-%e7%b1%bb%e5%9e%8b%e5%81%9a%e5%af%b9%e7%85%a7" class="header-anchor"&gt;&lt;/a&gt;用重启和 CPU 类型做对照&#10;&lt;/h2&gt;&lt;p&gt;证书、数据库和网卡配置检查没有给出直接修复依据后，先尝试保留原数据的重启，再改变一个配置项。&lt;/p&gt;&#10;&lt;p&gt;以下时间均为 2026 年 11 月 7 日北京时间：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;操作&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;结果&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;18:00 左右原版本滚动重启 Rancher&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;kube-state-metrics 在 18:00:38 仍报 TLS 错误&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;18:04:55 K3s 重启恢复&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;18:08:00 再次出现 TLS 错误&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;保持原 CPU 类型，正常关闭再启动虚拟机，18:09:55 K3s 恢复&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;本次启动日志在 18:10:03 已出现同类错误&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;仅将 CPU 类型改为 host，再正常启动，18:16:54 K3s 恢复&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;连续 15 分钟观察无新增错误，18:34:24 复核仍为零&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;每一步都保留原磁盘、证书和持久卷，不卸载 K3s，也不重新安装 Rancher。最后一次配置差异只有：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;-cpu: x86-64-v2-AES&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+cpu: host&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;操作步骤如下，&lt;code&gt;&amp;lt;VMID&amp;gt;&lt;/code&gt; 需要替换为目标虚拟机编号：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;qm config &amp;lt;VMID&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;qm shutdown &amp;lt;VMID&amp;gt; --timeout &lt;span class="m"&gt;180&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;qm status &amp;lt;VMID&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 确认 status: stopped 后再继续；正常关机超时不要直接强制断电&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;qm &lt;span class="nb"&gt;set&lt;/span&gt; &amp;lt;VMID&amp;gt; --cpu host&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;qm start &amp;lt;VMID&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;若没有改善，可以按同样的正常关机流程，将 CPU 类型恢复为记录下来的原值。本次因为观察结果改善，保留了 &lt;code&gt;host&lt;/code&gt;。&lt;/p&gt;&#10;&lt;h2 id="为什么-cpu-类型会影响-tls"&gt;&lt;a href="#%e4%b8%ba%e4%bb%80%e4%b9%88-cpu-%e7%b1%bb%e5%9e%8b%e4%bc%9a%e5%bd%b1%e5%93%8d-tls" class="header-anchor"&gt;&lt;/a&gt;为什么 CPU 类型会影响 TLS&#10;&lt;/h2&gt;&lt;p&gt;虚拟 CPU 类型决定 guest 能看到哪些指令特性，并不只是修改一个显示名称。&lt;a class="link" href="https://github.com/proxmox/pve-docs/blob/master/qm.adoc" target="_blank" rel="noopener"&#10; &gt;Proxmox 文档&lt;/a&gt;说明，&lt;code&gt;host&lt;/code&gt; 会将宿主机 CPU 特性暴露给虚拟机；跨不同 CPU 的在线迁移则需要考虑兼容性。&lt;/p&gt;&#10;&lt;p&gt;原来的 &lt;code&gt;x86-64-v2-AES&lt;/code&gt; 配置暴露了 AES，但没有暴露 &lt;code&gt;PCLMULQDQ&lt;/code&gt;。在 &lt;a class="link" href="https://github.com/golang/go/blob/go1.24.10/src/crypto/tls/cipher_suites.go" target="_blank" rel="noopener"&#10; &gt;Go 1.24.10 的 TLS 实现&lt;/a&gt;中，amd64 的 AES-GCM 加速判断需要同时满足多个条件：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;hasGCMAsmAMD64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;X86&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HasAES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;X86&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HasPCLMULQDQ&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;X86&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HasSSE41&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;X86&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HasSSSE3&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;改为 &lt;code&gt;host&lt;/code&gt; 后，guest 获得了 &lt;code&gt;PCLMULQDQ&lt;/code&gt;、AVX2 等更多特性。同一个 Go 1.24.10 诊断程序的实际协商结果随之改变：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;CPU 类型&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;诊断连接的 TLS 加密套件&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;x86-64-v2-AES&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;TLS_CHACHA20_POLY1305_SHA256&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;host&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;TLS_AES_128_GCM_SHA256&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;在 &lt;code&gt;host&lt;/code&gt; 环境中，128 路 watch 全部正常结束，10,758 条 TLS 记录通过独立解密校验，没有异常 HTTP/2 帧或采集缺口。实际组件日志也停止出现原来的错误。&lt;/p&gt;&#10;&lt;p&gt;这形成了一条有实际对照支持的解释：CPU 特性变化改变了加密和相关代码的执行路径，新的路径避开了本次故障的触发条件。&lt;/p&gt;&#10;&lt;p&gt;但它还不能证明 ChaCha20 算法本身有问题，也不能证明某条物理 CPU 指令损坏。&lt;code&gt;host&lt;/code&gt; 同时改变了多个 CPU 特性；原类型下的独立 ChaCha20 测试也曾通过。具体是某条优化路径、虚拟化状态处理，还是受执行时序影响的其他缺陷，仍需要更小的复现程序和更长时间的验证。&lt;/p&gt;&#10;&lt;h2 id="恢复验证和重建判断"&gt;&lt;a href="#%e6%81%a2%e5%a4%8d%e9%aa%8c%e8%af%81%e5%92%8c%e9%87%8d%e5%bb%ba%e5%88%a4%e6%96%ad" class="header-anchor"&gt;&lt;/a&gt;恢复验证和重建判断&#10;&lt;/h2&gt;&lt;p&gt;修改后检查了 37 个运行中 Pod 的日志，未检出上述三类错误。持续观察覆盖 K3s、Rancher、metrics-server、kube-state-metrics 和 cert-manager，结束后再次核对：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;所有常驻 Pod 就绪，API &lt;code&gt;/readyz&lt;/code&gt; 返回 &lt;code&gt;ok&lt;/code&gt;。&lt;/li&gt;&#10;&lt;li&gt;Rancher 聚合 API 为 &lt;code&gt;Available=True&lt;/code&gt;。&lt;/li&gt;&#10;&lt;li&gt;4 个 PV/PVC 的 UID 和绑定关系与重启前一致。&lt;/li&gt;&#10;&lt;li&gt;10 个 Argo CD 应用均为 &lt;code&gt;Synced / Healthy&lt;/code&gt;。&lt;/li&gt;&#10;&lt;li&gt;节点心跳和资源指标持续更新，系统状态为 &lt;code&gt;running&lt;/code&gt;。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这些检查支持保留当前配置继续运行，没有必要因为日志中出现 TLS 错误就清空数据库、重新签发证书或重建集群。&lt;/p&gt;&#10;&lt;p&gt;如果最终确实需要重建，也应先保留数据库、server token 和业务卷数据。K3s 的 &lt;a class="link" href="https://docs.k3s.io/datastore/backup-restore" target="_blank" rel="noopener"&#10; &gt;备份恢复文档&lt;/a&gt;特别要求同时保存 server token；GitOps 仓库可以重建资源定义，但不会自动恢复本地持久卷内容。&lt;/p&gt;&#10;&lt;p&gt;这次排查中最有价值的做法，是将每个判断绑定到可验证的证据：区分日志条数和故障次数，区分客户端包装错误和服务端原始错误，验证取证数据本身，再通过保留数据、逐项变更的对照决定下一步。最终获得了有效的运行配置，而没有用重装掩盖尚未弄清的原因。&lt;/p&gt;&#10;</description></item></channel></rss>