跳至主要内容

自动升级

概述

您可以使用 Rancher 的 system-upgrade-controller 来管理 K3s 集群升级。这是一种 Kubernetes 原生的集群升级方法。它利用自定义资源定义 (CRD)、一个plan和一个控制器

该计划定义了升级策略和要求。它还通过标签选择器定义哪些节点应该被升级。请参见下文了解适用于升级 K3s 集群的默认计划。有关更高级的计划配置选项,请查看CRD

控制器通过监视计划并选择节点来安排升级,以便在节点上运行升级作业。当作业成功运行完成后,控制器将相应地标记其运行所在的节点。

注意

启动的升级作业必须具有很高的权限。它配置了以下内容

  • 主机IPCNETPID命名空间
  • CAP_SYS_BOOT功能
  • 主机根目录挂载到/host,具有读写权限

要以这种方式自动执行升级,您必须执行以下操作

  1. 将 system-upgrade-controller 安装到您的集群中
  2. 配置计划
警告

如果 K3s 集群由 Rancher 管理,则应使用 Rancher UI 来管理升级。

  • 如果 K3s 集群已导入到 Rancher,则 Rancher 将管理 system-upgrade-controller 部署和计划。请勿遵循此页面上的步骤。
  • 如果 K3s 集群由 Rancher 预配,则 Rancher 将使用系统代理来管理版本升级。请勿遵循此页面上的步骤。
  • 如果 K3s 集群**未**由 Rancher 管理,则可以按照以下步骤操作。

有关 system-upgrade-controller 的设计和架构或其与 K3s 集成的更多详细信息,请参阅以下 Git 存储库

提示

尝试升级到新版本的 K3s 时,Kubernetes 版本偏差策略适用。确保您的计划在升级时不会跳过中间的次要版本。system-upgrade-controller 本身不会防止对 Kubernetes 版本进行不受支持的更改。

安装 system-upgrade-controller

system-upgrade-controller 可以作为部署安装到您的集群中。部署需要一个 service-account、clusterRoleBinding 和一个 configmap。要安装这些组件,请运行以下命令

kubectl apply -f https://github.com/rancher/system-upgrade-controller/releases/latest/download/system-upgrade-controller.yaml

控制器可以通过前面提到的 configmap 进行配置和自定义,但必须重新部署控制器才能应用更改。

为了能够应用计划,必须部署 system-upgrade-controller CRD

kubectl apply -f https://github.com/rancher/system-upgrade-controller/releases/latest/download/crd.yaml

配置计划

建议您至少创建两个计划:一个用于升级服务器(控制平面)节点的计划,另一个用于升级代理节点的计划。您可以根据需要创建其他计划,以控制整个节点的升级推出。创建计划后,控制器将获取它们并开始升级您的集群。

以下两个示例计划将把您的集群升级到 K3s v1.24.6+k3s1

# Server plan
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
name: server-plan
namespace: system-upgrade
spec:
concurrency: 1
cordon: true
nodeSelector:
matchExpressions:
- key: node-role.kubernetes.io/control-plane
operator: In
values:
- "true"
serviceAccountName: system-upgrade
upgrade:
image: rancher/k3s-upgrade
version: v1.24.6+k3s1
---
# Agent plan
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
name: agent-plan
namespace: system-upgrade
spec:
concurrency: 1
cordon: true
nodeSelector:
matchExpressions:
- key: node-role.kubernetes.io/control-plane
operator: DoesNotExist
prepare:
args:
- prepare
- server-plan
image: rancher/k3s-upgrade
serviceAccountName: system-upgrade
upgrade:
image: rancher/k3s-upgrade
version: v1.24.6+k3s1

关于这些计划,有一些重要事项需要说明

  1. 计划必须在控制器部署的同一命名空间中创建。

  2. concurrency字段指示可以同时升级多少个节点。

  3. server-plan 通过指定一个标签选择器来定位服务器节点,该选择器选择具有node-role.kubernetes.io/control-plane标签的节点。agent-plan 通过指定一个标签选择器来定位代理节点,该选择器选择不具有该标签的节点。

  4. agent-plan 中的prepare步骤将导致该计划的升级作业在执行之前等待 server-plan 完成。

  5. 两个计划的version字段都设置为 v1.24.6+k3s1。或者,您可以省略version字段并将channel字段设置为解析为 K3s 版本的 URL。这将导致控制器监视该 URL,并在其解析为新版本时随时升级集群。这与发布通道配合使用效果很好。因此,您可以使用以下通道配置计划,以确保您的集群始终自动升级到最新稳定的 K3s 版本

apiVersion: upgrade.cattle.io/v1
kind: Plan
...
spec:
...
channel: https://update.k3s.io/v1-release/channels/stable

如前所述,一旦控制器检测到创建了计划,升级将立即开始。更新计划将导致控制器重新评估计划并确定是否需要进行其他升级。

您可以通过查看计划和作业(通过 kubectl)来监视升级进度

kubectl -n system-upgrade get plans -o yaml
kubectl -n system-upgrade get jobs -o yaml

降级预防

版本门

从 2023 年 7 月发布开始(v1.27.4+k3s1v1.26.7+k3s1v1.25.12+k3s1v1.24.16+k3s1

Kubernetes 不支持控制平面组件的降级。升级计划使用的 k3s-upgrade 镜像将拒绝降级 K3s,导致计划失败并使您的节点处于隔离状态。

这是一个示例集群,显示了失败的升级 pod 和隔离的节点

ubuntu@user:~$ kubectl get pods -n system-upgrade
NAME READY STATUS RESTARTS AGE
apply-k3s-server-on-ip-172-31-0-16-with-7af95590a5af8e8c3-2cdc6 0/1 Error 0 9m25s
apply-k3s-server-on-ip-172-31-10-23-with-7af95590a5af8e8c-9xvwg 0/1 Error 0 14m
apply-k3s-server-on-ip-172-31-13-213-with-7af95590a5af8e8-8j72v 0/1 Error 0 18m
system-upgrade-controller-7c4b84d5d9-kkzr6 1/1 Running 0 20m
ubuntu@user:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-172-31-0-16 Ready,SchedulingDisabled control-plane,etcd,master 19h v1.27.4+k3s1
ip-172-31-10-23 Ready,SchedulingDisabled control-plane,etcd,master 19h v1.27.4+k3s1
ip-172-31-13-213 Ready,SchedulingDisabled control-plane,etcd,master 19h v1.27.4+k3s1
ip-172-31-2-13 Ready <none> 19h v1.27.4+k3s1

您可以通过以下任一方法将隔离的节点恢复到服务状态

  • 更改计划上的版本或通道以定位与集群上当前运行的版本相同或更新的版本,以便计划成功。
  • 删除计划并手动取消隔离节点。使用kubectl get plan -n system-upgrade查找计划名称,然后使用kubectl delete plan -n system-upgrade PLAN_NAME删除它。删除计划后,使用kubectl uncordon NODE_NAME取消隔离每个节点。