<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>集群升级 on 维克的博客</title><link>https://blogs.wuvikr.top/tags/%E9%9B%86%E7%BE%A4%E5%8D%87%E7%BA%A7/</link><description>Recent content in 集群升级 on 维克的博客</description><generator>Hugo</generator><language>en</language><lastBuildDate>Wed, 09 Sep 2026 14:26:14 +0800</lastBuildDate><atom:link href="https://blogs.wuvikr.top/tags/%E9%9B%86%E7%BE%A4%E5%8D%87%E7%BA%A7/index.xml" rel="self" type="application/rss+xml"/><item><title>K8s 集群升级</title><link>https://blogs.wuvikr.top/posts/k8s%E9%9B%86%E7%BE%A4%E5%8D%87%E7%BA%A7/</link><pubDate>Wed, 09 Sep 2026 14:26:14 +0800</pubDate><guid>https://blogs.wuvikr.top/posts/k8s%E9%9B%86%E7%BE%A4%E5%8D%87%E7%BA%A7/</guid><description>&lt;p>Kubernetes 集群的大版本（跨次要版本）升级是一项复杂且高风险的运维操作。为了确保业务连续性，必须遵循严格的规范。以下是升级的核心原则、标准流程以及可能遇到的关键问题。&lt;/p>
&lt;h1 id="1-大版本升级的核心原则">1. 大版本升级的核心原则&lt;/h1>
&lt;ol>
&lt;li>&lt;strong>逐级递进，严禁跨版本&lt;/strong>：Kubernetes 不支持跨多个次要版本直接升级（例如不能从 1.24 直接升级到 1.26），必须按照&lt;code>1.24 → 1.25 → 1.26&lt;/code>的顺序逐版本进行。每一跳都需要完成控制面和节点的升级与验证。&lt;/li>
&lt;li>&lt;strong>组件版本兼容策略&lt;/strong>：
&lt;ul>
&lt;li>&lt;strong>控制面&lt;/strong>：&lt;code>kube-apiserver&lt;/code> 版本最高且需最先升级，&lt;code>controller-manager&lt;/code> 和 &lt;code>scheduler&lt;/code> 版本应小于或等于 &lt;code>apiserver&lt;/code>。&lt;/li>
&lt;li>&lt;strong>kubelet&lt;/strong>：节点上的 &lt;code>kubelet&lt;/code> 版本必须小于或等于 &lt;code>apiserver&lt;/code>，且不能低于 &lt;code>apiserver&lt;/code> 的前一个次要版本（例如 apiserver 为 v1.28 时，kubelet 可以是 v1.28 或 v1.27）。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>先升级控制面，再升级节点&lt;/strong>：必须先完成 Master 节点（控制平面）的升级，确认稳定后再分批升级 Worker 节点。&lt;/li>
&lt;li>&lt;strong>第三方组件兼容性检查&lt;/strong>：升级前必须确认 CNI 插件（如 Calico/Cilium）、CoreDNS、kube-proxy 以及 Ingress 控制器等是否支持目标版本。通常建议先升级 CNI，CoreDNS 则与 K8s 版本强绑定，需查阅官方对应表。&lt;/li>
&lt;/ol>
&lt;h1 id="2-标准升级流程">2. 标准升级流程&lt;/h1>
&lt;ol>
&lt;li>&lt;strong>升级前准备&lt;/strong>：
&lt;ul>
&lt;li>检查集群健康状态，确保所有节点为 Ready，无 CrashLoopBackOff 的 Pod。&lt;/li>
&lt;li>&lt;strong>备份关键数据&lt;/strong>：必须备份 etcd 数据、证书文件及核心配置文件，以防升级失败导致数据丢失。&lt;/li>
&lt;li>检查并处理废弃 API（Deprecated APIs），高版本可能会移除旧版 API，导致 HPA 或 Ingress 等资源失效。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>升级控制面&lt;/strong>：升级 &lt;code>kubeadm&lt;/code>，执行 &lt;code>kubeadm upgrade apply&lt;/code>，依次更新 &lt;code>kube-apiserver&lt;/code>、&lt;code>kube-controller-manager&lt;/code> 和 &lt;code>kube-scheduler&lt;/code>。&lt;/li>
&lt;li>&lt;strong>升级工作节点&lt;/strong>：
&lt;ul>
&lt;li>腾空节点（Cordon &amp;amp; Drain），将 Pod 驱逐到其他节点。&lt;/li>
&lt;li>升级节点的 &lt;code>kubeadm&lt;/code>、&lt;code>kubelet&lt;/code> 和 &lt;code>kubectl&lt;/code>。&lt;/li>
&lt;li>解除节点保护（Uncordon），使其重新加入调度。&lt;/li>
&lt;li>建议在生产环境中逐个节点离线升级后再上线，避免全部同时升级。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h1 id="3-升级过程中可能遇到的问题">3. 升级过程中可能遇到的问题&lt;/h1>
&lt;ol>
&lt;li>&lt;strong>废弃 API 导致业务失效&lt;/strong>：高版本 K8s 会废弃旧版 API。例如升级到 1.22+ 时，&lt;code>networking.k8s.io/v1beta1&lt;/code> 的 Ingress 将不再可用；升级到 1.18+ 后，HPA 的 &lt;code>apiVersion&lt;/code> 必须切换为 &lt;code>apps/v1&lt;/code>，否则功能会失效。&lt;/li>
&lt;li>&lt;strong>容器运行时变更&lt;/strong>：从 Kubernetes 1.24 开始，不再支持将 Docker 作为内置容器运行时。若从 1.22/1.23 升级，必须提前将节点运行时从 Docker 迁移到 containerd，否则升级会失败。&lt;/li>
&lt;li>&lt;strong>节点排水（Drain）失败与 PDB 冲突&lt;/strong>：在驱逐 Pod 时，如果配置了 Pod Disruption Budget (PDB) 且当前可用副本数达到下限，Pod 将无法被驱逐，导致节点升级超时或失败。&lt;/li>
&lt;li>&lt;strong>网络连通性中断&lt;/strong>：如果 Pod 通过 &lt;code>LoadBalancer&lt;/code> 类型的 Service 访问同节点上的另一个 Pod，且 Service 的 &lt;code>externalTrafficPolicy&lt;/code> 设置为 &lt;code>Local&lt;/code>，在节点轮转升级后，两个 Pod 可能不再位于同一节点，导致网络不通。&lt;/li>
&lt;li>&lt;strong>自定义配置被覆盖&lt;/strong>：如果曾通过非产品化方式（如直接登录节点修改 kubelet 配置、打开 SWAP 分区等）更改过节点配置，升级过程中这些自定义配置可能会被重置或覆盖，甚至导致升级失败。&lt;/li>
&lt;li>&lt;strong>磁盘空间不足&lt;/strong>：升级过程需要下载软件包并可能产生临时文件。如果节点磁盘水位过高（建议预留至少 20% 空间），可能导致 Pod 被驱逐或升级失败。&lt;/li>
&lt;li>&lt;strong>Cgroup v1 兼容性问题&lt;/strong>：在较新的版本（如 1.36）中，kubelet 默认仅支持 Cgroup v2。如果节点操作系统仍在使用 Cgroup v1，可能会导致 kubelet 启动失败或节点 NotReady。&lt;/li>
&lt;/ol></description></item></channel></rss>