参考官网链接:https://docs.rancher.cn/docs/k3s/upgrades/_index/
注:如果要对 server/master 节点升级,绝对不要在流量高峰场景下进行
如果不希望清理所有容器及网络组件,不要轻易使用 k3s-killall.sh 脚本
官方文档描述升级过程为高可用模式,但最好还是在流量低峰期进行升级
否则可能会导致部署单元多个 Pod 都部署在同一节点,然后进行了 Pod 转移,如下

Kubernetes 在 1.22 版本新增了安全 sysctl 参数 net.ipv4.ip_unprivileged_port_start,且需要将内核版本升级至 4.4 以上:https://kubernetes.io/docs/tasks/administer-cluster/sysctl-cluster/#enabling-unsafe-sysctls
我的 sysctl 配置:
1 | # 将桥接的 IPv4 流量传递到 iptables 的链,禁用 swap |
Linux 内核升级,参考站内:linux 内核升级过程篇
K3s 进行基础升级
Server 节点
修改 /etc/profile:
1 | # k3s |
执行升级:
1 | source /etc/profile |
Agent 节点
修改 /etc/profile:
1 | #k3s |
执行升级:
1 | source /etc/profile |
K3s 进行自动升级 - system-upgrade-controller
如果 K3s 集群由 Rancher 管理,切记不要安装 system-upgrade-controller,而是使用 Rancher UI 来管理升级。
- 如果 K3s 集群是导入到 Rancher 的,Rancher 将管理 system-upgrade-controller 部署和计划。不需要安装
system-upgrade-controller。 - 如果 K3s 集群是由 Rancher 预配的,Rancher 将使用系统 Agent 来管理版本升级。不需要安装
system-upgrade-controller。 - 如果 K3s 集群不是由 Rancher 管理的,可以使用
system-upgrade-controller。
参考:https://docs.rancher.cn/docs/k3s/upgrades/automated/_index
适用于自建 K3s 集群,使用 Rancher 的 system-upgrade-controller 来管理手动/自动升级。
总共需要完成两步配置:
- 安装 system-upgrade-controller,会在集群内创建名为
plans.upgrade.cattle.io的 CRD - 配置更新计划。这里可以使用自动发现 release 模式,保证实时更新到最新版本,同时也可以创建升级到指定版本的一次性更新计划
安装 system-upgrade-controller
联网执行一句话:
1 | kubectl apply -f https://github.com/rancher/system-upgrade-controller/releases/latest/download/system-upgrade-controller.yaml |
更新配置存储在 ConfigMap,默认配置如下:
1 | apiVersion: v1 |
创建更新计划
按照官方文档说法,推荐使用两份计划,分别对应 server (master) 和 agent (worker) 节点的升级。
按照版本升级配置示例:
1 | # Server plan |
查看升级进度:
1 | kubectl -n system-upgrade get plans -o yaml |
使用 Rancher 管理 K3s 版本
- 进入 Rancher 首页
- 点击 Manage
- 选择对应集群,并点击 Edit Config,随后会跳至此页面

- 该计划会先更新 master,再更新 node
- 修改完配置后点击 Save,然后集群会默认安装
system-upgrade-controller,每更新一个节点时会将其置为Cordoned状态【并打上污点node.kubernetes.io/unschedulable=:NoSchedule/node.kubernetes.io/unreachable=:NoSchedule/node.kubernetes.io/unreachable=:NoExecute】,同时集群节点的更新状态会以如下方式展示

- 更新过程中不会影响正在运行的服务,但保险起见,尽量选择一个非流量高峰期
- 不需要关心节点在更新前是否配置了污点
- 更新过程中会在每个节点部署以
apply-k3s-worker-plan-on-开头的 Pod,此类 Pod 会保持一段时间的Ready状态,不需要过多关心 - 完成更新的节点会被打上以
plan.upgrade.cattle.io/k3s-{master/worker}-plan=开头的 Label
问题
参考:https://github.com/k3s-io/k3s/issues/6869
helm-install-traefik-h5gjd with errors in log
1 | Error: UPGRADE FAILED: rendered manifests contain a resource that already exists. Unable to continue with update: IngressRoute "traefik-dashboard" in namespace "kube-system" exists and cannot be imported into the current release: invalid ownership metadata; annotation validation error: missing key "meta.helm.sh/release-name": must be set to "traefik"; annotation validation error: missing key "meta.helm.sh/release-namespace": must be set to "kube-system" |
解决办法:annotations 补充缺失的 missing key
1 | # kubectl edit ingressroutes.traefik.containo.us -n kube-system traefik-dashboard |