23 升级控制器 #
Kubernetes 控制器可以执行以下 SUSE Edge 平台组件的升级:
操作系统 (SUSE Linux Micro)
Kubernetes(K3s 和 RKE2)
其他组件(Rancher、Elemental、SUSE Security 等)
升级控制器通过将上述组件的复杂性封装在一个面向用户
的资源(该资源可作为升级触发器)中,来简化这些组件的升级过程。用户只需配置此资源,其余工作均由升级控制器
处理。
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 先决条件 #
系统升级控制器(第 22.2 节 “安装系统升级控制器”)
一个 Kubernetes 群集,可以是 K3s 或 RKE2
23.3.2 步骤 #
在您的管理群集上安装升级控制器 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
验证升级控制器部署:
kubectl get deployment -n upgrade-controller-system
验证升级控制器 Pod:
kubectl get pods -n upgrade-controller-system
验证升级控制器 Pod 日志:
kubectl logs <pod_name> -n upgrade-controller-system
23.4 升级控制器的工作原理 #
为了执行 Edge 版本升级,升级控制器引入了两个新的 Kubernetes 自定义资源:
UpgradePlan(第 23.5.1 节 “UpgradePlan”)- 由用户创建;保存有关 Edge 版本升级的配置。
ReleaseManifest(第 23.5.2 节 “ReleaseManifest”)- 由升级控制器创建;保存特定的 Edge 版本所对应的组件版本。用户不得编辑此文件。
升级控制器还会创建一个 ReleaseManifest
资源,该资源保存用户在
UpgradePlan
资源的 releaseVersion
属性下指定的
Edge 版本的组件数据。
之后,升级控制器会使用 ReleaseManifest
中的组件数据,按以下顺序升级 Edge 版本组件:
操作系统 (OS)(第 23.4.1 节 “操作系统升级”)。
Kubernetes(第 23.4.2 节 “Kubernetes 升级”)。
其他组件(第 23.4.3 节 “其他组件的升级”)。
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
资源,否则,用户需自行承担风险。
版本清单附带的组件数据包括但不限于:
有关版本清单的示例,请参见上游文档。请注意,这只是一个示例,不可用于创建为有效的
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
的状态,可以是True
、False
或Unknown
。type
- 当前已升级组件的指示器。
升级控制器会为 OSUpgraded
和
KubernetesUpgraded
类型的组件条件创建 SUC 计划。要进一步跟踪为这些组件创建的 SUC
计划,请参见第 22.3 节 “监控系统升级控制器计划”。
要进一步跟踪所有其他组件条件类型,可以查看 helm-controller 为它们创建的资源。有关详细信息,请参见第 23.6.2 节 “Helm 控制器”。
当满足以下条件时,升级控制器安排的升级计划可以标记为 successful
:
不存在
Pending
或InProgress
的组件条件。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
已配置为连接到已部署升级控制器的群集。
找到特定组件的
HelmChart
资源:kubectl get helmcharts -n kube-system
使用
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
查看特定组件 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 版本。
目前,升级控制器仅支持非隔离环境升级,还不支持隔离式升级。