documentation.suse.com / SUSE Edge 文档 / 组件 / 升级控制器

23 升级控制器

Kubernetes 控制器可以执行以下 SUSE Edge 平台组件的升级:

  • 操作系统 (SUSE Linux Micro)

  • Kubernetes(K3s 和 RKE2)

  • 其他组件(Rancher、Elemental、SUSE Security 等)

升级控制器通过将上述组件的复杂性封装在一个面向用户的资源(该资源可作为升级触发器)中,来简化这些组件的升级过程。用户只需配置此资源,其余工作均由升级控制器处理。

注意
注意

目前,升级控制器仅支持为非隔离管理群集进行 SUSE Edge 平台升级。有关详细信息,请参见第 23.7 节 “已知限制”

23.1 SUSE Edge 如何使用升级控制器?

升级控制器对于将管理群集从一个 SUSE Edge 版本升级到下一个版本时需自动执行(以前是手动执行)的“Day 2”操作至关重要。

为了实现这种自动化,升级控制器使用了系统升级控制器(第 22 章 “系统升级控制器)和 Helm 控制器等工具。

有关升级控制器工作原理的详细信息,请参见第 23.4 节 “升级控制器的工作原理”

有关升级控制器的已知限制,请参见第 23.7 节 “已知限制”

如需了解升级控制器与系统升级控制器的区别,请参见第 23.2 节 “升级控制器与系统升级控制器”

23.2 升级控制器与系统升级控制器

系统升级控制器 (SUC)(第 22 章 “系统升级控制器)是一款通用工具,负责将升级指令分发到特定的 Kubernetes 节点。

虽然它支持 SUSE Edge 平台的部分“Day 2”操作,但并未涵盖所有此类操作。此外,即便是对于受支持的操作,用户也必须手动配置、维护和部署多个 SUC 计划,因为这一过程容易出错,可能导致意外问题。

这就催生了对下面这样的工具的需求:该工具能够自动化抽象化 SUSE Edge 平台各类“Day 2”操作管理的复杂性。因此,升级控制器应运而生。它通过引入一个面向用户的单一资源来驱动升级,从而简化了升级过程。用户只需管理这一资源,其余工作均由升级控制器处理。

23.3 安装升级控制器

23.3.1 先决条件

23.3.2 步骤

  1. 在您的管理群集上安装升级控制器 Helm chart:

    helm install upgrade-controller oci://registry.suse.com/edge/charts/upgrade-controller --version 303.0.1+up0.1.1 --create-namespace --namespace upgrade-controller-system
  2. 验证升级控制器部署:

    kubectl get deployment -n upgrade-controller-system
  3. 验证升级控制器 Pod:

    kubectl get pods -n upgrade-controller-system
  4. 验证升级控制器 Pod 日志:

    kubectl logs <pod_name> -n upgrade-controller-system

23.4 升级控制器的工作原理

为了执行 Edge 版本升级,升级控制器引入了两个新的 Kubernetes 自定义资源

升级控制器还会创建一个 ReleaseManifest 资源,该资源保存用户在 UpgradePlan 资源的 releaseVersion 属性下指定的 Edge 版本的组件数据。

之后,升级控制器会使用 ReleaseManifest 中的组件数据,按以下顺序升级 Edge 版本组件:

注意
注意

在升级过程中,升级控制器会持续向创建的 UpgradePlan 输出升级信息。有关如何跟踪升级过程的详细信息,请参见第 23.6 节 “跟踪升级过程”

23.4.1 操作系统升级

升级操作系统时,升级控制器会创建命名模板如下的 SUC(第 22 章 “系统升级控制器)计划:

  • 对于与控制平面节点操作系统升级相关的 SUC 计划 - control-plane-<os-name>-<os-version>-<suffix>

  • 对于与工作节点操作系统升级相关的 SUC 计划 - workers-<os-name>-<os-version>-<suffix>

SUC 会根据这些计划,继续在执行实际操作系统升级的群集的每个节点上创建工作负载。

根据 ReleaseManifest,操作系统升级可能包括:

  • 仅软件包更新 - 适用于操作系统版本不随 Edge 版本变动的使用场景。

  • 完整操作系统迁移 - 适用于操作系统版本随 Edge 版本变动的使用场景。

