集群升级与维护概念引入你还记得第一次用 Kind 创建集群的场景吗#02创建集群只是开始——生产环境的集群需要定期升级来修漏洞、加功能。集群不是装完就一劳永逸的。K8s 每 4 个月发一个新版本每个版本维护约 14 个月。不升级意味着 安全漏洞没人修 Bug 永远存在 新特性用不上集群运维的三大核心任务集群运维三大任务滚动升级控制面定期备份过期前续期 升级kubeadm upgrade 备份etcd snapshot 证书certs check/renewControl PlaneS3/远程存储证书文件学完本篇你将能够用 kubeadm 执行集群控制面的滚动升级最小化停机时间用 etcdctl 创建和恢复 etcd 快照应对集群灾难场景检查和续期集群证书防止证书过期导致集群不可用原理讲解etcd 备份与恢复etcd 是 K8s 的大脑——所有集群状态都存在里面。etcd 坏了 集群失忆 灾难。# 安装 etcdctlETCD_VERv3.5.17curl-Lhttps://github.com/etcd-io/etcd/releases/download/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz|tarxzsudomvetcd-${ETCD_VER}-linux-amd64/etcdctl /usr/local/bin/# 创建快照备份ETCDCTL_API3etcdctl snapshot save /backup/etcd-$(date%Y%m%d).db\--cacert/etc/kubernetes/pki/etcd/ca.crt\--cert/etc/kubernetes/pki/etcd/server.crt\--key/etc/kubernetes/pki/etcd/server.key# 验证快照ETCDCTL_API3etcdctl snapshot status /backup/etcd-20260722.db --write-outtable# 恢复快照ETCDCTL_API3etcdctl snapshot restore /backup/etcd-20260722.db\--data-dir/var/lib/etcd-restore# 然后修改 etcd manifest 的>恢复流程备份流程正常运行etcdAPI Serveretcdctl snapshot save→ etcd-20260722.dbetcdctl snapshot restore→ 恢复数据目录建议说明备份频率每日自动备份CronJob 或 systemd timer备份位置异地存储S3/GCS/NFS别和集群放在同一台机器验证备份每月做一次恢复演练保留策略保留最近30 天的备份kubeadm 集群升级升级有严格的顺序和版本限制版本升级规则 - 不能跳版本1.28 → 1.29 ✅ 1.28 → 1.30 ❌ - 控制面先升级再升级节点 - kubectl / kubelet 版本 ≤ kube-apiserver 版本Step 3: 升级工作节点kubectl drain ← 先排空kubeadm upgrade node升级 kubelet 重启kubectl uncordon ← 恢复调度Step 2: 升级控制面kubeadm upgrade apply v1.29.x升级 kubelet kubectl重启 kubeletStep 1: 升级 kubeadmapt upgrade kubeadmkubeadm upgrade plan ← 检查升级路径# 1. 查看当前版本kubectl version--short# 2. 查看升级计划kubeadm upgrade plan# 3. 执行控制面升级kubeadm upgrade apply v1.29.6# 4. 升级 kubelet 和 kubectlaptinstall-ykubelet1.29.6-*kubectl1.29.6-* systemctl daemon-reloadsystemctl restart kubelet# 5. 升级工作节点在每个节点上kubectl drain worker-1 --ignore-daemonsets --delete-emptydir-data# SSH 到 worker-1kubeadm upgradenodeaptinstall-ykubelet1.29.6-* systemctl restart kubelet kubectl uncordon worker-1证书管理K8s 控制面的所有组件都用证书做 TLS 通信。证书有有效期——过期了控制面就挂了。# 检查所有证书的过期时间kubeadm certs check-expiration# 输出# [check-expiration]# admin.conf Jul 22, 2027 15:00 UTC 364d# apiserver Jul 22, 2027 15:00 UTC 364d# apiserver-kubelet-client Jul 22, 2027 15:00 UTC 364d# ...# 续期所有证书kubeadm certs renew all# 续期后重启控制面组件才能生效#kubeadm 自动处理 manifest 目录变化kubelet 会重启静态 Pod关键证书ca.crtK8s CA 根证书10 年有效apiserver.crtAPI Server 服务端证书etcd/server.crtetcd 服务端证书front-proxy-client.crt聚合 API 客户端证书⚠️ CA 证书过期 整个集群需要重建定期用 kubeadm certs check-expiration 检查节点维护Cordon 与 Drain命令作用Pod 行为kubectl cordon标记节点为不可调度已有 Pod 继续运行新 Pod 不会调度过来kubectl drain排空节点驱逐所有 Pod 标记不可调度kubectl uncordon恢复调度允许新 Pod 调度过来# 维护前kubectl cordon worker-1# 1. 先阻止新 Podkubectl drain worker-1# 2. 再排空已有 Pod--ignore-daemonsets# DaemonSet 不管--delete-emptydir-data# 允许删除 emptydir 数据--timeout300s# 最多等 5 分钟# 维护完成后kubectl uncordon worker-1# 3. 恢复调度动手实验配套实验位于docs/labs/beginner/cluster-upgrade/Kind 用 Docker 容器模拟节点升级流程有所不同。本实验模拟核心操作。步骤 1部署实验环境cddocs/labs/beginner/cluster-upgradebashsetup.sh步骤 2检查当前版本kubectl version--short2/dev/null||kubectl version kubectl get nodes-owide步骤 3模拟 etcd 备份# etcdctl 在 etcd 静态 Pod 容器内不在 Kind 外层容器中# 通过 kubectl exec 进入 etcd Pod 执行备份ETCD_POD$(kubectl get pods-nkube-system-lcomponentetcd-ojsonpath{.items[0].metadata.name})kubectlexec-nkube-system$ETCD_POD--\etcdctl snapshot save /tmp/etcd-backup.db\--cacert/etc/kubernetes/pki/etcd/ca.crt\--cert/etc/kubernetes/pki/etcd/server.crt\--key/etc/kubernetes/pki/etcd/server.key# 验证快照kubectlexec-nkube-system$ETCD_POD--\etcdctl snapshot status /tmp/etcd-backup.db --write-outtable步骤 4检查证书过期时间dockerexeck8s-guide-control-plane kubeadm certs check-expiration步骤 5模拟节点 Cordon Uncordon# 获取节点名NODE$(kubectl get nodes-ojsonpath{.items[0].metadata.name})# Cordon不可调度kubectl cordon$NODEkubectl get nodes# 观察 STATUS 列出现 SchedulingDisabled# 尝试创建新 Pod会被挂起kubectl run test-schedule--imagebusybox:1.36--restartNever --sleep10kubectl get pods-w# 观察 test-schedule 处于 Pending# Uncordon恢复调度kubectl uncordon$NODEkubectl get pods# test-schedule 应该被调度并完成步骤 6清理bashteardown.sh自检问题[基础]kubectl cordon和kubectl drain有什么区别什么时候用哪个[理解]K8s 为什么不允许跳版本升级如 1.28 → 1.30etcd 备份为什么必须异地存储[应用]你管理一个 3 节点生产集群K8s 1.28需要升级到 1.29。写出完整的升级步骤和执行顺序。查看答案Cordon只是标记节点不可调度不影响已有 Pod。Drain会驱逐所有 Pod 然后标记不可调度。Cordon 用在我想让这个节点慢慢闲置比如怀疑硬件有问题但不确定Drain 用在我现在就要把节点拿去做维护比如升级内核、换硬盘。不允许跳版本是因为 API 废弃deprecation策略——K8s API 的 Beta 版本在 3 个版本后移除。如果你从 1.25 跳到 1.29中间可能有些 API 版本已被移除你的老 YAML 直接报错找不到。逐版本升级可以让你在每个版本检测 API 废弃警告并修复。etcd 备份必须异地因为如果备份和集群在同一台机器/磁盘上硬件故障磁盘坏、机房断电会同时毁掉集群和备份。完整步骤# 准备工作# 1. etcd 备份etcdctl snapshot save /backup/pre-upgrade-1.29.db# 2. 确认所有节点状态正常kubectl get nodeskubectl get pods-A|grep-vRunning# 控制面节点# 3. 升级 kubeadmaptinstall-ykubeadm1.29.6-*# 4. 查看升级计划kubeadm upgrade plan# 5. 执行升级kubeadm upgrade apply v1.29.6# 6. 升级 kubeletaptinstall-ykubelet1.29.6-*kubectl1.29.6-* systemctl restart kubelet# 工作节点逐个操作# 7. drainkubectl drain worker-1 --ignore-daemonsets --delete-emptydir-data# 8. 在 worker-1 上升级 kubeadm kubelet# 9. uncordonkubectl uncordon worker-1# 10. 重复 7-9 直到所有工作节点升级完毕# 验证kubectl versionkubectl get nodes下一步运维技能齐了。最后一篇——把 29 篇的知识全部串起来部署一个完整的微服务应用→ 30. 综合实战微服务部署 本文来自 K8s Guide —— 开源免费的 Kubernetes 中文学习指南️ 初学者轨道 面试轨道从零基础到拿 Offer 一站式覆盖 每篇文章配套 Kind 实验脚本本地一键运行 本文源码docs/beginner/20-gateway-api.md⭐ 如果对你有帮助欢迎 Star github.com/callmebg/k8s-guide
19-集群升级与维护
集群升级与维护概念引入你还记得第一次用 Kind 创建集群的场景吗#02创建集群只是开始——生产环境的集群需要定期升级来修漏洞、加功能。集群不是装完就一劳永逸的。K8s 每 4 个月发一个新版本每个版本维护约 14 个月。不升级意味着 安全漏洞没人修 Bug 永远存在 新特性用不上集群运维的三大核心任务集群运维三大任务滚动升级控制面定期备份过期前续期 升级kubeadm upgrade 备份etcd snapshot 证书certs check/renewControl PlaneS3/远程存储证书文件学完本篇你将能够用 kubeadm 执行集群控制面的滚动升级最小化停机时间用 etcdctl 创建和恢复 etcd 快照应对集群灾难场景检查和续期集群证书防止证书过期导致集群不可用原理讲解etcd 备份与恢复etcd 是 K8s 的大脑——所有集群状态都存在里面。etcd 坏了 集群失忆 灾难。# 安装 etcdctlETCD_VERv3.5.17curl-Lhttps://github.com/etcd-io/etcd/releases/download/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz|tarxzsudomvetcd-${ETCD_VER}-linux-amd64/etcdctl /usr/local/bin/# 创建快照备份ETCDCTL_API3etcdctl snapshot save /backup/etcd-$(date%Y%m%d).db\--cacert/etc/kubernetes/pki/etcd/ca.crt\--cert/etc/kubernetes/pki/etcd/server.crt\--key/etc/kubernetes/pki/etcd/server.key# 验证快照ETCDCTL_API3etcdctl snapshot status /backup/etcd-20260722.db --write-outtable# 恢复快照ETCDCTL_API3etcdctl snapshot restore /backup/etcd-20260722.db\--data-dir/var/lib/etcd-restore# 然后修改 etcd manifest 的>恢复流程备份流程正常运行etcdAPI Serveretcdctl snapshot save→ etcd-20260722.dbetcdctl snapshot restore→ 恢复数据目录建议说明备份频率每日自动备份CronJob 或 systemd timer备份位置异地存储S3/GCS/NFS别和集群放在同一台机器验证备份每月做一次恢复演练保留策略保留最近30 天的备份kubeadm 集群升级升级有严格的顺序和版本限制版本升级规则 - 不能跳版本1.28 → 1.29 ✅ 1.28 → 1.30 ❌ - 控制面先升级再升级节点 - kubectl / kubelet 版本 ≤ kube-apiserver 版本Step 3: 升级工作节点kubectl drain ← 先排空kubeadm upgrade node升级 kubelet 重启kubectl uncordon ← 恢复调度Step 2: 升级控制面kubeadm upgrade apply v1.29.x升级 kubelet kubectl重启 kubeletStep 1: 升级 kubeadmapt upgrade kubeadmkubeadm upgrade plan ← 检查升级路径# 1. 查看当前版本kubectl version--short# 2. 查看升级计划kubeadm upgrade plan# 3. 执行控制面升级kubeadm upgrade apply v1.29.6# 4. 升级 kubelet 和 kubectlaptinstall-ykubelet1.29.6-*kubectl1.29.6-* systemctl daemon-reloadsystemctl restart kubelet# 5. 升级工作节点在每个节点上kubectl drain worker-1 --ignore-daemonsets --delete-emptydir-data# SSH 到 worker-1kubeadm upgradenodeaptinstall-ykubelet1.29.6-* systemctl restart kubelet kubectl uncordon worker-1证书管理K8s 控制面的所有组件都用证书做 TLS 通信。证书有有效期——过期了控制面就挂了。# 检查所有证书的过期时间kubeadm certs check-expiration# 输出# [check-expiration]# admin.conf Jul 22, 2027 15:00 UTC 364d# apiserver Jul 22, 2027 15:00 UTC 364d# apiserver-kubelet-client Jul 22, 2027 15:00 UTC 364d# ...# 续期所有证书kubeadm certs renew all# 续期后重启控制面组件才能生效#kubeadm 自动处理 manifest 目录变化kubelet 会重启静态 Pod关键证书ca.crtK8s CA 根证书10 年有效apiserver.crtAPI Server 服务端证书etcd/server.crtetcd 服务端证书front-proxy-client.crt聚合 API 客户端证书⚠️ CA 证书过期 整个集群需要重建定期用 kubeadm certs check-expiration 检查节点维护Cordon 与 Drain命令作用Pod 行为kubectl cordon标记节点为不可调度已有 Pod 继续运行新 Pod 不会调度过来kubectl drain排空节点驱逐所有 Pod 标记不可调度kubectl uncordon恢复调度允许新 Pod 调度过来# 维护前kubectl cordon worker-1# 1. 先阻止新 Podkubectl drain worker-1# 2. 再排空已有 Pod--ignore-daemonsets# DaemonSet 不管--delete-emptydir-data# 允许删除 emptydir 数据--timeout300s# 最多等 5 分钟# 维护完成后kubectl uncordon worker-1# 3. 恢复调度动手实验配套实验位于docs/labs/beginner/cluster-upgrade/Kind 用 Docker 容器模拟节点升级流程有所不同。本实验模拟核心操作。步骤 1部署实验环境cddocs/labs/beginner/cluster-upgradebashsetup.sh步骤 2检查当前版本kubectl version--short2/dev/null||kubectl version kubectl get nodes-owide步骤 3模拟 etcd 备份# etcdctl 在 etcd 静态 Pod 容器内不在 Kind 外层容器中# 通过 kubectl exec 进入 etcd Pod 执行备份ETCD_POD$(kubectl get pods-nkube-system-lcomponentetcd-ojsonpath{.items[0].metadata.name})kubectlexec-nkube-system$ETCD_POD--\etcdctl snapshot save /tmp/etcd-backup.db\--cacert/etc/kubernetes/pki/etcd/ca.crt\--cert/etc/kubernetes/pki/etcd/server.crt\--key/etc/kubernetes/pki/etcd/server.key# 验证快照kubectlexec-nkube-system$ETCD_POD--\etcdctl snapshot status /tmp/etcd-backup.db --write-outtable步骤 4检查证书过期时间dockerexeck8s-guide-control-plane kubeadm certs check-expiration步骤 5模拟节点 Cordon Uncordon# 获取节点名NODE$(kubectl get nodes-ojsonpath{.items[0].metadata.name})# Cordon不可调度kubectl cordon$NODEkubectl get nodes# 观察 STATUS 列出现 SchedulingDisabled# 尝试创建新 Pod会被挂起kubectl run test-schedule--imagebusybox:1.36--restartNever --sleep10kubectl get pods-w# 观察 test-schedule 处于 Pending# Uncordon恢复调度kubectl uncordon$NODEkubectl get pods# test-schedule 应该被调度并完成步骤 6清理bashteardown.sh自检问题[基础]kubectl cordon和kubectl drain有什么区别什么时候用哪个[理解]K8s 为什么不允许跳版本升级如 1.28 → 1.30etcd 备份为什么必须异地存储[应用]你管理一个 3 节点生产集群K8s 1.28需要升级到 1.29。写出完整的升级步骤和执行顺序。查看答案Cordon只是标记节点不可调度不影响已有 Pod。Drain会驱逐所有 Pod 然后标记不可调度。Cordon 用在我想让这个节点慢慢闲置比如怀疑硬件有问题但不确定Drain 用在我现在就要把节点拿去做维护比如升级内核、换硬盘。不允许跳版本是因为 API 废弃deprecation策略——K8s API 的 Beta 版本在 3 个版本后移除。如果你从 1.25 跳到 1.29中间可能有些 API 版本已被移除你的老 YAML 直接报错找不到。逐版本升级可以让你在每个版本检测 API 废弃警告并修复。etcd 备份必须异地因为如果备份和集群在同一台机器/磁盘上硬件故障磁盘坏、机房断电会同时毁掉集群和备份。完整步骤# 准备工作# 1. etcd 备份etcdctl snapshot save /backup/pre-upgrade-1.29.db# 2. 确认所有节点状态正常kubectl get nodeskubectl get pods-A|grep-vRunning# 控制面节点# 3. 升级 kubeadmaptinstall-ykubeadm1.29.6-*# 4. 查看升级计划kubeadm upgrade plan# 5. 执行升级kubeadm upgrade apply v1.29.6# 6. 升级 kubeletaptinstall-ykubelet1.29.6-*kubectl1.29.6-* systemctl restart kubelet# 工作节点逐个操作# 7. drainkubectl drain worker-1 --ignore-daemonsets --delete-emptydir-data# 8. 在 worker-1 上升级 kubeadm kubelet# 9. uncordonkubectl uncordon worker-1# 10. 重复 7-9 直到所有工作节点升级完毕# 验证kubectl versionkubectl get nodes下一步运维技能齐了。最后一篇——把 29 篇的知识全部串起来部署一个完整的微服务应用→ 30. 综合实战微服务部署 本文来自 K8s Guide —— 开源免费的 Kubernetes 中文学习指南️ 初学者轨道 面试轨道从零基础到拿 Offer 一站式覆盖 每篇文章配套 Kind 实验脚本本地一键运行 本文源码docs/beginner/20-gateway-api.md⭐ 如果对你有帮助欢迎 Star github.com/callmebg/k8s-guide