跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Edge 文档 / Day 2 操作 / 下游群集

25 下游群集

本章介绍如何使用管理群集对下游群集的不同组件执行各种 Day 2 操作。

25.1 简介

本节旨在充当 Day 2 操作文档的起点,在其中可以找到以下信息。

  1. 用于在多个下游群集中实现 Day 2 操作的默认组件(第 25.1.1 节 “组件”)。

  2. 确定要为特定用例使用哪些 Day 2 资源(第 25.1.2 节 “确定您的用例”)。

  3. Day 2 操作的建议工作流程顺序(第 25.1.3 节 “Day 2 工作流程”)。

25.1.1 组件

下面提供了默认组件的说明,应在管理群集下游群集上设置这些组件,以便可以成功执行 Day 2 操作。

25.1.1.1 Rancher

注意
注意

如果您要在用例中使用 Fleet(第 6 章 “Fleet)但不使用 Rancher,则完全可以跳过 Rancher 组件的设置。

Rancher 负责管理您的下游群集。应将其部署在您的管理群集上。

有关详细信息,请参见第 4 章 “Rancher

25.1.1.2 Fleet

Fleet 负责多群集资源部署。

通常由 Rancher 组件提供。对于不使用 Rancher 的用例,可将 Fleet 部署为独立组件。

有关将 Fleet 安装为独立组件的详细信息,请参见 Fleet 的安装细节

有关 Fleet 组件的详细信息,请参见第 6 章 “Fleet

重要
重要

本文档主要依赖于 Fleet,更具体地说,依赖于使用 GitRepo捆绑包资源(有关详细信息,请参见第 25.1.2 节 “确定您的用例”)来通过 GitOps 自动部署与 Day 2 操作相关的资源。

对于需要使用第三方 GitOps 工具的用例,请参见:

  1. 对于操作系统软件包更新 - 第 25.3.4.3 节 “SUC 计划部署 - 第三方 GitOps 工作流程”

  2. 对于 Kubernetes 发行版升级 - 第 25.4.4.3 节 “SUC 计划部署 - 第三方 GitOps 工作流程”

  3. 对于 Helm chart 升级 - 从第 33.1 节 “摘要”页面检索所需 Edge 版本支持的 chart 版本,并在第三方 GitOps 工具中填充 chart 版本和 URL

25.1.1.3 系统升级控制器 (SUC)

系统升级控制器 (SUC) 负责根据通过自定义资源(称为计划)提供的配置数据在指定节点上执行任务。应将其放置在每个需要执行某种 Day 2 操作的下游群集上。

有关 SUC 的详细信息,请参见上游储存库

有关如何在下游群集上部署 SUC 的信息,请先确定您的用例(第 25.1.2 节 “确定您的用例”),然后参见第 25.2.1.1 节 “使用 GitRepo 资源进行 SUC 部署”第 25.2.1.2 节 “使用捆绑包资源进行 SUC 部署”来了解 SUC 部署信息。

25.1.2 确定您的用例

如前所述,与 Day 2 操作相关的资源将通过 Fleet 的 GitRepo捆绑包资源传播到下游群集。

下面提供了有关这些资源的作用,以及应在哪些用例中使用它们来执行 Day 2 操作的详细信息。

25.1.2.1 GitRepo

GitRepo 是一种 Fleet(第 6 章 “Fleet)资源,它代表一个 Git 储存库,Fleet 可从中创建捆绑包。每个捆绑包是基于 GitRepo 资源中定义的配置路径创建的。有关详细信息,请参见 GitRepo 文档。

Day 2 操作而言,GitRepo 资源通常用于在利用 Fleet GitOps 方法的非隔离环境中部署 SUCSUC 计划

或者,如果您通过本地 git 服务器镜像储存库设置,则 GitRepo 资源也可用于在隔离环境中部署 SUCSUC 计划

25.1.2.2 捆绑包

捆绑包包含了要在目标群集上部署的原始 Kubernetes 资源。通常它们是基于 GitRepo 资源创建的,但在某些用例中也可以手动部署。有关详细信息,请参见捆绑包文档。

Day 2 操作而言,捆绑包资源通常用于在不使用某种形式的本地 GitOps 过程(例如本地 git 服务器)的隔离环境中部署 SUCSUC 计划

或者,如果您的用例不允许使用 GitOps 工作流程(例如需使用 Git 储存库),则捆绑包资源也可用于在非隔离环境中部署 SUCSUC 计划

25.1.3 Day 2 工作流程

下面是在将下游群集升级到特定 Edge 版本时应遵循的 Day 2 工作流程。

25.2 系统升级控制器部署指南

系统升级控制器 (SUC) 负责根据自定义资源(称为计划)中定义的配置在指定节点上部署资源。有关详细信息,请参见上游文档

注意
注意

本节只会重点介绍如何部署系统升级控制器。应根据以下文档部署计划资源:

25.2.1 部署

注意
注意

本节假设您要使用 Fleet(第 6 章 “Fleet)来编排 SUC 部署。使用第三方 GitOps 工作流程的用户应参见第 25.2.1.3 节 “使用第三方 GitOps 工作流程时部署系统升级控制器”来了解需要在其工作流程中设置哪些资源。

要确定所要使用的资源,请参见第 25.1.2 节 “确定您的用例”

25.2.1.1 使用 GitRepo 资源进行 SUC 部署

本节介绍如何创建 GitRepo 资源,用于将成功完成 SUC 部署所需的 SUC 计划传送到目标下游群集。

Edge 团队会在每个 suse-edge/fleet-examples 版本中的 gitrepos/day2/system-upgrade-controller-gitrepo.yaml 下,为 SUC 维护一个随时可用的 GitRepo 资源。

重要
重要

如果您使用 suse-edge/fleet-examples 储存库,请确保使用带有专用版本标记的资源。

可通过以下方式之一创建 GitRepo

创建 GitRepo 后,Fleet 将负责拾取资源,并将 SUC 资源部署到所有目标群集。有关如何跟踪部署过程的信息,请参见第 25.2.2.1 节 “监控 SUC 部署”

25.2.1.1.1 GitRepo 部署 - Rancher UI
  1. 在左上角,选择 ☰ → Continuous Delivery(持续交付)

  2. 转到 Git 储存库 → 添加储存库

如果使用 suse-edge/fleet-examples 储存库,请执行以下步骤:

  1. 储存库 URL - https://github.com/suse-edge/fleet-examples.git

  2. Watch(监视)→ Revision(修订版)- 为要使用的 suse-edge/fleet-examples 储存库选择版本标记,例如 release-3.0.1

  3. 路径下,添加版本标记中显示的系统升级控制器路径 - fleets/day2/system-upgrade-controller

  4. 选择下一步转到目标配置部分

  5. 请仅选择您要为其部署系统升级控制器的群集。如果您对配置感到满意,请单击创建

或者,如果您决定使用自己的储存库来托管这些文件,则需要提供上述储存库数据。

25.2.1.1.2 GitRepo 创建 - 手动
  1. 选择您要从中部署 SUC GitRepo 的所需 Edge 版本标记(在下文中用 ${REVISION} 表示)。

  2. 提取 GitRepo 资源:

    curl -o system-upgrade-controller-gitrepo.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/{REVISION}/gitrepos/day2/system-upgrade-controller-gitrepo.yaml
  3. 编辑 GitRepo 配置,在 spec.targets 下指定所需的目标列表。默认情况下,suse-edge/fleet-examples 中的 GitRepo 资源不会映射到任何下游群集。

    • 为了匹配所有群集,请将默认的 GitRepo 目标更改为:

      spec:
        targets:
        - clusterSelector: {}
    • 或者,如果您要更细致地选择群集,请参见映射到下游群集

  4. GitRepo 资源应用于管理群集

    kubectl apply -f system-upgrade-controller-gitrepo.yaml
  5. 查看 fleet-default 名称空间下创建的 GitRepo 资源:

    kubectl get gitrepo system-upgrade-controller -n fleet-default
    
    # Example output
    NAME                        REPO                                               COMMIT       BUNDLEDEPLOYMENTS-READY   STATUS
    system-upgrade-controller   https://github.com/suse-edge/fleet-examples.git   release-3.0.1   0/0

25.2.1.2 使用捆绑包资源进行 SUC 部署

本节介绍如何创建捆绑包资源,用于将成功完成 SUC 部署所需的 SUC 计划传送到目标下游群集。

Edge 团队会在每个 suse-edge/fleet-examples 版本中的 bundles/day2/system-upgrade-controller/controller-bundle.yaml 下,为 SUC 维护随时可用的捆绑包资源。

重要
重要

如果您使用 suse-edge/fleet-examples 储存库,请确保使用带有专用版本标记的资源。

可通过以下方式之一创建捆绑包

创建捆绑包后,Fleet 将负责拾取资源,并将 SUC 资源部署到所有目标群集。有关如何跟踪部署过程的信息,请参见第 25.2.2.1 节 “监控 SUC 部署”