升级首先从控制平面节点开始,一次执行一个节点的升级。只有在控制平面节点的升级完成后,工作节点才会开始升级。

注意
注意

如果群集有多个指定类型的节点,升级控制器会配置操作系统 SUC 计划来清空群集节点。

对于控制平面节点有多个而工作节点只有一个的群集,只会清空控制平面节点,反之亦然。

有关如何完全禁用节点清空的信息,请参见“UpgradePlan”(第 23.5.1 节 “UpgradePlan”)一节。

23.4.2 Kubernetes 升级

升级群集的 Kubernetes 发行版时,升级控制器会创建具有以下命名模板的 SUC(第 22 章 “系统升级控制器)计划:

  • 对于与控制平面节点 Kubernetes 升级相关的 SUC 计划 - control-plane-<k8s-version>-<suffix>

  • 对于与工作节点 Kubernetes 升级相关的 SUC 计划 - workers-<k8s-version>-<suffix>

SUC 会根据这些计划,继续在执行实际 Kubernetes 升级的群集的每个节点上创建工作负载。

Kubernetes 升级将从控制平面节点开始,一次升级一个节点。只有在控制平面节点的升级完成后,工作节点才会开始升级。

注意
注意

如果群集有多个指定类型的节点,升级控制器会配置 Kubernetes SUC 计划来清空群集节点。

对于控制平面节点有多个而工作节点只有一个的群集,只会清空控制平面节点,反之亦然。

有关如何完全禁用节点清空的信息,请参见第 23.5.1 节 “UpgradePlan”

23.4.3 其他组件的升级

目前,所有其他组件都是通过 Helm chart 安装的。有关特定版本各组件的完整列表,请参见发行说明(第 52.1 节 “摘要”)。

对于通过 EIB(第 11 章 “Edge Image Builder)部署的 Helm chart,升级控制器会更新每个组件的现有 HelmChart CR

对于在 EIB 之外部署的 Helm chart,升级控制器会为每个组件创建一个 HelmChart 资源。

在创建/更新 HelmChart 资源后,升级控制器会依赖 helm-controller 来拾取此更改并继续执行实际的组件升级。

Chart 将按照 ReleaseManifest 中的顺序依次升级。您还可通过 UpgradePlan 传递其他值。如果在新 SUSE Edge 版本中某个 chart 的版本保持不变,则不会将其升级。有关这方面的详细信息,请参见第 23.5.1 节 “UpgradePlan”

23.5 Kubernetes API 扩展

升级控制器引入的 Kubernetes API 的扩展。

23.5.1 UpgradePlan

升级控制器引入了一个名为 UpgradePlan 的新 Kubernetes 自定义资源

UpgradePlan 是升级控制器的指令机制,支持以下配置:

  • releaseVersion - 群集应升级到的 Edge 版本。版本必须遵循语义版本规范,并且应从发行说明(第 52.1 节 “摘要”)中检索。

  • disableDrain - 可选;指示升级控制器是否禁用节点清空。当您有具有干扰预算的工作负载时,可以用到。

    • 禁用控制平面节点清空的示例:

      spec:
        disableDrain:
          controlPlane: true
    • 禁用控制平面和工作节点清空的示例:

      spec:
        disableDrain:
          controlPlane: true
          worker: true
  • helm - 可选;为通过 Helm 安装的组件指定其他值。

    警告
    警告

    建议仅将此字段用于对升级至关重要的值。标准 chart 值的更新应在相应 chart 升级到下一版本后进行。

    • 示例:

      spec:
        helm:
        - chart: foo
          values:
            bar: baz

23.5.2 ReleaseManifest

升级控制器引入了一个名为 ReleaseManifest 的新 Kubernetes 自定义资源

ReleaseManifest 资源由升级控制器创建,保存一个特定 Edge 版本的组件数据。这意味着每个 Edge 版本升级都将由不同的 ReleaseManifest 资源表示。

警告
警告

ReleaseManifest 只能由升级控制器创建。

不建议手动创建或编辑 ReleaseManifest 资源,否则,用户需自行承担风险

版本清单附带的组件数据包括但不限于:

  • 操作系统数据 - 版本、支持的体系结构、其他升级数据等

  • Kubernetes 发行版数据 - RKE2/K3s 支持的版本

  • 其他组件数据 - SUSE Helm chart 数据(位置、版本、名称等)

