Skip to content

Latest commit

 

History

History
 
 

12-升级k3s集群

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

升级 K3s 集群

当升级 K3s 时,K3s 服务会重启或停止,但 K3s 容器会继续运行。 要停止所有的 K3s 容器并重置容器的状态,可以使用 k3s-killall.sh 脚本。 killall 脚本清理容器、K3s 目录和网络组件,同时也删除了 iptables 链和所有相关规则。集群数据不会被删除。

手动升级

你可以通过使用安装脚本升级 K3s,或者手动安装所需版本的二进制文件。

注意: 升级时,先逐个升级 server 节点,然后再升级其他 agent 节点。

Channels 说明

通过安装脚本或使用我们的自动升级功能进行的升级可以绑定到不同的发布 channels。以下是可用的 channels。

CHANNEL 描 述
stable (默认)稳定版建议用于生产环境。这些版本已经过一段时间的社区强化。
latest 推荐使用最新版本尝试最新的功能。 这些版本还没有经过社区强化。
v1.19 (例子) 每一个支持的 Kubernetes 次要版本都有一个发布 channel,它们分别是v1.19v1.20v1.21。。这些 channel 会选择最新的可用补丁版本,不一定是稳定版本。

对于详细的最新 channels 列表,您可以访问k3s channel 服务 API。关于 channels 工作的更多技术细节,请参见channelserver 项目

使用安装脚本升级 K3s

要从旧版本升级 K3s,你可以使用相同的标志重新运行安装脚本:

  • 升级到最新 stable 版本
curl -sfL https://get.k3s.io | sh -
  • 升级到 latest 版本
curl -sfL https://get.k3s.io | INSTALL_K3S_CHANNEL=latest sh -
  • 升级到 v1.20 的最新版本
curl -sfL https://get.k3s.io | INSTALL_K3S_CHANNEL="v1.20" sh -
  • 升级到指定版本
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=vX.Y.Z-rc1 sh -

使用二进制文件手动升级 K3s

  1. 发布下载所需版本的 K3s 二进制文件
  2. 将下载的二进制文件复制到/usr/local/bin/k3s(或您所需的位置)
  3. 停止旧的 K3s 二进制文件
  4. 启动新的 K3s 二进制文件

自动升级

注意: 此功能从 v1.17.4+k3s1 开始提供支持。

你可以使用 Rancher 的 system-upgrad-controller 来管理 K3s 集群升级。这是一种 Kubernetes 原生的集群升级方法。它利用自定义资源定义(CRD)计划控制器,根据配置的计划安排升级。

控制器通过监控计划和选择要在其上运行升级 job 的节点来调度升级。计划通过标签选择器定义哪些节点应该升级。当一个 job 成功运行完成后,控制器会给它运行的节点打上相应的标签。

关于 system-upgrade-controller 的设计和架构或其与 K3s 集成的更多细节,请参见以下 Git 仓库:

要以这种方式进行自动升级,你必须:

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

安装 system-upgrade-controller

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

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

配置计划

建议您最少创建两个计划:升级 server(master)节点的计划和升级 agent(worker)节点的计划。根据需要,您可以创建其他计划来控制跨节点的滚动升级。以下两个示例计划将把您的集群升级到 K3s v1.20.4+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/master
      operator: In
      values:
      - "true"
  serviceAccountName: system-upgrade
  upgrade:
    image: rancher/k3s-upgrade
  version: v1.20.4+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/master
      operator: DoesNotExist
  prepare:
    args:
    - prepare
    - server-plan
    image: rancher/k3s-upgrade
  serviceAccountName: system-upgrade
  upgrade:
    image: rancher/k3s-upgrade
  version: v1.20.4+k3s1

关于这些计划,有几个重要的事情需要提醒:

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

其次,concurrency字段表示可以同时升级多少个节点。

第三,server-plan通过指定一个标签选择器来选择带有node-role.kubernetes.io/master标签的节点,从而锁定 server 节点。agent-plan通过指定一个标签选择器来选择没有该标签的节点,以 agent 节点为目标。

第四,agent-plan中的 prepare 步骤会使该计划等待server-plan完成后再执行升级 jobs。

第五,两个计划的version字段都设置为 v1.17.4+k3s1。或者,你可以省略 version 字段,将 channel 字段设置为解析到 K3s 版本的 URL。这将导致控制器监控该 URL,并在它解析到新版本时随时升级集群。这与 release channels 配合得很好。因此,你可以用下面的 channel 配置你的计划,以确保你的集群总是自动升级到 K3s 的最新稳定版本。

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

如上所述,一旦控制器检测到计划已创建,升级就会立即开始。更新计划将使控制器重新评估计划并确定是否需要再次升级。

您可以通过 kubectl 查看 plans 和 jobs 来监控升级的进度:

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