25.2.1.2.1 捆绑包创建 - Rancher UI
  1. 在左上角,选择 ☰ → Continuous Delivery(持续交付)

  2. 转到高级 > 捆绑包

  3. 选择从 YAML 创建

  4. 此处可通过以下方式之一创建捆绑包:

  5. 更改捆绑包目标群集:

    • 为了匹配所有下游群集,请将默认的捆绑包 .spec.targets 更改为:

      spec:
        targets:
        - clusterSelector: {}
    • 有关更精细的下游群集映射,请参见映射到下游群集

  6. 创建

25.2.1.2.2 捆绑包创建 - 手动
  1. 选择您要从中部署 SUC 捆绑包的所需 Edge 版本标记(在下文中用 ${REVISION} 表示)。

  2. 提取捆绑包资源:

    curl -o controller-bundle.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/${REVISION}/bundles/day2/system-upgrade-controller/controller-bundle.yaml
  3. 编辑捆绑包目标配置,在 spec.targets 下提供所需的目标列表。默认情况下,suse-edge/fleet-examples 中的捆绑包资源不会映射到任何下游群集。

    • 为了匹配所有群集,请将默认的捆绑包目标更改为:

      spec:
        targets:
        - clusterSelector: {}
    • 或者,如果您要更细致地选择群集,请参见映射到下游群集

  4. 捆绑包资源应用于管理群集

    kubectl apply -f controller-bundle.yaml
  5. 查看 fleet-default 名称空间下创建的捆绑包资源:

    kubectl get bundles system-upgrade-controller -n fleet-default
    
    # Example output
    NAME                        BUNDLEDEPLOYMENTS-READY   STATUS
    system-upgrade-controller   0/0

25.2.1.3 使用第三方 GitOps 工作流程时部署系统升级控制器

要使用第三方 GitOps 工具部署系统升级控制器,根据具体使用的工具,您可能需要获取系统升级控制器 Helm chart 和/或 Kubernetes 资源的信息。

选择您要从中使用 SUC 的特定 Edge 版本

从该页面中,可以在 fleets/day2/system-upgrade-controller/fleet.ymal 文件的 helm 配置部分下找到 SUC Helm chart 数据。

可以在 SUC 捆绑包配置中的 .spec.resources.content 下找到 SUC Kubernetes 资源。该捆绑包的位置为 bundles/day2/system-upgrade-controller/controller-bundle.yaml

使用上面提到的资源来填充第三方 GitOps 工作流程所需的数据,以部署 SUC

25.2.2 使用 Rancher 监控 SUC 资源

本节介绍如何使用 Rancher UI 监控 SUC 部署生命周期以及任何已部署的 SUC 计划。

25.2.2.1 监控 SUC 部署

要检查特定群集的 SUC Pod 日志,请执行以下操作:

  1. 在左上角,选择 ☰ → <您的群集名称>

  2. 选择工作负载 → Pod

  3. 在名称空间下拉菜单中选择 cattle-system 名称空间

    day2 监控 suc 部署 1
  4. 在 Pod 过滤栏中输入 SUC 名称 - system-upgrade-controller

  5. 在 Pod 右侧选择 ⋮ → 查看日志

    day2 监控 suc 部署 2
  6. SUC 日志应如下所示:

    day2 监控 suc 部署 3

25.2.2.2 监控 SUC 计划

重要
重要

SUC 计划 Pod 会保持活动状态 15 分钟。此期限过后,创建它们的相应作业会将其去除。要访问 SUC 计划 Pod 日志,应该为群集启用日志记录。有关如何在 Rancher 中执行此操作的信息,请参见 Rancher 与日志记录服务的集成

要检查特定 SUC 计划的 Pod 日志,请执行以下操作:

  1. 在左上角,选择 ☰ → <您的群集名称>

  2. 选择工作负载 → Pod

  3. 在名称空间下拉菜单中选择 cattle-system 名称空间

    day2 监控 suc 部署 1
  4. 在 Pod 过滤栏中输入 SUC 计划 Pod 的名称。该名称采用以下模板格式:apply-<计划名称>-on-<节点名称>

    day2 k8s 计划监控
    图 25.1︰ Kubernetes 升级计划 Pod 示例

    请注意,在图 1 中,有一个 Pod 处于已完成状态,另有一个 Pod 处于未知状态。这是预料之中的情况,其原因是在节点上执行了 Kubernetes 版本升级。

    day2 操作系统软件包计划监控
    图 25.2︰ 操作系统软件包更新计划 Pod 示例
    day2 chart 升级计划监控
    图 25.3︰ HA 群集上 EIB 部署的 Helm chart 的升级计划 Pod 示例
  5. 选择您要查看其日志的 Pod,然后导航到 ⋮ → 查看日志

25.3 操作系统软件包更新

25.3.1 组件

本节介绍操作系统软件包更新过程在默认 Day 2 组件(第 25.1.1 节 “组件”)之上使用的自定义组件。

25.3.1.1 edge-update.service

负责执行操作系统软件包更新的 Systemd 服务。使用 transactional-update 命令执行发行版升级 (dup)。

注意
注意

如果您要使用常规升级方法,请在每个节点上的 /etc/edge/ 下创建一个 edge-update.conf 文件。在此文件中添加 UPDATE_METHOD=up 变量。

此组件通过 SUC 计划交付,该计划应位于需要进行操作系统软件包更新的每个下游群集上。

25.3.2 要求

一般:

  1. 已在 SCC 中注册的计算机 - 所有下游群集节点都应已注册到 https://scc.suse.com/。只有这样,edge-update.service 才能成功连接到所需的操作系统 RPM 储存库。

  2. 确保 SUC 计划容忍度与节点容忍度相匹配 - 如果您的 Kubernetes 群集节点具有自定义污点,请确保在 SUC 计划中为这些污点添加容忍度。默认情况下,SUC 计划仅包含控制平面节点的容忍度。默认容忍度包括:

    • CriticalAddonsOnly=true:NoExecute

    • node-role.kubernetes.io/control-plane:NoSchedule

    • node-role.kubernetes.io/etcd:NoExecute

      注意
      注意

      其他任何容忍度必须添加到每个计划的 .spec.tolerations 部分下。与操作系统软件包更新相关的 SUC 计划可以在 suse-edge/fleet-examples 储存库中的 fleets/day2/system-upgrade-controller-plans/os-pkg-update 下找到。请确保使用有效储存库版本标记中的计划。

      控制平面 SUC 计划定义自定义容忍度的示例如下:

      apiVersion: upgrade.cattle.io/v1
      kind: Plan
      metadata:
        name: os-pkg-plan-control-plane
      spec:
        ...
        tolerations:
        # default tolerations
        - key: "CriticalAddonsOnly"
          operator: "Equal"
          value: "true"
          effect: "NoExecute"
        - key: "node-role.kubernetes.io/control-plane"
          operator: "Equal"
          effect: "NoSchedule"
        - key: "node-role.kubernetes.io/etcd"
          operator: "Equal"
          effect: "NoExecute"
        # custom toleration
        - key: "foo"
          operator: "Equal"
          value: "bar"
          effect: "NoSchedule"
      ...

隔离:

  1. 镜像 SUSE RPM 储存库 - 操作系统 RPM 储存库应在本地镜像,以便 edge-update.service 可以访问它们。可以使用 RMT 实现此目的。

25.3.3 更新过程

注意
注意

本节假设您将使用 Fleet(第 6 章 “Fleet)部署操作系统软件包更新 SUC 计划。如果您打算使用其他方法部署 SUC 计划,请参见第 25.3.4.3 节 “SUC 计划部署 - 第三方 GitOps 工作流程”

操作系统软件包更新过程主要围绕着将 SUC 计划部署到下游群集来进行。然后,这些计划将包含有关如何以及在哪些节点上部署 edge-update.service systemd.service 的信息。有关 SUC 计划结构的信息,请参见上游文档

操作系统软件包更新 SUC 计划通过以下方式交付:

要确定使用哪个资源,请参见第 25.1.2 节 “确定您的用例”

有关更新过程中会发生哪些情况的完整概述,请参见第 25.3.3.1 节 “概述”一节。

25.3.3.1 概述

本节旨在介绍操作系统软件包更新过程从头到尾的完整工作流程。

day2 操作系统软件包更新流程图
图 25.4︰ 操作系统软件包更新工作流程