有关版本清单的示例,请参见上游文档。请注意,这只是一个示例,不可用于创建为有效的 ReleaseManifest 资源。

23.6 跟踪升级过程

本节介绍如何跟踪和调试升级控制器在用户创建 UpgradePlan 资源后启动的升级资源过程。

23.6.1 一般信息

有关升级过程状态的一般信息,可以在升级计划的状态条件中查看。

可以通过以下方式查看升级计划资源的状态:

kubectl get upgradeplan <upgradeplan_name> -n upgrade-controller-system -o yaml

升级计划运行示例:

apiVersion: lifecycle.suse.com/v1alpha1
kind: UpgradePlan
metadata:
  name: upgrade-plan-mgmt
  namespace: upgrade-controller-system
spec:
  releaseVersion: 3.3.1
status:
  conditions:
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: Control plane nodes are being upgraded
    reason: InProgress
    status: "False"
    type: OSUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: Kubernetes upgrade is not yet started
    reason: Pending
    status: Unknown
    type: KubernetesUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: Rancher upgrade is not yet started
    reason: Pending
    status: Unknown
    type: RancherUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: Longhorn upgrade is not yet started
    reason: Pending
    status: Unknown
    type: LonghornUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: MetalLB upgrade is not yet started
    reason: Pending
    status: Unknown
    type: MetalLBUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: CDI upgrade is not yet started
    reason: Pending
    status: Unknown
    type: CDIUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: KubeVirt upgrade is not yet started
    reason: Pending
    status: Unknown
    type: KubeVirtUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: NeuVector upgrade is not yet started
    reason: Pending
    status: Unknown
    type: NeuVectorUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: EndpointCopierOperator upgrade is not yet started
    reason: Pending
    status: Unknown
    type: EndpointCopierOperatorUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: Elemental upgrade is not yet started
    reason: Pending
    status: Unknown
    type: ElementalUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: SRIOV upgrade is not yet started
    reason: Pending
    status: Unknown
    type: SRIOVUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: Akri upgrade is not yet started
    reason: Pending
    status: Unknown
    type: AkriUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: Metal3 upgrade is not yet started
    reason: Pending
    status: Unknown
    type: Metal3Upgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: RancherTurtles upgrade is not yet started
    reason: Pending
    status: Unknown
    type: RancherTurtlesUpgraded
  observedGeneration: 1
  sucNameSuffix: 90315a2b6d

通过这种方式,您可以查看升级控制器将尝试安排升级的每个组件。每个条件都采用以下模板:

  • lastTransitionTime - 此组件条件上一次改变状态的时间。

  • message - 指示特定组件条件当前升级状态的消息。

  • reason - 特定组件条件的当前升级状态。可能的 reason 包括:

    • Succeeded - 特定组件升级成功。

    • Failed - 特定组件升级失败。

    • InProgress - 特定组件的升级当前正在进行中。

    • Pending - 尚未安排特定组件的升级。

    • Skipped - 在群集上找不到特定组件,因此将跳过其升级。

    • Error - 特定组件发生了临时错误。

  • status - 当前条件 type 的状态,可以是 TrueFalseUnknown

  • type - 当前已升级组件的指示器。

升级控制器会为 OSUpgradedKubernetesUpgraded 类型的组件条件创建 SUC 计划。要进一步跟踪为这些组件创建的 SUC 计划,请参见第 22.3 节 “监控系统升级控制器计划”

要进一步跟踪所有其他组件条件类型,可以查看 helm-controller 为它们创建的资源。有关详细信息,请参见第 23.6.2 节 “Helm 控制器”

当满足以下条件时,升级控制器安排的升级计划可以标记为 successful

  1. 不存在 PendingInProgress 的组件条件。

  2. lastSuccessfulReleaseVersion 属性指向升级计划配置中指定的 releaseVersion升级过程成功后,升级控制器会将此属性添加至升级计划的状态。

成功的 UpgradePlan 示例:

apiVersion: lifecycle.suse.com/v1alpha1
kind: UpgradePlan
metadata:
  name: upgrade-plan-mgmt
  namespace: upgrade-controller-system
spec:
  releaseVersion: 3.3.1
