20 升级控制器 #
请参见升级控制器文档。
Kubernetes 控制器能够执行基础架构平台升级,包括:
操作系统 (SL Micro)
Kubernetes(K3s 和 RKE2)
其他组件(Rancher、Elemental、NeuVector 等)
20.1 SUSE Edge 如何使用升级控制器? #
升级控制器对于将管理
群集从一个 SUSE
Edge 版本升级到下一个版本时需自动执行(以前是手动执行)的 Day 2
操作至关重要。
为了实现这种自动化,升级控制器
使用了系统升级控制器(第 19 章 “系统升级控制器”)和 Helm 控制器等工具。
有关升级控制器
工作原理的更多详细信息,请参见“升级控制器的工作原理”(第 20.3 节 “升级控制器的工作原理”)。
有关升级控制器
的已知限制,请参见“已知限制”(第 20.6 节 “已知限制”)一节。
20.2 安装升级控制器 #
20.2.1 先决条件 #
系统升级控制器(第 19.2 节 “安装系统升级控制器”)
一个 Kubernetes 群集,可以是 K3s 或 RKE2
20.2.2 步骤 #
在您的管理群集上安装
升级控制器
Helm chart:helm install upgrade-controller oci://registry.suse.com/edge/3.1/upgrade-controller-chart --version 0.1.0 --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
20.3 升级控制器的工作原理 #
为了执行 Edge 版本升级,升级控制器引入了两个
新的 Kubernetes 自定义资源:
UpgradePlan(第 20.4.1 节 “UpgradePlan”)-
由用户创建
;保存有关 Edge 版本升级的配置。ReleaseManifest(第 20.4.2 节 “ReleaseManifest”)-
由升级控制器创建
;保存具体的 Edge 版本所对应的特定组件版本。用户不得进行编辑。
升级控制器还会创建一个
ReleaseManifest
资源,该资源保存用户在
UpgradePlan
资源的 releaseVersion
属性下指定的
Edge 版本的组件数据。
之后,升级控制器会使用
ReleaseManifest
中的组件数据,按以下顺序升级 Edge 版本组件:
操作系统 (OS)(第 20.3.1 节 “操作系统升级”)。
Kubernetes(第 20.3.2 节 “Kubernetes 升级”)。
其他组件(第 20.3.3 节 “其他组件升级”)。
20.3.1 操作系统升级 #
升级操作系统组件时,升级控制器会创建命名模板如下的 SUC(第 19 章 “系统升级控制器”)计划:
对于与
控制平面
节点操作系统升级相关的 SUC 计划 -control-plane-<os-name>-<os-version>-<suffix>
。对于与
工作
节点操作系统升级相关的 SUC 计划 -workers-<os-name>-<os-version>-<suffix>
。
SUC 会根据这些计划,继续在执行实际操作系统升级的群集的每个节点上创建工作负载。
根据 ReleaseManifest
,操作系统升级可能包括:
仅软件包更新
- 适用于操作系统版本不随 Edge 版本变动的用例。完整操作系统迁移
- 适用于操作系统版本随 Edge 版本变动的用例。
升级首先从控制平面
节点开始,一次执行一个节点的升级。只有当控制平面
节点升级完成后,工作
节点才会开始升级。
如果群集有多个特定类型的节点,升级控制器会配置操作系统 SUC 计划
来清空群集节点。
对于控制平面
节点有多个而工作节点只有一个的群集,只会清空
控制平面
节点,反之亦然。
有关如何完全禁用节点清空的信息,请参见“UpgradePlan”(第 20.4.1 节 “UpgradePlan”)一节。
20.3.2 Kubernetes 升级 #
升级群集的 Kubernetes 发行版时,升级控制器会创建具有以下命名模板的 SUC(第 19 章 “系统升级控制器”)计划:
对于与
控制平面
节点 Kubernetes 升级相关的 SUC 计划 -control-plane-<k8s-version>-<suffix>
。对于与
工作
节点 Kubernetes 升级相关的 SUC 计划 -workers-<k8s-version>-<suffix>
。
SUC 会根据这些计划,继续在执行实际 Kubernetes 升级的群集的每个节点上创建工作负载。
Kubernetes
升级将从控制平面节点
开始,一次一个节点。只有当控制平面
节点升级完成后,工作
节点才会开始升级。
升级控制器会配置 Kubernetes SUC
计划
在群集有多个特定类型的节点时,清空该类型的节点。
对于控制平面
节点有多个而工作节点只有一个的群集,只会清空
控制平面
节点,反之亦然。
有关如何完全禁用节点清空的信息,请参见“UpgradePlan”(第 20.4.1 节 “UpgradePlan”)一节。
20.3.3 其他组件升级 #
目前,所有其他组件都是通过 Helm chart 安装的。有关特定版本各组件的完整列表,请参见发行说明(第 45.1 节 “摘要”)。
对于通过 EIB(第 9 章 “Edge Image Builder”)部署的 Helm chart,升级控制器会更新每个组件的现有 HelmChart CR。
对于部署在 EIB 之外的 Helm chart,升级控制器会为每个组件创建一个
HelmChart
资源。
在创建/更新
HelmChart
资源后,升级控制器会依赖 helm-controller
来拾取此更改并继续执行实际的组件升级。
chart 将根据它们在 ReleaseManifest
中的顺序依次升级。其他值也可以通过
UpgradePlan
传递。有关此内容的详细信息,请参见“UpgradePlan”(第 20.4.1 节 “UpgradePlan”)一节。
20.4 Kubernetes API 扩展 #
升级控制器引入的对 Kubernetes API 的扩展。
20.4.1 UpgradePlan #
升级控制器
引入了一个 名为 UpgradePlan
的新
Kubernetes 自定义资源。
UpgradePlan
是升级控制器
的指令机制,支持以下配置:
releaseVersion
- 群集应升级到的 Edge 版本。版本必须遵循语义版本规范,并且应从发行说明(第 45.1 节 “摘要”)中检索。disableDrain
- 可选;指示升级控制器是否禁用节点清空。当您有具有干扰预算的工作负载时,可以用到。禁用
控制平面
节点清空的示例:spec: disableDrain: controlPlane: true
禁用
控制平面
和工作
节点清空的示例:spec: disableDrain: controlPlane: true worker: true
helm
- 可选;为通过 Helm 安装的组件指定其他值。警告建议仅将此字段用于对升级至关重要的值。标准 chart 值的更新应在相应 chart 升级到下一版本后进行。
示例:
spec: helm: - chart: foo values: bar: baz
20.4.2 ReleaseManifest #
升级控制器
引入了一个名为 ReleaseManifest
的新
Kubernetes 自定义资源。
ReleaseManifest
由升级控制器
创建,保存一个特定 Edge 版本的组件数据。这意味着每个 Edge 版本升级都将由不同的
ReleaseManifest
资源表示。
ReleaseManifest
只能由升级控制器
创建。
不建议手动创建或编辑 ReleaseManifest
,否则,用户需自行承担风险。
ReleaseManifest
附带的组件数据包括但不限于:
有关 ReleaseManifest
的示例,请参见上游文档。请注意,这只是一个示例,意图并非将其创建为有效的
ReleaseManifest
资源。
20.5 跟踪升级过程 #
本节介绍如何跟踪和调试升级控制器
在用户创建 UpgradePlan
后启动的升级过程
。
20.5.1 一般信息 #
有关升级过程
状态的一般信息,可以在 UpgradePlan
的状态条件中查看。
UpgradePlan
资源的状态可以通过以下方式查看:
kubectl get upgradeplan <upgradeplan_name> -n upgrade-controller-system -o yaml
运行 UpgradePlan
示例:
apiVersion: lifecycle.suse.com/v1alpha1
kind: UpgradePlan
metadata:
name: upgrade-plan-mgmt-3-1-0
namespace: upgrade-controller-system
spec:
releaseVersion: 3.1.0
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
计划,请参见“监控系统升级控制器计划”(第 19.3 节 “监控系统升级控制器计划”)一节。
要进一步跟踪所有其他组件条件类型,可以查看 helm-controller 为它们创建的资源。有关详细信息,请参见“Helm 控制器”(第 20.5.2 节 “Helm 控制器”)一节。
当满足以下条件时,升级控制器
安排的 UpgradePlan
可以标记为
successful
:
不存在
Pending
或InProgress
的组件条件。lastSuccessfulReleaseVersion
属性指向UpgradePlan
配置中指定的releaseVersion
。升级过程
成功后,升级控制器
会将此属性添加至UpgradePlan
的状态。
成功的 UpgradePlan
的示例:
apiVersion: lifecycle.suse.com/v1alpha1
kind: UpgradePlan
metadata:
name: upgrade-plan-mgmt-3-1-0
namespace: upgrade-controller-system
spec:
releaseVersion: 3.1.0
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.1.0
observedGeneration: 1
sucNameSuffix: 90315a2b6d
20.5.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
20.6 已知限制 #
下游
群集的升级目前还不受升级控制器
管理。有关如何升级下游
群集的信息,请参见“下游群集”(第 29 章 “下游群集”)一节。升级控制器
希望通过 EIB(第 9 章 “Edge Image Builder”)部署的任何其他 SUSE Edge Helm chart 将其 HelmChart CR 部署在kube-system
名称空间中。为此,请在 EIB 定义文件中配置installationNamespace
属性。有关详细信息,请参见上游文档。目前,
升级控制器
无法确定管理
群集上当前运行的 Edge 版本。请确保提供的 Edge 版本高于群集上当前运行的 Edge 版本。目前,
升级控制器
仅支持非隔离环境升级,还不支持隔离式升级。