操作系统软件包更新步骤:

  1. 用户可以根据用例,确定是要使用 GitRepo 还是捆绑包资源将操作系统软件包更新 SUC 计划部署到所需的下游群集。有关如何将 GitRepo/捆绑包映射到特定的一组下游群集的信息,请参见映射到下游群集

    1. 如果您不确定是要使用 GitRepo 还是捆绑包资源进行 SUC 计划部署,请参见第 25.1.2 节 “确定您的用例”

    2. 有关 GitRepo/捆绑包配置选项,请参见第 25.3.4.1 节 “SUC 计划部署 - GitRepo 资源”第 25.3.4.2 节 “SUC 计划部署 - 捆绑包资源”

  2. 用户将配置的 GitRepo/捆绑包资源部署到其管理群集中的 fleet-default 名称空间。此操作可以手动完成,也可以通过 Rancher UI(如果可用)完成。

  3. Fleet(第 6 章 “Fleet)持续监控 fleet-default 名称空间,并立即检测新部署的 GitRepo/捆绑包资源。有关 Fleet 监控哪些名称空间的详细信息,请参见 Fleet 的名称空间文档。

  4. 如果用户已部署 GitRepo 资源,Fleet 将协调 GitRepo,并根据其路径fleet.yaml 配置,在 fleet-default 名称空间中部署捆绑包资源。有关详细信息,请参见 Fleet 的 GitRepo 内容文档。

  5. 然后,Fleet 继续将此捆绑包中的 Kubernetes 资源部署到所有目标下游群集。在操作系统软件包更新的上下文中,Fleet 将部署捆绑包中的以下资源:

    1. os-pkg-plan-agent SUC 计划 - 告知 SUC 如何在群集代理节点上执行软件包更新。如果群集仅由控制平面节点组成,则做解释。

    2. os-pkg-plan-control-plane SUC 计划 - 告知 SUC 如何在群集控制平面节点上执行软件包更新。

    3. os-pkg-update 密钥 - 在每个 SUC 计划中引用;附带一个 update.sh 脚本,该脚本负责创建执行实际软件包更新的 edge-update.service sustemd.service

      注意
      注意

      上述资源将部署在每个下游群集的 cattle-system 名称空间中。

  6. 在下游群集上,SUC 将拾取新部署的 SUC 计划,并在与 SUC 计划中定义的节点选择器匹配的每个节点上部署更新 Pod。有关如何监控 SUC 计划 Pod 的信息,请参见第 25.2.2.2 节 “监控 SUC 计划”

  7. 更新 Pod(部署在每个节点上)挂载 os-pkg-update 密钥并执行密钥附带的 update.sh 脚本。

  8. update.sh 继续执行以下操作:

    1. 创建 edge-update.service - 创建的服务属于 oneshot 类型,采用以下工作流程:

      1. 通过执行以下命令更新节点操作系统上的所有软件包版本:

        transactional-update cleanup dup
      2. 成功执行 transactional-update 后,将安排系统重引导,使软件包版本更新生效

        注意
        注意

        成功执行 transactional-update 后,将安排系统重引导并等待 1 分钟

    2. 启动 edge-update.service 并等待启动完成

    3. 清理 edge-update.service - 在 systemd.service 完成其工作后,会将其从系统中去除,以确保将来不会发生意外的执行/重引导。

系统重引导后,操作系统软件包更新过程即告完成。重引导后,所有操作系统软件包版本应会更新到可用操作系统 RPM 储存库中显示的相应最新版本。

25.3.4 操作系统软件包更新 - SUC 计划部署

本节介绍如何使用 Fleet 的 GitRepo捆绑包资源来编排 SUC 计划相关的操作系统软件包更新的部署。

25.3.4.1 SUC 计划部署 - GitRepo 资源

可通过以下方式之一部署 GitRepo 资源,该资源中附带了所需的操作系统软件包更新 SUC 计划

  1. 通过 Rancher UI 部署 - 第 25.3.4.1.1 节 “GitRepo 创建 - Rancher UI”(如果 Rancher 可用)。

  2. 手动将相应资源部署(第 25.3.4.1.2 节 “GitRepo 创建 - 手动”)到管理群集

部署后,要监控目标群集节点的操作系统软件包更新过程,请参见第 25.2.2.2 节 “监控 SUC 计划”文档。

25.3.4.1.1 GitRepo 创建 - Rancher UI
  1. 在左上角,选择 ☰ → Continuous Delivery(持续交付)

  2. 转到 Git 储存库 → 添加储存库

如果使用 suse-edge/fleet-examples 储存库,请执行以下步骤:

  1. 储存库 URL - https://github.com/suse-edge/fleet-examples.git

  2. 监视 → 修订版 - 为要使用的 suse-edge/fleet-examples 储存库选择版本标记

  3. 路径下,添加您要使用的操作系统软件包更新 Fleet 的路径 - fleets/day2/system-upgrade-controller-plans/os-pkg-update

  4. 选择下一步转到目标配置部分。请仅选择您要升级其节点软件包的群集

  5. 创建

或者,如果您决定使用自己的储存库来托管这些文件,则需要提供上述储存库数据。

25.3.4.1.2 GitRepo 创建 - 手动
  1. 选择您要从中应用操作系统 SUC 更新计划的所需 Edge 版本标记(在下文中用 ${REVISION} 表示)。

  2. 提取 GitRepo 资源:

    curl -o os-pkg-update-gitrepo.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/${REVISION}/gitrepos/day2/os-pkg-update-gitrepo.yaml
  3. 编辑 GitRepo 配置,在 spec.targets 下指定所需的目标列表。默认情况下,suse-edge/fleet-examples 中的 GitRepo 资源不会映射到任何下游群集。

    • 为了匹配所有群集,请将默认的 GitRepo 目标更改为:

      spec:
        targets:
        - clusterSelector: {}
    • 或者,如果您要更细致地选择群集,请参见映射到下游群集

  4. GitRepo 资源应用于管理群集

    kubectl apply -f os-pkg-update-gitrepo.yaml
  5. 查看 fleet-default 名称空间下创建的 GitRepo 资源:

    kubectl get gitrepo os-pkg-update -n fleet-default
    
    # Example output
    NAME            REPO                                              COMMIT         BUNDLEDEPLOYMENTS-READY   STATUS
    os-pkg-update   https://github.com/suse-edge/fleet-examples.git   release-3.0.1  0/0

25.3.4.2 SUC 计划部署 - 捆绑包资源

可通过以下方式之一部署捆绑包资源,该资源中附带了所需的操作系统软件包更新 SUC 计划

  1. 通过 Rancher UI 部署 - 第 25.3.4.2.1 节 “捆绑包创建 - Rancher UI”(如果 Rancher 可用)。

  2. 手动将相应资源部署(第 25.3.4.2.2 节 “捆绑包创建 - 手动”)到管理群集

部署后,要监控目标群集节点的操作系统软件包更新过程,请参见第 25.2.2.2 节 “监控 SUC 计划”文档。

25.3.4.2.1 捆绑包创建 - Rancher UI
  1. 在左上角,单击 ☰ → Continuous Delivery(持续交付)

  2. 转到高级 > 捆绑包

  3. 选择从 YAML 创建

  4. 此处可通过以下方式之一创建捆绑包:

    1. 通过手动将捆绑包内容复制到从 YAML 创建页面。可以从 https://raw.githubusercontent.com/suse-edge/fleet-examples/${REVISION}/bundles/day2/system-upgrade-controller-plans/os-pkg-update/pkg-update-bundle.yaml 检索内容,其中 ${REVISION} 是您使用的 Edge 版本

    2. 通过将 suse-edge/fleet-examples 储存库克隆到所需的版本标记中,并在从 YAML 创建页面中选择从文件读取选项。然后导航到 bundles/day2/system-upgrade-controller-plans/os-pkg-update 目录并选择 pkg-update-bundle.yaml。这会在从 YAML 创建页面中自动填充捆绑包内容。

  5. 更改捆绑包目标群集:

    • 为了匹配所有下游群集,请将默认的捆绑包 .spec.targets 更改为:

      spec:
        targets:
        - clusterSelector: {}
    • 有关更精细的下游群集映射,请参见映射到下游群集

  6. 选择创建

25.3.4.2.2 捆绑包创建 - 手动
  1. 选择您要从中应用操作系统软件包更新 SUC 计划的所需 Edge 版本标记(在下文中用 ${REVISION} 表示)。

  2. 提取捆绑包资源:

    curl -o pkg-update-bundle.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/${REVISION}/bundles/day2/system-upgrade-controller-plans/os-pkg-update/pkg-update-bundle.yaml
  3. 编辑捆绑包目标配置,在 spec.targets 下提供所需的目标列表。默认情况下,suse-edge/fleet-examples 中的捆绑包资源不会映射到任何下游群集。

    • 为了匹配所有群集,请将默认的捆绑包目标更改为:

      spec:
        targets:
        - clusterSelector: {}
    • 或者,如果您要更细致地选择群集,请参见映射到下游群集

  4. 捆绑包资源应用于管理群集

    kubectl apply -f pkg-update-bundle.yaml
  5. 查看 fleet-default 名称空间下创建的捆绑包资源:

    kubectl get bundles os-pkg-update -n fleet-default
    
    # Example output
    NAME            BUNDLEDEPLOYMENTS-READY   STATUS
    os-pkg-update   0/0

25.3.4.3 SUC 计划部署 - 第三方 GitOps 工作流程

在某些用例中,用户可能希望将操作系统软件包更新 SUC 计划合并到他们自己的第三方 GitOps 工作流程(例如 Flux)中。

要获取所需的操作系统软件包更新资源,首先请确定您要使用的 suse-edge/fleet-examples 储存库的 Edge 版本标记。