status:
  conditions:
  - lastTransitionTime: "2024-10-01T06:26:48Z"
    message: All cluster nodes are upgraded
    reason: Succeeded
    status: "True"
    type: OSUpgraded
  - lastTransitionTime: "2024-10-01T06:26:59Z"
    message: All cluster nodes are upgraded
    reason: Succeeded
    status: "True"
    type: KubernetesUpgraded
  - lastTransitionTime: "2024-10-01T06:27:13Z"
    message: Chart rancher upgrade succeeded
    reason: Succeeded
    status: "True"
    type: RancherUpgraded
  - lastTransitionTime: "2024-10-01T06:27:13Z"
    message: Chart longhorn is not installed
    reason: Skipped
    status: "False"
    type: LonghornUpgraded
  - lastTransitionTime: "2024-10-01T06:27:13Z"
    message: Specified version of chart metallb is already installed
    reason: Skipped
    status: "False"
    type: MetalLBUpgraded
  - lastTransitionTime: "2024-10-01T06:27:13Z"
    message: Chart cdi is not installed
    reason: Skipped
    status: "False"
    type: CDIUpgraded
  - lastTransitionTime: "2024-10-01T06:27:13Z"
    message: Chart kubevirt is not installed
    reason: Skipped
    status: "False"
    type: KubeVirtUpgraded
  - lastTransitionTime: "2024-10-01T06:27:13Z"
    message: Chart neuvector-crd is not installed
    reason: Skipped
    status: "False"
    type: NeuVectorUpgraded
  - lastTransitionTime: "2024-10-01T06:27:14Z"
    message: Specified version of chart endpoint-copier-operator is already installed
    reason: Skipped
    status: "False"
    type: EndpointCopierOperatorUpgraded
  - lastTransitionTime: "2024-10-01T06:27:14Z"
    message: Chart elemental-operator upgrade succeeded
    reason: Succeeded
    status: "True"
    type: ElementalUpgraded
  - lastTransitionTime: "2024-10-01T06:27:15Z"
    message: Chart sriov-crd is not installed
    reason: Skipped
    status: "False"
    type: SRIOVUpgraded
  - lastTransitionTime: "2024-10-01T06:27:16Z"
    message: Chart akri is not installed
    reason: Skipped
    status: "False"
    type: AkriUpgraded
  - lastTransitionTime: "2024-10-01T06:27:19Z"
    message: Chart metal3 is not installed
    reason: Skipped
    status: "False"
    type: Metal3Upgraded
  - lastTransitionTime: "2024-10-01T06:27:27Z"
    message: Chart rancher-turtles is not installed
    reason: Skipped
    status: "False"
    type: RancherTurtlesUpgraded
  lastSuccessfulReleaseVersion: 3.3.1
  observedGeneration: 1
  sucNameSuffix: 90315a2b6d

23.6.2 Helm 控制器

本节介绍如何跟踪 helm-controller 创建的资源。

注意
注意

以下步骤假设 kubectl 已配置为连接到已部署升级控制器的群集。

  1. 找到特定组件的 HelmChart 资源:

    kubectl get helmcharts -n kube-system
  2. 使用 HelmChart 资源的名称找到由 helm-controller 创建的升级 Pod:

    kubectl get pods -l helmcharts.helm.cattle.io/chart=<helmchart_name> -n kube-system
    
    # Example for Rancher
    kubectl get pods -l helmcharts.helm.cattle.io/chart=rancher -n kube-system
    NAME                         READY   STATUS      RESTARTS   AGE
    helm-install-rancher-tv9wn   0/1     Completed   0          16m
  3. 查看特定组件 Pod 的日志:

    kubectl logs <pod_name> -n kube-system

23.7 已知限制

  • 下游群集的升级目前还不受升级控制器管理。有关如何升级下游群集的信息,请参见第 36 章 “下游群集

  • 升级控制器希望通过 EIB(第 11 章 “Edge Image Builder)部署的任何其他 SUSE Edge Helm chart 将其 HelmChart CR 部署在 kube-system 名称空间中。为此,请在 EIB 定义文件中配置 installationNamespace 属性。有关详细信息,请参见上游文档。

  • 目前,升级控制器无法确定管理群集上当前运行的 Edge 版本。请确保提供的 Edge 版本高于群集上当前运行的 Edge 版本。

  • 目前,升级控制器仅支持非隔离环境升级,还不支持隔离式升级。

Documentation survey