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

k8s在1.22版本新增了安全sysctlc参数net.ipv4.ip_unprivileged_port_start
, 且需要将内核版本升级至4.4以上: https://kubernetes.io/docs/tasks/administer-cluster/sysctl-cluster/#enabling-unsafe-sysctls
我的sysctl配置
1 | # 将桥接的IPV4流量传递到iptables的链, Disable the swap... |
linux内核升级, 参考站内: linux内核升级过程篇
k3s进行基础升级
Server节点
- 修改/etc/profile
1 | k3s |
- source /etc/profile
- curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
Agent节点
- 修改/etc/profile
1 | k3s |
- source /etc/profile
- curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
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-upgrad-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=:NoSchedulenode.kubernetes.io/unreachable=:NoSchedulenode.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 |