然后,便可以在 fleets/day2/system-upgrade-controller-plans/os-pkg-update 中查找资源,其中:

  • plan-control-plane.yaml - 控制平面节点的系统升级控制器计划资源

  • plan-agent.yaml - 代理节点的系统升级控制器计划资源

  • secret.yaml - 密钥,其中附带了用于创建 edge-update.service systemd.service 的脚本

重要
重要

这些计划资源由系统升级控制器解释,应部署在您要升级的每个下游群集上。有关如何部署系统升级控制器的信息,请参见第 25.2.1.3 节 “使用第三方 GitOps 工作流程时部署系统升级控制器”

为了更好地了解如何使用 GitOps 工作流程来部署操作系统软件包更新的 SUC 计划,建议查看有关使用 Fleet 进行更新的过程概述(第 25.3.3.1 节 “概述”)。

25.4 Kubernetes 版本升级

重要
重要

本节介绍不是通过 Rancher(第 4 章 “Rancher)实例创建的下游群集的 Kubernetes 升级过程。有关如何对通过 Rancher 创建的群集进行 Kubernetes 版本升级的信息,请参见升级和回滚 Kubernetes

25.4.1 组件

本节介绍 Kubernetes 升级过程在默认 Day 2 组件(第 25.1.1 节 “组件”)之上使用的自定义组件。

25.4.1.1 rke2-upgrade

负责升级特定节点的 RKE2 版本的映像。

此组件由 SUC 根据 SUC 计划创建的 Pod 交付。该计划应位于需要进行 RKE2 升级的每个下游群集上。

有关 rke2-upgrade 映像如何执行升级的详细信息,请参见上游文档

25.4.1.2 k3s-upgrade

负责升级特定节点的 K3s 版本的映像。

此组件由 SUC 根据 SUC 计划创建的 Pod 交付。该计划应位于需要进行 K3s 升级的每个下游群集上。

有关 k3s-upgrade 映像如何执行升级的详细信息,请参见上游文档

25.4.2 要求

  1. 备份您的 Kubernetes 发行版:

    1. 对于导入的 RKE2 群集,请参见 RKE2 备份和恢复文档。

    2. 对于导入的 K3s 群集,请参见 K3s 备份和恢复文档。

  2. 确保 SUC 计划容忍度与节点容忍度相匹配 - 如果您的 Kubernetes 群集节点具有自定义污点,请确保在 SUC 计划中为这些污点添加容忍度。默认情况下,SUC 计划仅包含控制平面节点的容忍度。默认容忍度包括:

    • CriticalAddonsOnly=true:NoExecute

    • node-role.kubernetes.io/control-plane:NoSchedule

    • node-role.kubernetes.io/etcd:NoExecute

      注意
      注意

      其他任何容忍度必须添加到每个计划的 .spec.tolerations 部分下。与 Kubernetes 版本升级相关的 SUC 计划可以在 suse-edge/fleet-examples 储存库中的以下位置找到:

      • 对于 RKE2 - fleets/day2/system-upgrade-controller-plans/rke2-upgrade

      • 对于 K3s - fleets/day2/system-upgrade-controller-plans/k3s-upgrade

      请确保使用有效储存库版本标记中的计划。

      为 RKE2 控制平面 SUC 计划定义自定义容忍度的示例如下:

      apiVersion: upgrade.cattle.io/v1
      kind: Plan
      metadata:
        name: rke2-plan-control-plane
      spec:
        ...
        tolerations:
        # default tolerations
        - key: "CriticalAddonsOnly"
          operator: "Equal"
          value: "true"
          effect: "NoExecute"
        - key: "node-role.kubernetes.io/control-plane"
          operator: "Equal"
          effect: "NoSchedule"
        - key: "node-role.kubernetes.io/etcd"
          operator: "Equal"
          effect: "NoExecute"
        # custom toleration
        - key: "foo"
          operator: "Equal"
          value: "bar"
          effect: "NoSchedule"
      ...

25.4.3 升级过程

注意
注意

本节假设您将使用 Fleet(第 6 章 “Fleet)部署 SUC 计划。如果您打算使用其他方法部署 SUC 计划,请参见第 25.4.4.3 节 “SUC 计划部署 - 第三方 GitOps 工作流程”

Kubernetes 版本升级过程主要围绕着将 SUC 计划部署到下游群集来进行。这些计划包含的信息会告知 SUC 要在哪些节点上创建运行 rke2/k3s-upgrade 映像的 Pod。有关 SUC 计划结构的信息,请参见上游文档

Kubernetes 升级计划通过以下方式交付:

要确定使用哪个资源,请参见第 25.1.2 节 “确定您的用例”

有关更新过程中会发生哪些情况的完整概述,请参见第 25.4.3.1 节 “概述”一节。

25.4.3.1 概述

本节旨在介绍 Kubernetes 版本升级过程从头到尾的完整工作流程。

day2 k8s 版本升级流程图
图 25.5︰ Kubernetes 版本升级工作流程

Kubernetes 版本升级步骤:

  1. 用户可以根据用例,确定是要使用 GitRepo 还是捆绑包资源将 Kubernetes 升级 SUC 计划部署到所需的下游群集。有关如何将 GitRepo/捆绑包映射到特定的一组下游群集的信息,请参见映射到下游群集

    1. 如果您不确定是要使用 GitRepo 还是捆绑包资源进行 SUC 计划部署,请参见第 25.1.2 节 “确定您的用例”

    2. 有关 GitRepo/捆绑包配置选项,请参见第 25.4.4.1 节 “SUC 计划部署 - GitRepo 资源”第 25.4.4.2 节 “SUC 计划部署 - 捆绑包资源”

  2. 用户将配置的 GitRepo/捆绑包资源部署到其管理群集中的 fleet-default 名称空间。此操作可以手动完成,也可以通过 Rancher UI(如果可用)完成。

  3. Fleet(第 6 章 “Fleet)持续监控 fleet-default 名称空间,并立即检测新部署的 GitRepo/捆绑包资源。有关 Fleet 监控哪些名称空间的详细信息,请参见 Fleet 的名称空间文档。

  4. 如果用户已部署 GitRepo 资源,Fleet 将协调 GitRepo,并根据其路径fleet.yaml 配置,在 fleet-default 名称空间中部署捆绑包资源。有关详细信息,请参见 Fleet 的 GitRepo 内容文档。

  5. 然后,Fleet 继续将此捆绑包中的 Kubernetes 资源部署到所有目标下游群集。在 Kubernetes 版本升级的上下文中,Fleet 将部署捆绑包中的以下资源(具体取决于 Kubernetes 发行版):

    1. rke2-plan-agent/k3s-plan-agent - 告知 SUC 如何在群集代理节点上执行 Kubernetes 升级。如果群集仅由控制平面节点组成,则做解释。

    2. rke2-plan-control-plane/k3s-plan-control-plane - 告知 SUC 如何在群集控制平面节点上执行 Kubernetes 升级。

      注意
      注意

      上述 SUC 计划将部署在每个下游群集的 cattle-system 名称空间中。

  6. 在下游群集上,SUC 将拾取新部署的 SUC 计划,并在与 SUC 计划中定义的节点选择器匹配的每个节点上部署更新 Pod。有关如何监控 SUC 计划 Pod 的信息,请参见第 25.2.2.2 节 “监控 SUC 计划”

  7. 根据您部署的 SUC 计划更新 Pod 将运行 rke2-upgradek3s-upgrade 映像,并在每个群集节点上执行以下工作流程:

    1. 封锁群集节点 - 为了确保在升级此节点时不会意外调度任何 Pod,我们将此节点标记为不可调度

    2. 将节点操作系统上安装的 rke2/k3s 二进制文件替换为 Pod 当前正在运行的 rke2-upgrade/k3s-upgrade 映像附带的二进制文件。

    3. 终止节点操作系统上正在运行的 rke2/k3s 进程 - 这会指示监督程序使用新版本自动重启动 rke2/k3s 进程。

    4. 解封群集节点 - 成功完成 Kubernetes 发行版升级后,将节点重新标记为可调度

      注意
      注意

      有关 rke2-upgradek3s-upgrade 映像工作原理的更多信息,请参见 rke2-upgradek3s-upgrade 上游项目。

执行上述步骤后,每个群集节点的 Kubernetes 版本应会升级到所需的 Edge 兼容版本

25.4.4 Kubernetes 版本升级 - SUC 计划部署

25.4.4.1 SUC 计划部署 - GitRepo 资源

可通过以下方式之一部署 GitRepo 资源,该资源中附带了所需的 Kubernetes 升级 SUC 计划

  1. 通过 Rancher UI 部署 - 第 25.4.4.1.1 节 “GitRepo 创建 - Rancher UI”(如果 Rancher 可用)。

  2. 手动将相应资源部署(第 25.4.4.1.2 节 “GitRepo 创建 - 手动”)到管理群集

部署后,要监控目标群集节点的 Kubernetes 升级过程,请参见第 25.2.2.2 节 “监控 SUC 计划”文档。

25.4.4.1.1 GitRepo 创建 - Rancher UI
  1. 在左上角,选择 ☰ → Continuous Delivery(持续交付)

  2. 转到 Git 储存库 → 添加储存库

如果使用 suse-edge/fleet-examples 储存库,请执行以下步骤:

  1. 储存库 URL - https://github.com/suse-edge/fleet-examples.git

  2. 监视 → 修订版 - 为要使用的 suse-edge/fleet-examples 储存库选择版本标记

  3. 路径下,添加版本标记中显示的 Kubernetes 发行版升级 Fleet 路径:

    1. 对于 RKE2 - fleets/day2/system-upgrade-controller-plans/rke2-upgrade

    2. 对于 K3s - fleets/day2/system-upgrade-controller-plans/k3s-upgrade

  4. 选择下一步转到目标配置部分。请仅选择您要升级其中的所需 Kubernetes 发行版的群集

  5. 创建

或者,如果您决定使用自己的储存库来托管这些文件,则需要提供上述储存库数据。

25.4.4.1.2 GitRepo 创建 - 手动
  1. 选择您要从中应用 Kubernetes SUC 升级计划的所需 Edge 版本标记(在下文中用 ${REVISION} 表示)。

  2. 提取 GitRepo 资源:

    • 对于 RKE2 群集:

      curl -o rke2-upgrade-gitrepo.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/${REVISION}/gitrepos/day2/rke2-upgrade-gitrepo.yaml
    • 对于 K3s 群集:

      curl -o k3s-upgrade-gitrepo.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/${REVISION}/gitrepos/day2/k3s-upgrade-gitrepo.yaml
  3. 编辑 GitRepo 配置,在 spec.targets 下指定所需的目标列表。默认情况下,suse-edge/fleet-examples 中的 GitRepo 资源不会映射到任何下游群集。

    • 为了匹配所有群集,请将默认的 GitRepo 目标更改为:

      spec:
        targets:
        - clusterSelector: {}
    • 或者,如果您要更细致地选择群集,请参见映射到下游群集

  4. GitRepo 资源应用于管理群集

    # RKE2
    kubectl apply -f rke2-upgrade-gitrepo.yaml
    
    # K3s
    kubectl apply -f k3s-upgrade-gitrepo.yaml
  5. 查看 fleet-default 名称空间下创建的 GitRepo 资源:

    # RKE2
    kubectl get gitrepo rke2-upgrade -n fleet-default
    
    # K3s
    kubectl get gitrepo k3s-upgrade -n fleet-default
    
    # Example output
    NAME           REPO                                              COMMIT          BUNDLEDEPLOYMENTS-READY   STATUS
    k3s-upgrade    https://github.com/suse-edge/fleet-examples.git   release-3.0.1   0/0
    rke2-upgrade   https://github.com/suse-edge/fleet-examples.git   release-3.0.1   0/0

25.4.4.2 SUC 计划部署 - 捆绑包资源

可通过以下方式之一部署捆绑包资源,该资源中附带了所需的 Kubernetes 升级 SUC 计划

  1. 通过 Rancher UI 部署 - 第 25.4.4.2.1 节 “捆绑包创建 - Rancher UI”(如果 Rancher 可用)。

  2. 手动将相应资源部署(第 25.4.4.2.2 节 “捆绑包创建 - 手动”)到管理群集

部署后,要监控目标群集节点的 Kubernetes 升级过程,请参见第 25.2.2.2 节 “监控 SUC 计划”文档。

25.4.4.2.1 捆绑包创建 - Rancher UI
  1. 在左上角,单击 ☰ → Continuous Delivery(持续交付)

  2. 转到高级 > 捆绑包

  3. 选择从 YAML 创建

  4. 此处可通过以下方式之一创建捆绑包:

    1. 通过手动将捆绑包内容复制到从 YAML 创建页面。可以检索内容:

    2. 通过将 suse-edge/fleet-examples 储存库克隆到所需的版本标记中,并在从 YAML 创建页面中选择从文件读取选项。然后导航到所需的捆绑包(对于 RKE2,为 /bundles/day2/system-upgrade-controller-plans/rke2-upgrade/plan-bundle.yaml;对于 K3s,为 /bundles/day2/system-upgrade-controller-plans/k3s-upgrade/plan-bundle.yaml)。这会在从 YAML 创建页面中自动填充捆绑包内容

  5. 更改捆绑包目标群集:

    • 为了匹配所有下游群集,请将默认的捆绑包 .spec.targets 更改为:

      spec:
        targets:
        - clusterSelector: {}
    • 有关更精细的下游群集映射,请参见映射到下游群集

  6. 创建

25.4.4.2.2 捆绑包创建 - 手动
  1. 选择您要从中应用 Kubernetes SUC 升级计划的所需 Edge 版本标记(在下文中用 ${REVISION} 表示)。

  2. 提取捆绑包资源:

    • 对于 RKE2 群集:

      curl -o rke2-plan-bundle.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/${REVISION}/bundles/day2/system-upgrade-controller-plans/rke2-upgrade/plan-bundle.yaml
    • 对于 K3s 群集:

      curl -o k3s-plan-bundle.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/${REVISION}/bundles/day2/system-upgrade-controller-plans/k3s-upgrade/plan-bundle.yaml
  3. 编辑捆绑包目标配置,在 spec.targets 下提供所需的目标列表。默认情况下,suse-edge/fleet-examples 中的捆绑包资源不会映射到任何下游群集。

    • 为了匹配所有群集,请将默认的捆绑包目标更改为:

      spec:
        targets:
        - clusterSelector: {}
    • 或者,如果您要更细致地选择群集,请参见映射到下游群集

  4. 捆绑包资源应用于管理群集

    # For RKE2
    kubectl apply -f rke2-plan-bundle.yaml
    
    # For K3s
    kubectl apply -f k3s-plan-bundle.yaml
  5. 查看 fleet-default 名称空间下创建的捆绑包资源:

    # For RKE2
    kubectl get bundles rke2-upgrade -n fleet-default
    
    # For K3s
    kubectl get bundles k3s-upgrade -n fleet-default
    
    # Example output
    NAME           BUNDLEDEPLOYMENTS-READY   STATUS
    k3s-upgrade    0/0
    rke2-upgrade   0/0

25.4.4.3 SUC 计划部署 - 第三方 GitOps 工作流程

在某些用例中,用户可能希望将 Kubernetes 升级资源合并到他们自己的第三方 GitOps 工作流程(例如 Flux)中。

要获取所需的升级资源,首先请确定您要使用的 suse-edge/fleet-examples 储存库的 Edge 版本标记。

然后,便可以在以下位置查找资源:

  • 对于 RKE2 群集升级:

    • 对于控制平面节点 - fleets/day2/system-upgrade-controller-plans/rke2-upgrade/plan-control-plane.yaml

    • 对于代理节点 - fleets/day2/system-upgrade-controller-plans/rke2-upgrade/plan-agent.yaml

  • 对于 K3s 群集升级:

    • 对于控制平面节点 - fleets/day2/system-upgrade-controller-plans/k3s-upgrade/plan-control-plane.yaml

    • 对于代理节点 - fleets/day2/system-upgrade-controller-plans/k3s-upgrade/plan-agent.yaml

重要
重要

这些计划资源由系统升级控制器解释,应部署在您要升级的每个下游群集上。有关如何部署系统升级控制器的信息,请参见第 25.2.1.3 节 “使用第三方 GitOps 工作流程时部署系统升级控制器”

为了更好地了解如何使用 GitOps 工作流程来部署 Kubernetes 版本升级的 SUC 计划,建议查看有关使用 Fleet 进行更新的过程概述(第 25.4.3.1 节 “概述”)。

25.5 Helm chart 升级

注意
注意

以下章节重点介绍如何使用 Fleet 功能实现 Helm chart 更新。

采用第三方 GitOps 工作流程的用户应从 fleets/day2/chart-templates/<chart-name> 中的 fleet.yaml 文件获取所需 Helm chart 的配置。请确保从有效的“Day 2”Edge 版本中检索 chart 数据。

25.5.1 组件

除了默认的 Day 2 组件(第 25.1.1 节 “组件”)之外,此操作不需要其他自定义组件。

25.5.2 为隔离环境做好准备

25.5.2.1 确保您有权访问 Helm chart 的升级 fleet.yaml 文件

将所需的资源托管在管理群集可访问的本地 git 服务器上。

25.5.2.2 找到 Edge 发行版本的所需资产

  1. 转到 Day 2 版本页面,找到您要将 chart 升级到的 Edge 3.X.Y 版本,然后单击资产

  2. 从该版本的资产部分下载以下文件,对 SUSE 支持的 Helm chart 进行隔离式升级时需要这些文件:

    版本文件

    说明

    edge-save-images.sh

    此脚本提取 edge-release-images.txt 文件中的映像并将其保存到“.tar.gz”存档中,然后您可以在隔离环境中使用该存档。

    edge-save-oci-artefacts.sh

    此脚本提取 edge-release-helm-oci-artefacts.txt 文件中的 SUSE OCI chart 项目,并为包含所有其他 chart OCI 存档的目录创建“.tar.gz”存档。

    edge-load-images.sh

    此脚本加载 edge-save-images.sh 生成的“.tar.gz”存档中的映像,重新标记这些映像并将其推送到专用注册表中。

    edge-load-oci-artefacts.sh

    此脚本获取包含“.tgz”SUSE OCI chart 的目录,并将所有 OCI chart 加载到专用注册表中。该目录是从 edge-save-oci-artefacts.sh 脚本生成的“.tar.gz”存档中检索的。

    edge-release-helm-oci-artefacts.txt

    此文件包含 SUSE Edge 版本 Helm chart 的 OCI 项目列表。

    edge-release-images.txt

    此文件包含 Edge 版本 Helm chart 所需的映像列表。

25.5.2.3 创建 SUSE Edge 版本映像存档

在可以访问互联网的计算机上:

  1. edge-save-images.sh 设为可执行文件:

    chmod +x edge-save-images.sh
  2. 使用 edge-save-images.sh 脚本创建 Docker 可导入的“.tar.gz”存档:

    ./edge-save-images.sh --source-registry registry.suse.com
  3. 这会创建一个随时可加载的 edge-images.tar.gz(除非指定了 -i|--images 选项)存档,其中包含所需的映像。

  4. 将此存档复制到隔离的计算机

    scp edge-images.tar.gz <user>@<machine_ip>:/path

25.5.2.4 创建 SUSE Edge Helm chart OCI 映像存档

在可以访问互联网的计算机上:

  1. edge-save-oci-artefacts.sh 设为可执行文件:

    chmod +x edge-save-oci-artefacts.sh
  2. 使用 edge-save-oci-artefacts.sh 脚本创建包含所有 SUSE Edge Helm chart OCI 映像的“.tar.gz”存档:

    ./edge-save-oci-artefacts.sh --source-registry registry.suse.com
  3. 这会创建一个包含所有 SUSE Edge Helm chart OCI 映像的 oci-artefacts.tar.gz 存档

  4. 将此存档复制到隔离的计算机

    scp oci-artefacts.tar.gz <user>@<machine_ip>:/path

25.5.2.5 将 SUSE Edge 版本映像加载到隔离的计算机上

在隔离的计算机上:

  1. 登录到专用注册表(如果需要):

    podman login <REGISTRY.YOURDOMAIN.COM:PORT>
  2. edge-load-images.sh 设为可执行文件:

    chmod +x edge-load-images.sh
  3. 使用 edge-load-images.sh复制的 edge-images.tar.gz 存档中加载映像,重新标记这些映像并将其推送到专用注册表中:

    ./edge-load-images.sh --source-registry registry.suse.com --registry <REGISTRY.YOURDOMAIN.COM:PORT> --images edge-images.tar.gz

25.5.2.6 将 SUSE Edge Helm chart OCI 映像加载到隔离的计算机上

在隔离的计算机上:

  1. 登录到专用注册表(如果需要):

    podman login <REGISTRY.YOURDOMAIN.COM:PORT>
  2. edge-load-oci-artefacts.sh 设为可执行文件:

    chmod +x edge-load-oci-artefacts.sh
  3. 解压缩复制的 oci-artefacts.tar.gz 存档:

    tar -xvf oci-artefacts.tar.gz
  4. 这会使用命名模板 edge-release-oci-tgz-<date> 生成一个目录

  5. 将此目录传递给 edge-load-oci-artefacts.sh 脚本,以将 SUSE Edge Helm chart OCI 映像加载到专用注册表中:

    注意
    注意

    此脚本假设您的环境中已预装了 Helm CLI。有关 Helm 安装说明,请参见安装 Helm

    ./edge-load-oci-artefacts.sh --archive-directory edge-release-oci-tgz-<date> --registry <REGISTRY.YOURDOMAIN.COM:PORT> --source-registry registry.suse.com

25.5.2.7 为 Kubernetes 发行版创建指向专用注册表的注册表镜像

对于 RKE2,请参见 Containerd 注册表配置

对于 K3s,请参见嵌入式注册表镜像

25.5.3 升级过程

注意
注意

以下升级过程利用 Rancher 的 Fleet(第 6 章 “Fleet)功能。使用第三方 GitOps 工作流程的用户应根据第 33.1 节 “摘要”中所述检索每个 Edge 版本支持的 chart 版本,并将这些支持的版本填充到其第三方 GitOps 工作流程中。

本节重点介绍以下用例的 Helm 升级过程:

  1. 我有一个新群集,想要部署和管理 SUSE Helm chart(第 25.5.3.1 节 “我有一个新群集,想要部署和管理 SUSE Helm chart”

  2. 我想升级 Fleet 管理的 Helm chart(第 25.5.3.2 节 “我想升级 Fleet 管理的 Helm chart”

  3. 我想升级 EIB 创建的 Helm chart(第 25.5.3.3 节 “我想升级 EIB 创建的 Helm chart”

重要
重要

手动部署的 Helm chart 无法可靠升级。我们建议使用第 25.5.3.1 节 “我有一个新群集,想要部署和管理 SUSE Helm chart”方法重新部署这些 Helm chart。

25.5.3.1 我有一个新群集,想要部署和管理 SUSE Helm chart

适用于想要通过 Fleet 管理其 Helm chart 生命周期的用户。

25.5.3.1.1 准备 Fleet 资源
  1. 从您要使用的 Edge 版本标记中获取 Chart 的 Fleet 资源

    1. 从选定的 Edge 版本标记修订版导航到 Helm chart Fleet 目录 - fleets/day2/chart-templates/<chart>

    2. 将该 chart Fleet 目录复制到用于 GitOps 工作流程的 Git 储存库

    3. (可选)如果 Helm chart 需要对其进行配置,请编辑复制的目录中 fleet.yaml 文件内的 .helm.values 配置

    4. (可选)在某些用例中,您可能需要向 chart 的 Fleet 目录添加其他资源,使该目录能够更好地适应您的环境。有关如何增强 Fleet 目录的信息,请参见 Git 储存库内容

longhorn Helm chart 的示例如下:

  • 用户 Git 储存库结构:

    <user_repository_root>
    └── longhorn
        └── fleet.yaml
  • 填充了用户 longhorn 数据的 fleet.yaml 内容:

    defaultNamespace: longhorn-system
    
    helm:
      releaseName: "longhorn"
      chart: "longhorn"
      repo: "https://charts.longhorn.io"
      version: "1.6.1"
      takeOwnership: true
      # custom chart value overrides
      values:
        # Example for user provided custom values content
        defaultSettings:
          deletingConfirmationFlag: true
    
    # https://fleet.rancher.io/bundle-diffs
    diff:
      comparePatches:
      - apiVersion: apiextensions.k8s.io/v1
        kind: CustomResourceDefinition
        name: engineimages.longhorn.io
        operations:
        - {"op":"remove", "path":"/status/conditions"}
        - {"op":"remove", "path":"/status/storedVersions"}
        - {"op":"remove", "path":"/status/acceptedNames"}
      - apiVersion: apiextensions.k8s.io/v1
        kind: CustomResourceDefinition
        name: nodes.longhorn.io
        operations:
        - {"op":"remove", "path":"/status/conditions"}
        - {"op":"remove", "path":"/status/storedVersions"}
        - {"op":"remove", "path":"/status/acceptedNames"}
      - apiVersion: apiextensions.k8s.io/v1
        kind: CustomResourceDefinition
        name: volumes.longhorn.io
        operations:
        - {"op":"remove", "path":"/status/conditions"}
        - {"op":"remove", "path":"/status/storedVersions"}
        - {"op":"remove", "path":"/status/acceptedNames"}
    注意
    注意

    上面只是一些示例值,用于演示基于 longhorn chart 创建的自定义配置。不应将它们视为 longhorn chart 的部署指南。

25.5.3.1.2 创建 GitRepo

在储存库中填充 chart 的 Fleet 资源后,必须创建 GitRepo 资源。此资源将包含有关如何访问 chart 的 Fleet 资源以及需要将这些资源应用于哪些群集的信息。

可以通过 Rancher UI 或者通过将资源手动部署到管理群集来创建 GitRepo 资源。

有关如何手动创建和部署 GitRepo 资源的信息,请参见创建部署

要通过 Rancher UI 创建 GitRepo 资源,请参见在 Rancher UI 中访问 Fleet

用于手动部署的 longhorn GitRepo 资源示例:

apiVersion: fleet.cattle.io/v1alpha1
kind: GitRepo
metadata:
  name: longhorn-git-repo
  namespace: fleet-default
spec:
  # If using a tag
  # revision: <user_repository_tag>
  #
  # If using a branch
  # branch: <user_repository_branch>
  paths:
  # As seen in the 'Prepare your Fleet resources' example
  - longhorn
  repo: <user_repository_url>
  targets:
  # Match all clusters
  - clusterSelector: {}
25.5.3.1.3 管理部署的 Helm chart

通过 Fleet 部署后,要进行 Helm chart 升级,请参见第 25.5.3.2 节 “我想升级 Fleet 管理的 Helm chart”

25.5.3.2 我想升级 Fleet 管理的 Helm chart

  1. 确定需要将 chart 升级到哪个版本,以便它与 Edge 3.X.Y 版本兼容。可以在第 33.1 节 “摘要”中查看每个 Edge 版本的 Helm chart 版本。

  2. 在 Fleet 监控的 Git 储存库中,根据第 33.1 节 “摘要”中所述使用正确的 chart 版本储存库编辑 Helm chart 的 fleet.yaml 文件。

  3. 提交更改并将其推送到储存库后,会触发所需 Helm chart 的升级

25.5.3.3 我想升级 EIB 创建的 Helm chart

注意
注意

本节假设您已预先部署了系统升级控制器 (SUC),如果您尚未部署,或者不确定为何需要 SUC,请参见默认的 Day 2 组件(第 25.1.1 节 “组件”)列表。

EIB 利用 rke2/k3s 的自动部署清单功能来部署 Helm chart。它在初始化器节点的 /var/lib/rancher/<rke2/k3s>/server/manifests 位置创建 HelmChart 资源定义清单,然后让 rke2/k3s 拾取该清单并将其自动部署到群集中。

Day 2 的角度看,这意味着对 Helm chart 的任何升级都需要通过编辑特定 chart的 HelmChart 清单文件来进行。为了对多个群集自动完成此过程,本节使用了 SUC 计划

有关信息,请参见以下资源:

25.5.3.3.1 概述

本节旨在概述用户升级一个或多个 Helm chart 所要执行的工作流程。有关完成 Helm chart 升级所要执行的步骤的详细说明,请参见第 25.5.3.3.2 节 “升级步骤”

day2 Helm chart 升级流程图
图 25.6︰ Helm chart 升级工作流程
  1. 该工作流程的第一个步骤是用户提取其 chart 要升级到的新 Helm chart 存档。

  2. 然后对存档进行编码,并将其作为配置传递到位于相关 SUC 计划的 Fleet 目录下的 eib-chart-upgrade-user-data.yaml 文件中。“升级步骤”(第 25.5.3.3.2 节 “升级步骤”)一节会进一步解释此过程。

  3. 然后,用户继续配置并部署 GitRepo 资源,用于将全部所需的资源(SUC 计划、密钥等)传送到下游群集。

    1. 该资源部署在管理群集上的 fleet-default 名称空间下。

  4. Fleet(第 6 章 “Fleet)检测部署的资源,并将配置的所有资源部署到指定的下游群集。部署的资源包括:

    1. eib-chart-upgrade SUC 计划,SUC 将使用它在每个节点上创建升级 Pod

    2. eib-chart-upgrade-script 密钥,其中附带升级脚本升级 Pod 将使用该脚本来升级初始化器节点上的 HelmChart 清单。

    3. eib-chart-upgrade-user-data 密钥,其中附带 chart 数据,升级脚本将使用这些数据来了解需要升级哪些 chart 清单。

  5. 部署 eib-chart-upgrade SUC 计划后,SUC 将拾取该计划并创建一个用于部署升级 Pod 的作业。

  6. 部署后,升级 Pod 将挂载 eib-chart-upgrade-scripteib-chart-upgrade-user-data 密钥,并执行 eib-chart-upgrade-script 密钥附带的升级脚本

  7. 升级脚本执行以下操作:

    1. 确定运行脚本的 Pod 是否已部署在初始化器节点上。初始化器节点是托管 HelmChart 清单的节点。对于单节点群集,它是单个控制平面节点。对于 HA 群集,它是您在 EIB 中创建群集时标记为初始化器的节点。如果您未指定 initializer 属性,则节点列表中的第一个节点将标记为初始化器。有关详细信息,请参见 EIB 的上游文档

      注意
      注意

      如果升级脚本在非初始化器节点上运行,则它会立即完成执行,而不会执行下面的步骤。

    2. 备份要编辑的清单,以确保能够实现灾难恢复。

      注意
      注意

      默认情况下,清单的备份存储在 /tmp/eib-helm-chart-upgrade-<date> 目录下。如果您要使用自定义位置,可以将 MANIFEST_BACKUP_DIR 环境变量传递给 Helm chart 升级 SUC 计划(计划中的示例)。

    3. 编辑 HelmChart 清单。从此版本开始,已更改以下属性以触发 chart 升级:

      1. chartContent 属性的内容已替换为 eib-chart-upgrade-user-data 密钥中提供的经过编码的存档。

      2. version 属性的值已替换为 eib-chart-upgrade-user-data 密钥中提供的版本。

  8. 成功执行升级脚本后,RKE2/K3s 的 Helm 集成将拾取更改并自动触发 Helm chart 的升级。

25.5.3.3.2 升级步骤
  1. 确定您要从中复制 Helm chart 升级逻辑的 Edge 版本标记

  2. fleets/day2/system-upgrade-controller-plans/eib-chart-upgrade Fleet 目录复制到将由 Fleet 用来执行 GitOps 的储存库。

  3. 提取您要升级到的 Helm chart 存档:

    helm pull [chart URL | repo/chartname]
    
    # Alternatively if you want to pull a specific version:
    # helm pull [chart URL | repo/chartname] --version 0.0.0
  4. 对提取的 chart 存档进行编码:

    # Encode the archive and disable line wrapping
    base64 -w 0 <chart-archive>.tgz
  5. 配置您在步骤 2 中复制的 eib-chart-upgrade Fleet 目录下的 eib-chart-upgrade-user-data.yaml 密钥:

    1. 该密钥附带一个名为 chart_upgrade_data.txt 的文件。此文件包含 chart 升级数据,升级脚本将使用这些数据来了解哪些 chart 需要升级。该文件要求以每个 chart 项一行的形式指定配置项,其格式如下:“<name>|<version>|<base64_encoded_archive>”

      1. name - Helm chart 的名称,如 EIB 定义文件的 kubernetes.helm.charts.name[] 属性中所示。

      2. version - 应包含 Helm chart 的新版本。在升级期间,此值用于替换 HelmChart 清单的旧 version 值。

      3. base64_encoded_archive - 在此处传递 base64 -w 0 <chart-archive>.tgz 的输出。在升级期间,此值用于替换 HelmChart 清单的旧 chartContent 值。

        注意
        注意

        在开始添加数据之前,应从该文件中去除 <name>|<version>|<base64_encoded_archive> 行。它是一个示例行,用于说明在何处以及如何配置 chart 数据。

  6. 配置一个 GitRepo 资源用于传送 chart 升级 fleet。有关 GitRepo 的详细信息,请参见 GitRepo 资源

    1. 通过 Rancher UI 配置 GitRepo

      1. 在左上角,选择 ☰ → Continuous Delivery(持续交付)

      2. 转到 Git 储存库 → 添加储存库

      3. 在此处将您的储存库数据路径传递给 chart 升级 fleet

      4. 选择下一步,并指定您要对其中已配置的 chart 进行升级的目标群集

      5. 创建

    2. 如果无法对您的设置使用 Rancher,可以在管理群集上手动配置 GitRepo

      1. 在以下模板中填充您的数据:

        apiVersion: fleet.cattle.io/v1alpha1
        kind: GitRepo
        metadata:
          name: CHANGE_ME
          namespace: fleet-default
        spec:
          # if running from a tag
          # revision: CHANGE_ME
          # if running from a branch
          # branch: CHANGE_ME
          paths:
          # path to your chart upgrade fleet relative to your repository
          - CHANGE_ME
          # your repository URL
          repo: CHANGE_ME
          targets:
          # Select target clusters
          - clusterSelector: CHANGE_ME
          # To match all clusters:
          # - clusterSelector: {}

        有关如何设置和部署 GitRepo 资源的详细信息,请参见 GitRepo 资源创建 GitRepo 资源

        有关如何在更精细的级别匹配目标群集的信息,请参见映射到下游群集

      2. 将配置的 GitRepo 资源部署到管理群集fleet-default 名称空间。

执行这些步骤后,应该可以成功创建 GitRepo 资源。然后,Fleet 将拾取该资源,并创建捆绑包。此捆绑包将包含 GitRepo 在其 Fleet 目录下配置的原始 Kubernetes 资源。

然后,Fleet 会将捆绑包中的所有 Kubernetes 资源部署到指定的下游群集。其中一个资源是触发 chart 升级的 SUC 计划。有关要部署的资源的完整列表以及升级过程的工作流程,请参见“概述”(第 25.5.3.3.1 节 “概述”)一节。

要跟踪升级过程本身,请参见“监控 SUC 计划”(第 25.2.2.2 节 “监控 SUC 计划”)一节。

25.5.3.3.3 示例

下面一节将为第 25.5.3.3.2 节 “升级步骤”一节提供真实示例。

我通过 EIB 部署了以下两个群集:

  • longhorn-single-k3s - 单节点 K3s 群集

  • longhorn-ha-rke2 - HA RKE2 群集

这两个群集都运行 Longhorn,并已使用以下映像定义片段通过 EIB 进行部署:

kubernetes:
  # HA RKE2 cluster specific snippet
  # nodes:
  # - hostname: cp1rke2.example.com
  #   initializer: true
  #   type: server
  # - hostname: cp2rke2.example.com
  #   type: server
  # - hostname: cp3rke2.example.com
  #   type: server
  # - hostname: agent1rke2.example.com
  #   type: agent
  # - hostname: agent2rke2.example.com
  #   type: agent
  # version depending on the distribution
  version: v1.28.9+k3s1/v1.28.9+rke2r1
  helm:
    charts:
    - name: longhorn
      repositoryName: longhorn
      targetNamespace: longhorn-system
      createNamespace: true
      version: 1.5.5
    repositories:
    - name: longhorn
      url: https://charts.longhorn.io
...
day2 Helm chart 升级 - k3s 旧版示例
图 25.7︰ longhorn-single-k3s 安装的 Longhorn 版本
day2 Helm chart 升级 - rke2 旧版示例
图 25.8︰ longhorn-ha-rke2 安装的 Longhorn 版本

这种部署的问题在于,longhorn-single-k3slonghorn-ha-rke2 当前运行的 Longhorn 版本与任何 Edge 版本都不兼容。

我们需要将这两个群集上的 chart 升级到 Edge 支持的 Longhorn 版本。

为此,我们需要执行以下步骤:

  1. 确定我们要从中获取升级逻辑的 Edge 版本标记。例如,此示例将使用 release-3.0.1 版本标记,它支持的 Longhorn 版本为 1.6.1

  2. 克隆 release-3.0.1 版本标记,并将 fleets/day2/system-upgrade-controller-plans/eib-chart-upgrade 目录复制到我们自己的储存库。

    为简单起见,本节将根据 suse-edge/fleet-examples 储存库的某个分支介绍操作步骤,因此目录结构是相同的,但您可以将 eib-chart-upgrade Fleet 目录放入您的储存库中的任何位置。

    目录结构示例:

    .
    ...
    |-- fleets
    |   `-- day2
    |       `-- system-upgrade-controller-plans
    |           `-- eib-chart-upgrade
    |               |-- eib-chart-upgrade-script.yaml
    |               |-- eib-chart-upgrade-user-data.yaml
    |               |-- fleet.yaml
    |               `-- plan.yaml
    ...

  3. 添加 Longhorn chart 储存库:

    helm repo add longhorn https://charts.longhorn.io
  4. 提取 Longhorn chart 版本 1.6.1

    helm pull longhorn/longhorn --version 1.6.1

    这会将 Longhorn 作为名为 longhorn-1.6.1.tgz 的存档来提取。

  5. 对 Longhorn 存档进行编码:

    base64 -w 0 longhorn-1.6.1.tgz

    这会输出该存档的采用 base64 编码的单行字符串。

  6. 现在我们已准备好全部所需的数据,可以配置 eib-chart-upgrade-user-data.yaml 文件。文件配置应如下所示:

    apiVersion: v1
    kind: Secret
    metadata:
      name: eib-chart-upgrade-user-data
    type: Opaque
    stringData:
      # <name>|<version>|<base64_encoded_archive>
      chart_upgrade_data.txt: |
        longhorn|1.6.1|H4sIFAAAAAAA/ykAK2FIUjBjSE02THk5NWIzV...
    1. longhorn 是 EIB 定义文件中所示的 chart 名称

    2. 1.6.1 是要将 Longhorn HelmChart 清单的 version 属性升级到的版本

    3. H4sIFAAAAAAA/ykAK2FIUjBjSE02THk5NWIzV... 是经过编码的 Longhorn 1.6.1 存档的片段。此处添加了片段是为了方便阅读。您始终应在此处提供完整的采用 base64 编码的存档字符串。

      注意
      注意

      此示例显示了单个 chart 的升级配置,如果您的用例需要升级多个群集上的多个 chart,您可以追加其他 chart 数据,如下所示:

      apiVersion: v1
      kind: Secret
      metadata:
        name: eib-chart-upgrade-user-data
      type: Opaque
      stringData:
        # <name>|<version>|<base64_encoded_archive>
        chart_upgrade_data.txt: |
          chartA|0.0.0|<chartA_base64_archive>
          chartB|0.0.0|<chartB_base64_archive>
          chartC|0.0.0|<chartC_base64_archive>
          ...
  7. 我们还确定不要在 /tmp 中保留清单备份,因此在 plan.yaml 文件中添加了以下配置:

    apiVersion: upgrade.cattle.io/v1
    kind: Plan
    metadata:
      name: eib-chart-upgrade
    spec:
      ...
      upgrade:
        ...
        # For when you want to backup your chart
        # manifest data under a specific directory
        #
        envs:
        - name: MANIFEST_BACKUP_DIR
          value: "/root"

    这可以确保将清单备份保存在 /root 目录而不是 /tmp 中。

  8. 完成全部所需的配置后,剩下的操作就是创建 GitRepo 资源。此示例通过 Rancher UI 创建 GitRepo 资源。

  9. 根据“升级步骤”(第 25.5.3.3.2 节 “升级步骤”)中所述的步骤,我们已经:

    1. GitRepo 命名为“longhorn-upgrade”。

    2. 将 URL 传递给要使用的储存库 - https://github.com/suse-edge/fleet-examples.git

    3. 传递储存库的分支 -“doc-example”

    4. 传递储存库中显示的 eib-chart-upgrade Fleet 目录路径 - fleets/day2/system-upgrade-controller-plans/eib-chart-upgrade

    5. 选择目标群集并创建资源

      day2 Helm chart 升级 - GitRepo 示例
      图 25.9︰ 成功部署 SUC 和 Longhorn GitRepo

现在我们需要监控群集上的升级过程:

  1. 按照“监控 SUC 计划”(第 25.2.2.2 节 “监控 SUC 计划”)一节中的指导,检查升级 Pod 的状态。

    1. 已成功完成的、在初始化器节点上运行的升级 Pod 应会保存如下所示的日志:

      day2 Helm chart 升级 - 初始化器日志示例
      图 25.10︰ 升级初始化器节点上运行的 Pod
    2. 已成功完成的、在非初始化器节点上运行的升级 Pod 应会保存如下所示的日志:

      day2 Helm chart 升级 - 非初始化器日志示例
      图 25.11︰ 升级非初始化器节点上运行的 Pod
  2. 升级 Pod 成功完成后,我们还需要等待 Helm 控制器创建 Pod 并监控这些 Pod。这些 Pod 将根据升级 PodHelmChart 清单文件所做的文件更改执行实际升级。

    1. 在您的群集中,转到工作负载 → Pod,然后在 default 名称空间中搜索包含 longhorn 字符串的 Pod。这会使用命名模板 helm-install-longhorn-* 生成一个 Pod,请查看此 Pod 的日志。

      day2 Helm chart 升级 - Helm 安装示例
      图 25.12︰ 已成功完成的 helm-install Pod
    2. 日志应如下所示:

      day2 Helm chart 升级 - 已成功升级的 Pod 示例
      图 25.13︰ 已成功完成的 helm-install Pod 的日志

确保一切成功完成后,我们需要校验版本是否已更改:

  1. 在群集上,转到更多资源 → Helm → HelmChart,然后在 default 名称空间中搜索 longhorn HelmChart 资源:

    day2 Helm chart 升级 - k3s Longhorn 升级示例
    图 25.14︰ longhorn-single-k3s 上已升级的 Longhorn 版本
    day2 Helm chart 升级 - rke2 Longhorn 升级示例
    图 25.15︰ longhorn-ha-rke2 上已升级的 Longhorn 版本

此结果确认 Longhorn Helm chart 已成功升级,本示例到此结束。

如果出于某种原因,我们想要还原到 Longhorn 的前一 chart 版本,可以在初始化器节点上的 /root/longhorn.yaml 中找到旧版 Longhorn 清单。这是肯定的,因为我们已在 SUC 计划中指定了 MANIFEST_BACKUP_DIR

25.5.3.3.4 使用第三方 GitOps 工具进行 Helm chart 升级

在某些用例中,用户可能希望将此升级过程与除 Fleet 以外的 GitOps 工作流程(例如 Flux)配合使用。

要获取与 EIB 所部署的 Helm chart 升级相关的资源,需要首先确定您要使用的 suse-edge/fleet-examples 储存库的 Edge 版本标记。

然后,便可以在 fleets/day2/system-upgrade-controller-plans/eib-chart-upgrade 中查找资源,其中:

  • plan.yaml - 与升级过程相关的系统升级控制器计划。

  • eib-chart-upgrade-script.yaml - 密钥,其中包含负责编辑和升级 HelmChart 清单文件的升级脚本

  • eib-chart-upgrade-user-data.yaml - 密钥,其中包含升级脚本使用的文件;用户需事先在其中填充相关的 chart 升级数据。

重要
重要

这些计划资源由系统升级控制器解释,应部署在包含需要升级的 chart 的每个下游群集上。有关如何部署系统升级控制器的信息,请参见第 25.2.1.3 节 “使用第三方 GitOps 工作流程时部署系统升级控制器”

为了更好地了解如何使用 GitOps 工作流程来为升级过程部署 SUC 计划,建议查看有关使用 Fleet 进行升级的过程概述(第 25.5.3.3.1 节 “概述”)。