25 下游群集 #
本章介绍如何使用管理群集
对下游群集的不同组件执行各种 Day 2
操作。
25.1 简介 #
本节旨在充当 Day 2
操作文档的起点,在其中可以找到以下信息。
用于在多个下游群集中实现
Day 2
操作的默认组件(第 25.1.1 节 “组件”)。确定要为特定用例使用哪些
Day 2
资源(第 25.1.2 节 “确定您的用例”)。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 工具的用例,请参见:
对于
操作系统软件包更新
- 第 25.3.4.3 节 “SUC 计划部署 - 第三方 GitOps 工作流程”对于
Kubernetes 发行版升级
- 第 25.4.4.3 节 “SUC 计划部署 - 第三方 GitOps 工作流程”对于
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 方法的非隔离环境中部署 SUC
或 SUC
计划
。
或者,如果您通过本地 git 服务器镜像储存库设置,则
GitRepo
资源也可用于在隔离环境中部署
SUC
或 SUC 计划
。
25.1.2.2 捆绑包 #
捆绑包
包含了要在目标群集上部署的原始
Kubernetes 资源。通常它们是基于 GitRepo
资源创建的,但在某些用例中也可以手动部署。有关详细信息,请参见捆绑包文档。
就 Day 2
操作而言,捆绑包
资源通常用于在不使用某种形式的本地 GitOps
过程(例如本地 git 服务器)的隔离环境中部署 SUC
或 SUC
计划
。
或者,如果您的用例不允许使用 GitOps 工作流程(例如需使用 Git 储存库),则捆绑包资源也可用于在非隔离环境中部署 SUC
或 SUC
计划
。
25.1.3 Day 2 工作流程 #
下面是在将下游群集升级到特定 Edge 版本时应遵循的 Day 2
工作流程。
操作系统软件包更新(第 25.3 节 “操作系统软件包更新”)
Kubernetes 版本升级(第 25.4 节 “Kubernetes 版本升级”)
Helm chart 升级(第 25.5 节 “Helm chart 升级”)
25.2 系统升级控制器部署指南 #
系统升级控制器 (SUC) 负责根据自定义资源(称为计划)中定义的配置在指定节点上部署资源。有关详细信息,请参见上游文档。
本节只会重点介绍如何部署系统升级控制器
。应根据以下文档部署计划资源:
操作系统软件包更新(第 25.3 节 “操作系统软件包更新”)
Kubernetes 版本升级(第 25.4 节 “Kubernetes 版本升级”)
Helm chart 升级(第 25.5 节 “Helm chart 升级”)
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
:
通过 Rancher UI(第 25.2.1.1.1 节 “GitRepo 部署 - Rancher UI”)(如果
Rancher
可用)通过将资源手动部署(第 25.2.1.1.2 节 “GitRepo 创建 - 手动”)到
管理群集
创建 GitRepo 后,Fleet
将负责拾取资源,并将 SUC 资源部署到所有目标群集。有关如何跟踪部署过程的信息,请参见第 25.2.2.1 节 “监控 SUC 部署”。
25.2.1.1.1 GitRepo 部署 - Rancher UI #
在左上角,选择 ☰ → Continuous Delivery(持续交付)
转到 Git 储存库 → 添加储存库
如果使用 suse-edge/fleet-examples
储存库,请执行以下步骤:
Watch(监视)→ Revision(修订版)- 为要使用的
suse-edge/fleet-examples
储存库选择版本标记,例如release-3.0.1
。在路径下,添加版本标记中显示的系统升级控制器路径 -
fleets/day2/system-upgrade-controller
选择下一步转到目标配置部分
请仅选择您要为其部署
系统升级控制器
的群集。如果您对配置感到满意,请单击创建
或者,如果您决定使用自己的储存库来托管这些文件,则需要提供上述储存库数据。
25.2.1.1.2 GitRepo 创建 - 手动 #
选择您要从中部署 SUC
GitRepo
的所需 Edge 版本标记(在下文中用${REVISION}
表示)。提取 GitRepo 资源:
curl -o system-upgrade-controller-gitrepo.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/{REVISION}/gitrepos/day2/system-upgrade-controller-gitrepo.yaml
编辑 GitRepo 配置,在
spec.targets
下指定所需的目标列表。默认情况下,suse-edge/fleet-examples
中的GitRepo
资源不会映射到任何下游群集。为了匹配所有群集,请将默认的
GitRepo
目标更改为:spec: targets: - clusterSelector: {}
或者,如果您要更细致地选择群集,请参见映射到下游群集
将 GitRepo 资源应用于
管理群集
:kubectl apply -f system-upgrade-controller-gitrepo.yaml
查看
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
储存库,请确保使用带有专用版本标记的资源。
可通过以下方式之一创建捆绑包
:
通过 Rancher UI(第 25.2.1.2.1 节 “捆绑包创建 - Rancher UI”)(如果
Rancher
可用)通过将资源手动部署(第 25.2.1.2.2 节 “捆绑包创建 - 手动”)到
管理群集
创建捆绑包后,Fleet
将负责拾取资源,并将 SUC 资源部署到所有目标群集。有关如何跟踪部署过程的信息,请参见第 25.2.2.1 节 “监控 SUC 部署”。
25.2.1.2.1 捆绑包创建 - Rancher UI #
在左上角,选择 ☰ → Continuous Delivery(持续交付)
转到高级 > 捆绑包
选择从 YAML 创建
此处可通过以下方式之一创建捆绑包:
通过手动将文件内容复制到从 YAML 创建页面。可从以下 URL 检索文件内容 - https://raw.githubusercontent.com/suse-edge/fleet-examples/${REVISION}/bundles/day2/system-upgrade-controller/controller-bundle.yaml。其中
${REVISION}
是您需要的 Edge 版本标记(例如release-3.0.1
)。通过将
suse-edge/fleet-examples
储存库克隆到所需的版本标记中,并在从 YAML 创建页面中选择从文件读取选项。然后导航到bundles/day2/system-upgrade-controller
目录并选择controller-bundle.yaml
。这会在从 YAML 创建页面中自动填充捆绑包内容。
更改
捆绑包
的目标群集:为了匹配所有下游群集,请将默认的捆绑包
.spec.targets
更改为:spec: targets: - clusterSelector: {}
有关更精细的下游群集映射,请参见映射到下游群集。
创建
25.2.1.2.2 捆绑包创建 - 手动 #
选择您要从中部署 SUC
捆绑包
的所需 Edge 版本标记(在下文中用${REVISION}
表示)。提取捆绑包资源:
curl -o controller-bundle.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/${REVISION}/bundles/day2/system-upgrade-controller/controller-bundle.yaml
编辑
捆绑包
目标配置,在spec.targets
下提供所需的目标列表。默认情况下,suse-edge/fleet-examples
中的捆绑包
资源不会映射到任何下游群集。为了匹配所有群集,请将默认的
捆绑包
目标更改为:spec: targets: - clusterSelector: {}
或者,如果您要更细致地选择群集,请参见映射到下游群集
将捆绑包资源应用于
管理群集
:kubectl apply -f controller-bundle.yaml
查看
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 日志,请执行以下操作:
25.2.2.2 监控 SUC 计划 #
SUC 计划 Pod 会保持活动状态 15 分钟。此期限过后,创建它们的相应作业会将其去除。要访问 SUC 计划 Pod 日志,应该为群集启用日志记录。有关如何在 Rancher 中执行此操作的信息,请参见 Rancher 与日志记录服务的集成。
要检查特定 SUC 计划的 Pod 日志,请执行以下操作:
在左上角,选择 ☰ → <您的群集名称>
选择工作负载 → Pod
在名称空间下拉菜单中选择
cattle-system
名称空间在 Pod 过滤栏中输入 SUC 计划 Pod 的名称。该名称采用以下模板格式:
apply-<计划名称>-on-<节点名称>
图 25.1︰ Kubernetes 升级计划 Pod 示例 #请注意,在图 1 中,有一个 Pod 处于已完成状态,另有一个 Pod 处于未知状态。这是预料之中的情况,其原因是在节点上执行了 Kubernetes 版本升级。
图 25.2︰ 操作系统软件包更新计划 Pod 示例 #图 25.3︰ HA 群集上 EIB 部署的 Helm chart 的升级计划 Pod 示例 #选择您要查看其日志的 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 要求 #
一般:
已在 SCC 中注册的计算机 - 所有下游群集节点都应已注册到
https://scc.suse.com/
。只有这样,edge-update.service
才能成功连接到所需的操作系统 RPM 储存库。确保 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" ...
隔离:
镜像 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 计划通过以下方式交付:
通过
GitRepo
资源 - 第 25.3.4.1 节 “SUC 计划部署 - GitRepo 资源”通过
捆绑包
资源 - 第 25.3.4.2 节 “SUC 计划部署 - 捆绑包资源”
要确定使用哪个资源,请参见第 25.1.2 节 “确定您的用例”。
有关更新过程中会发生哪些情况的完整概述,请参见第 25.3.3.1 节 “概述”一节。
25.3.3.1 概述 #
本节旨在介绍操作系统软件包更新过程从头到尾的完整工作流程。
操作系统软件包更新步骤:
用户可以根据用例,确定是要使用 GitRepo 还是捆绑包资源将
操作系统软件包更新 SUC 计划
部署到所需的下游群集。有关如何将 GitRepo/捆绑包映射到特定的一组下游群集的信息,请参见映射到下游群集。如果您不确定是要使用 GitRepo 还是捆绑包资源进行 SUC 计划部署,请参见第 25.1.2 节 “确定您的用例”。
有关 GitRepo/捆绑包配置选项,请参见第 25.3.4.1 节 “SUC 计划部署 - GitRepo 资源”或第 25.3.4.2 节 “SUC 计划部署 - 捆绑包资源”。
用户将配置的 GitRepo/捆绑包资源部署到其
管理群集
中的fleet-default
名称空间。此操作可以手动完成,也可以通过 Rancher UI(如果可用)完成。Fleet(第 6 章 “Fleet”)持续监控
fleet-default
名称空间,并立即检测新部署的 GitRepo/捆绑包资源。有关 Fleet 监控哪些名称空间的详细信息,请参见 Fleet 的名称空间文档。如果用户已部署 GitRepo 资源,
Fleet
将协调 GitRepo,并根据其路径和 fleet.yaml 配置,在fleet-default
名称空间中部署捆绑包资源。有关详细信息,请参见 Fleet 的 GitRepo 内容文档。然后,
Fleet
继续将此捆绑包中的Kubernetes 资源
部署到所有目标下游群集
。在操作系统软件包更新
的上下文中,Fleet 将部署捆绑包中的以下资源:os-pkg-plan-agent
SUC 计划 - 告知 SUC 如何在群集代理节点上执行软件包更新。如果群集仅由控制平面节点组成,则不做解释。os-pkg-plan-control-plane
SUC 计划 - 告知 SUC 如何在群集控制平面节点上执行软件包更新。os-pkg-update
密钥 - 在每个 SUC 计划中引用;附带一个update.sh
脚本,该脚本负责创建执行实际软件包更新的edge-update.service
sustemd.service。注意上述资源将部署在每个下游群集的
cattle-system
名称空间中。
在下游群集上,SUC 将拾取新部署的 SUC 计划,并在与 SUC 计划中定义的节点选择器匹配的每个节点上部署更新 Pod。有关如何监控 SUC 计划 Pod 的信息,请参见第 25.2.2.2 节 “监控 SUC 计划”。
更新 Pod(部署在每个节点上)挂载
os-pkg-update
密钥并执行密钥附带的update.sh
脚本。update.sh
继续执行以下操作:创建
edge-update.service
- 创建的服务属于 oneshot 类型,采用以下工作流程:通过执行以下命令更新节点操作系统上的所有软件包版本:
transactional-update cleanup dup
成功执行
transactional-update
后,将安排系统重引导,使软件包版本更新生效注意成功执行
transactional-update
后,将安排系统重引导并等待 1 分钟。
启动
edge-update.service
并等待启动完成清理
edge-update.service
- 在 systemd.service 完成其工作后,会将其从系统中去除,以确保将来不会发生意外的执行/重引导。
系统重引导后,操作系统软件包更新过程即告完成。重引导后,所有操作系统软件包版本应会更新到可用操作系统 RPM 储存库中显示的相应最新版本。
25.3.4 操作系统软件包更新 - SUC 计划部署 #
本节介绍如何使用 Fleet 的 GitRepo 和捆绑包资源来编排 SUC 计划相关的操作系统软件包更新的部署。
25.3.4.1 SUC 计划部署 - GitRepo 资源 #
可通过以下方式之一部署 GitRepo
资源,该资源中附带了所需的操作系统软件包更新
SUC
计划:
通过
Rancher UI
部署 - 第 25.3.4.1.1 节 “GitRepo 创建 - Rancher UI”(如果Rancher
可用)。手动将相应资源部署(第 25.3.4.1.2 节 “GitRepo 创建 - 手动”)到
管理群集
。
部署后,要监控目标群集节点的操作系统软件包更新过程,请参见第 25.2.2.2 节 “监控 SUC 计划”文档。
25.3.4.1.1 GitRepo 创建 - Rancher UI #
在左上角,选择 ☰ → Continuous Delivery(持续交付)
转到 Git 储存库 → 添加储存库
如果使用 suse-edge/fleet-examples
储存库,请执行以下步骤:
监视 → 修订版 - 为要使用的
suse-edge/fleet-examples
储存库选择版本标记在路径下,添加您要使用的操作系统软件包更新 Fleet 的路径 -
fleets/day2/system-upgrade-controller-plans/os-pkg-update
选择下一步转到目标配置部分。请仅选择您要升级其节点软件包的群集
创建
或者,如果您决定使用自己的储存库来托管这些文件,则需要提供上述储存库数据。
25.3.4.1.2 GitRepo 创建 - 手动 #
选择您要从中应用操作系统 SUC 更新计划的所需 Edge 版本标记(在下文中用
${REVISION}
表示)。提取 GitRepo 资源:
curl -o os-pkg-update-gitrepo.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/${REVISION}/gitrepos/day2/os-pkg-update-gitrepo.yaml
编辑 GitRepo 配置,在
spec.targets
下指定所需的目标列表。默认情况下,suse-edge/fleet-examples
中的GitRepo
资源不会映射到任何下游群集。为了匹配所有群集,请将默认的
GitRepo
目标更改为:spec: targets: - clusterSelector: {}
或者,如果您要更细致地选择群集,请参见映射到下游群集
将 GitRepo 资源应用于
管理群集
:kubectl apply -f os-pkg-update-gitrepo.yaml
查看
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 计划:
通过
Rancher UI
部署 - 第 25.3.4.2.1 节 “捆绑包创建 - Rancher UI”(如果Rancher
可用)。手动将相应资源部署(第 25.3.4.2.2 节 “捆绑包创建 - 手动”)到
管理群集
。
部署后,要监控目标群集节点的操作系统软件包更新过程,请参见第 25.2.2.2 节 “监控 SUC 计划”文档。
25.3.4.2.1 捆绑包创建 - Rancher UI #
在左上角,单击 ☰ → Continuous Delivery(持续交付)
转到高级 > 捆绑包
选择从 YAML 创建
此处可通过以下方式之一创建捆绑包:
通过手动将捆绑包内容复制到从 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 版本通过将 suse-edge/fleet-examples 储存库克隆到所需的版本标记中,并在从 YAML 创建页面中选择从文件读取选项。然后导航到
bundles/day2/system-upgrade-controller-plans/os-pkg-update
目录并选择pkg-update-bundle.yaml
。这会在从 YAML 创建页面中自动填充捆绑包内容。
更改
捆绑包
的目标群集:为了匹配所有下游群集,请将默认的捆绑包
.spec.targets
更改为:spec: targets: - clusterSelector: {}
有关更精细的下游群集映射,请参见映射到下游群集。
选择创建
25.3.4.2.2 捆绑包创建 - 手动 #
选择您要从中应用操作系统软件包更新 SUC 计划的所需 Edge 版本标记(在下文中用
${REVISION}
表示)。提取捆绑包资源:
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
编辑
捆绑包
目标配置,在spec.targets
下提供所需的目标列表。默认情况下,suse-edge/fleet-examples
中的捆绑包
资源不会映射到任何下游群集。为了匹配所有群集,请将默认的
捆绑包
目标更改为:spec: targets: - clusterSelector: {}
或者,如果您要更细致地选择群集,请参见映射到下游群集
将捆绑包资源应用于
管理群集
:kubectl apply -f pkg-update-bundle.yaml
查看
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 要求 #
备份您的 Kubernetes 发行版:
对于导入的 RKE2 群集,请参见 RKE2 备份和恢复文档。
对于导入的 K3s 群集,请参见 K3s 备份和恢复文档。
确保 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 升级
计划通过以下方式交付:
通过
GitRepo
资源 - 第 25.4.4.1 节 “SUC 计划部署 - GitRepo 资源”通过
捆绑包
资源 - 第 25.4.4.2 节 “SUC 计划部署 - 捆绑包资源”
要确定使用哪个资源,请参见第 25.1.2 节 “确定您的用例”。
有关更新过程中会发生哪些情况的完整概述,请参见第 25.4.3.1 节 “概述”一节。
25.4.3.1 概述 #
本节旨在介绍 Kubernetes 版本升级过程从头到尾的完整工作流程。
Kubernetes 版本升级步骤:
用户可以根据用例,确定是要使用 GitRepo 还是捆绑包资源将
Kubernetes 升级 SUC 计划
部署到所需的下游群集。有关如何将 GitRepo/捆绑包映射到特定的一组下游群集的信息,请参见映射到下游群集。如果您不确定是要使用 GitRepo 还是捆绑包资源进行 SUC 计划部署,请参见第 25.1.2 节 “确定您的用例”。
有关 GitRepo/捆绑包配置选项,请参见第 25.4.4.1 节 “SUC 计划部署 - GitRepo 资源”或第 25.4.4.2 节 “SUC 计划部署 - 捆绑包资源”。
用户将配置的 GitRepo/捆绑包资源部署到其
管理群集
中的fleet-default
名称空间。此操作可以手动完成,也可以通过 Rancher UI(如果可用)完成。Fleet(第 6 章 “Fleet”)持续监控
fleet-default
名称空间,并立即检测新部署的 GitRepo/捆绑包资源。有关 Fleet 监控哪些名称空间的详细信息,请参见 Fleet 的名称空间文档。如果用户已部署 GitRepo 资源,
Fleet
将协调 GitRepo,并根据其路径和 fleet.yaml 配置,在fleet-default
名称空间中部署捆绑包资源。有关详细信息,请参见 Fleet 的 GitRepo 内容文档。然后,
Fleet
继续将此捆绑包中的Kubernetes 资源
部署到所有目标下游群集
。在Kubernetes 版本升级
的上下文中,Fleet 将部署捆绑包中的以下资源(具体取决于 Kubernetes 发行版):rke2-plan-agent
/k3s-plan-agent
- 告知 SUC 如何在群集代理节点上执行 Kubernetes 升级。如果群集仅由控制平面节点组成,则不做解释。rke2-plan-control-plane
/k3s-plan-control-plane
- 告知 SUC 如何在群集控制平面节点上执行 Kubernetes 升级。注意上述 SUC 计划将部署在每个下游群集的
cattle-system
名称空间中。
在下游群集上,SUC 将拾取新部署的 SUC 计划,并在与 SUC 计划中定义的节点选择器匹配的每个节点上部署更新 Pod。有关如何监控 SUC 计划 Pod 的信息,请参见第 25.2.2.2 节 “监控 SUC 计划”。
根据您部署的 SUC 计划,更新 Pod 将运行 rke2-upgrade 或 k3s-upgrade 映像,并在每个群集节点上执行以下工作流程:
封锁群集节点 - 为了确保在升级此节点时不会意外调度任何 Pod,我们将此节点标记为
不可调度
。将节点操作系统上安装的
rke2/k3s
二进制文件替换为 Pod 当前正在运行的rke2-upgrade/k3s-upgrade
映像附带的二进制文件。终止节点操作系统上正在运行的
rke2/k3s
进程 - 这会指示监督程序使用新版本自动重启动rke2/k3s
进程。解封群集节点 - 成功完成 Kubernetes 发行版升级后,将节点重新标记为
可调度
。注意有关
rke2-upgrade
和k3s-upgrade
映像工作原理的更多信息,请参见 rke2-upgrade 和 k3s-upgrade 上游项目。
执行上述步骤后,每个群集节点的 Kubernetes 版本应会升级到所需的 Edge 兼容版本。
25.4.4 Kubernetes 版本升级 - SUC 计划部署 #
25.4.4.1 SUC 计划部署 - GitRepo 资源 #
可通过以下方式之一部署 GitRepo 资源,该资源中附带了所需的
Kubernetes 升级
SUC 计划:
通过
Rancher UI
部署 - 第 25.4.4.1.1 节 “GitRepo 创建 - Rancher UI”(如果Rancher
可用)。手动将相应资源部署(第 25.4.4.1.2 节 “GitRepo 创建 - 手动”)到
管理群集
。
部署后,要监控目标群集节点的 Kubernetes 升级过程,请参见第 25.2.2.2 节 “监控 SUC 计划”文档。
25.4.4.1.1 GitRepo 创建 - Rancher UI #
在左上角,选择 ☰ → Continuous Delivery(持续交付)
转到 Git 储存库 → 添加储存库
如果使用 suse-edge/fleet-examples
储存库,请执行以下步骤:
监视 → 修订版 - 为要使用的
suse-edge/fleet-examples
储存库选择版本标记在路径下,添加版本标记中显示的 Kubernetes 发行版升级 Fleet 路径:
对于 RKE2 -
fleets/day2/system-upgrade-controller-plans/rke2-upgrade
对于 K3s -
fleets/day2/system-upgrade-controller-plans/k3s-upgrade
选择下一步转到目标配置部分。请仅选择您要升级其中的所需 Kubernetes 发行版的群集
创建
或者,如果您决定使用自己的储存库来托管这些文件,则需要提供上述储存库数据。
25.4.4.1.2 GitRepo 创建 - 手动 #
选择您要从中应用 Kubernetes SUC 升级计划的所需 Edge 版本标记(在下文中用
${REVISION}
表示)。提取 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
编辑 GitRepo 配置,在
spec.targets
下指定所需的目标列表。默认情况下,suse-edge/fleet-examples
中的GitRepo
资源不会映射到任何下游群集。为了匹配所有群集,请将默认的
GitRepo
目标更改为:spec: targets: - clusterSelector: {}
或者,如果您要更细致地选择群集,请参见映射到下游群集
将 GitRepo 资源应用于
管理群集
:# RKE2 kubectl apply -f rke2-upgrade-gitrepo.yaml # K3s kubectl apply -f k3s-upgrade-gitrepo.yaml
查看
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 计划:
通过
Rancher UI
部署 - 第 25.4.4.2.1 节 “捆绑包创建 - Rancher UI”(如果Rancher
可用)。手动将相应资源部署(第 25.4.4.2.2 节 “捆绑包创建 - 手动”)到
管理群集
。
部署后,要监控目标群集节点的 Kubernetes 升级过程,请参见第 25.2.2.2 节 “监控 SUC 计划”文档。
25.4.4.2.1 捆绑包创建 - Rancher UI #
在左上角,单击 ☰ → Continuous Delivery(持续交付)
转到高级 > 捆绑包
选择从 YAML 创建
此处可通过以下方式之一创建捆绑包:
通过手动将捆绑包内容复制到从 YAML 创建页面。可以检索内容:
通过将 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 创建页面中自动填充捆绑包内容
更改
捆绑包
的目标群集:为了匹配所有下游群集,请将默认的捆绑包
.spec.targets
更改为:spec: targets: - clusterSelector: {}
有关更精细的下游群集映射,请参见映射到下游群集。
创建
25.4.4.2.2 捆绑包创建 - 手动 #
选择您要从中应用 Kubernetes SUC 升级计划的所需 Edge 版本标记(在下文中用
${REVISION}
表示)。提取捆绑包资源:
对于 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
编辑
捆绑包
目标配置,在spec.targets
下提供所需的目标列表。默认情况下,suse-edge/fleet-examples
中的捆绑包
资源不会映射到任何下游群集。为了匹配所有群集,请将默认的
捆绑包
目标更改为:spec: targets: - clusterSelector: {}
或者,如果您要更细致地选择群集,请参见映射到下游群集
将捆绑包资源应用于
管理群集
:# For RKE2 kubectl apply -f rke2-plan-bundle.yaml # For K3s kubectl apply -f k3s-plan-bundle.yaml
查看
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 发行版本的所需资产 #
转到 Day 2 版本页面,找到您要将 chart 升级到的 Edge 3.X.Y 版本,然后单击资产。
从该版本的资产部分下载以下文件,对 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 版本映像存档 #
在可以访问互联网的计算机上:
将
edge-save-images.sh
设为可执行文件:chmod +x edge-save-images.sh
使用
edge-save-images.sh
脚本创建 Docker 可导入的“.tar.gz”存档:./edge-save-images.sh --source-registry registry.suse.com
这会创建一个随时可加载的
edge-images.tar.gz
(除非指定了-i|--images
选项)存档,其中包含所需的映像。将此存档复制到隔离的计算机
scp edge-images.tar.gz <user>@<machine_ip>:/path
25.5.2.4 创建 SUSE Edge Helm chart OCI 映像存档 #
在可以访问互联网的计算机上:
将
edge-save-oci-artefacts.sh
设为可执行文件:chmod +x edge-save-oci-artefacts.sh
使用
edge-save-oci-artefacts.sh
脚本创建包含所有 SUSE Edge Helm chart OCI 映像的“.tar.gz”存档:./edge-save-oci-artefacts.sh --source-registry registry.suse.com
这会创建一个包含所有 SUSE Edge Helm chart OCI 映像的
oci-artefacts.tar.gz
存档将此存档复制到隔离的计算机
scp oci-artefacts.tar.gz <user>@<machine_ip>:/path
25.5.2.5 将 SUSE Edge 版本映像加载到隔离的计算机上 #
在隔离的计算机上:
登录到专用注册表(如果需要):
podman login <REGISTRY.YOURDOMAIN.COM:PORT>
将
edge-load-images.sh
设为可执行文件:chmod +x edge-load-images.sh
使用
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 映像加载到隔离的计算机上 #
在隔离的计算机上:
登录到专用注册表(如果需要):
podman login <REGISTRY.YOURDOMAIN.COM:PORT>
将
edge-load-oci-artefacts.sh
设为可执行文件:chmod +x edge-load-oci-artefacts.sh
解压缩复制的
oci-artefacts.tar.gz
存档:tar -xvf oci-artefacts.tar.gz
这会使用命名模板
edge-release-oci-tgz-<date>
生成一个目录将此目录传递给
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 升级过程:
我有一个新群集,想要部署和管理 SUSE Helm chart(第 25.5.3.1 节 “我有一个新群集,想要部署和管理 SUSE Helm chart”)
我想升级 Fleet 管理的 Helm chart(第 25.5.3.2 节 “我想升级 Fleet 管理的 Helm chart”)
我想升级 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 资源 #
从您要使用的 Edge 版本标记中获取 Chart 的 Fleet 资源
从选定的 Edge 版本标记修订版导航到 Helm chart Fleet 目录 -
fleets/day2/chart-templates/<chart>
将该 chart Fleet 目录复制到用于 GitOps 工作流程的 Git 储存库
(可选)如果 Helm chart 需要对其值进行配置,请编辑复制的目录中
fleet.yaml
文件内的.helm.values
配置(可选)在某些用例中,您可能需要向 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 #
确定需要将 chart 升级到哪个版本,以便它与 Edge 3.X.Y 版本兼容。可以在第 33.1 节 “摘要”中查看每个 Edge 版本的 Helm chart 版本。
在 Fleet 监控的 Git 储存库中,根据第 33.1 节 “摘要”中所述使用正确的 chart 版本和储存库编辑 Helm chart 的
fleet.yaml
文件。提交更改并将其推送到储存库后,会触发所需 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 计划。
有关信息,请参见以下资源:
Helm chart 升级工作流程的一般概述(第 25.5.3.3.1 节 “概述”)。
成功完成 Helm chart 升级所要执行的升级步骤(第 25.5.3.3.2 节 “升级步骤”)。
展示使用所述方法进行 Longhorn chart 升级的示例(第 25.5.3.3.3 节 “示例”)。
如何使用其他 GitOps 工具完成升级过程(第 25.5.3.3.4 节 “使用第三方 GitOps 工具进行 Helm chart 升级”)。
25.5.3.3.1 概述 #
本节旨在概述用户升级一个或多个 Helm chart 所要执行的工作流程。有关完成 Helm chart 升级所要执行的步骤的详细说明,请参见第 25.5.3.3.2 节 “升级步骤”。
该工作流程的第一个步骤是用户提取其 chart 要升级到的新 Helm chart 存档。
然后对存档进行编码,并将其作为配置传递到位于相关 SUC 计划的 Fleet 目录下的
eib-chart-upgrade-user-data.yaml
文件中。“升级步骤”(第 25.5.3.3.2 节 “升级步骤”)一节会进一步解释此过程。然后,用户继续配置并部署
GitRepo
资源,用于将全部所需的资源(SUC 计划、密钥等)传送到下游群集。该资源部署在
管理群集
上的fleet-default
名称空间下。
Fleet(第 6 章 “Fleet”)检测部署的资源,并将配置的所有资源部署到指定的下游群集。部署的资源包括:
eib-chart-upgrade
SUC 计划,SUC 将使用它在每个节点上创建升级 Pod。eib-chart-upgrade-script
密钥,其中附带升级脚本
,升级 Pod 将使用该脚本来升级初始化器节点上的HelmChart
清单。eib-chart-upgrade-user-data
密钥,其中附带 chart 数据,升级脚本
将使用这些数据来了解需要升级哪些 chart 清单。
部署
eib-chart-upgrade
SUC 计划后,SUC 将拾取该计划并创建一个用于部署升级 Pod 的作业。部署后,升级 Pod 将挂载
eib-chart-upgrade-script
和eib-chart-upgrade-user-data
密钥,并执行eib-chart-upgrade-script
密钥附带的升级脚本
。升级脚本
执行以下操作:确定运行脚本的 Pod 是否已部署在
初始化器
节点上。初始化器
节点是托管HelmChart
清单的节点。对于单节点群集,它是单个控制平面节点。对于 HA 群集,它是您在 EIB 中创建群集时标记为初始化器
的节点。如果您未指定initializer
属性,则节点
列表中的第一个节点将标记为初始化器
。有关详细信息,请参见 EIB 的上游文档。注意如果
升级脚本
在非初始化器节点上运行,则它会立即完成执行,而不会执行下面的步骤。备份要编辑的清单,以确保能够实现灾难恢复。
注意默认情况下,清单的备份存储在
/tmp/eib-helm-chart-upgrade-<date>
目录下。如果您要使用自定义位置,可以将MANIFEST_BACKUP_DIR
环境变量传递给 Helm chart 升级 SUC 计划(计划中的示例)。编辑
HelmChart
清单。从此版本开始,已更改以下属性以触发 chart 升级:chartContent
属性的内容已替换为eib-chart-upgrade-user-data
密钥中提供的经过编码的存档。version
属性的值已替换为eib-chart-upgrade-user-data
密钥中提供的版本。
25.5.3.3.2 升级步骤 #
确定您要从中复制 Helm chart 升级逻辑的 Edge 版本标记。
将
fleets/day2/system-upgrade-controller-plans/eib-chart-upgrade
Fleet 目录复制到将由 Fleet 用来执行 GitOps 的储存库。提取您要升级到的 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
对提取的 chart 存档进行编码:
# Encode the archive and disable line wrapping base64 -w 0 <chart-archive>.tgz
配置您在步骤 2 中复制的
eib-chart-upgrade
Fleet 目录下的eib-chart-upgrade-user-data.yaml
密钥:该密钥附带一个名为
chart_upgrade_data.txt
的文件。此文件包含 chart 升级数据,升级脚本
将使用这些数据来了解哪些 chart 需要升级。该文件要求以每个 chart 项一行的形式指定配置项,其格式如下:“<name>|<version>|<base64_encoded_archive>”:name
- Helm chart 的名称,如 EIB 定义文件的kubernetes.helm.charts.name[]
属性中所示。version
- 应包含 Helm chart 的新版本。在升级期间,此值用于替换HelmChart
清单的旧version
值。base64_encoded_archive
- 在此处传递base64 -w 0 <chart-archive>.tgz
的输出。在升级期间,此值用于替换HelmChart
清单的旧chartContent
值。注意在开始添加数据之前,应从该文件中去除 <name>|<version>|<base64_encoded_archive> 行。它是一个示例行,用于说明在何处以及如何配置 chart 数据。
配置一个
GitRepo
资源用于传送 chart 升级fleet
。有关GitRepo
的详细信息,请参见 GitRepo 资源。通过 Rancher UI 配置
GitRepo
:在左上角,选择 ☰ → Continuous Delivery(持续交付)
转到 Git 储存库 → 添加储存库
在此处将您的储存库数据和路径传递给 chart
升级 fleet
选择下一步,并指定您要对其中已配置的 chart 进行升级的目标群集
创建
如果无法对您的设置使用
Rancher
,可以在管理群集
上手动配置GitRepo
:在以下模板中填充您的数据:
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 资源。有关如何在更精细的级别匹配目标群集的信息,请参见映射到下游群集。
将配置的
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
...
这种部署的问题在于,longhorn-single-k3s
和
longhorn-ha-rke2
当前运行的 Longhorn 版本与任何 Edge 版本都不兼容。
我们需要将这两个群集上的 chart 升级到 Edge 支持的 Longhorn 版本。
为此,我们需要执行以下步骤:
确定我们要从中获取升级逻辑的 Edge 版本标记。例如,此示例将使用
release-3.0.1
版本标记,它支持的 Longhorn 版本为1.6.1
。克隆
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 ...
添加 Longhorn chart 储存库:
helm repo add longhorn https://charts.longhorn.io
提取 Longhorn chart 版本
1.6.1
:helm pull longhorn/longhorn --version 1.6.1
这会将 Longhorn 作为名为
longhorn-1.6.1.tgz
的存档来提取。对 Longhorn 存档进行编码:
base64 -w 0 longhorn-1.6.1.tgz
这会输出该存档的采用 base64 编码的单行字符串。
现在我们已准备好全部所需的数据,可以配置
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...
longhorn
是 EIB 定义文件中所示的 chart 名称1.6.1
是要将 LonghornHelmChart
清单的version
属性升级到的版本H4sIFAAAAAAA/ykAK2FIUjBjSE02THk5NWIzV...
是经过编码的 Longhorn1.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> ...
我们还确定不要在
/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
中。完成全部所需的配置后,剩下的操作就是创建
GitRepo
资源。此示例通过Rancher UI
创建GitRepo
资源。根据“升级步骤”(第 25.5.3.3.2 节 “升级步骤”)中所述的步骤,我们已经:
将
GitRepo
命名为“longhorn-upgrade”。将 URL 传递给要使用的储存库 - https://github.com/suse-edge/fleet-examples.git
传递储存库的分支 -“doc-example”
传递储存库中显示的
eib-chart-upgrade
Fleet 目录路径 -fleets/day2/system-upgrade-controller-plans/eib-chart-upgrade
选择目标群集并创建资源
图 25.9︰ 成功部署 SUC 和 Longhorn GitRepo #
现在我们需要监控群集上的升级过程:
按照“监控 SUC 计划”(第 25.2.2.2 节 “监控 SUC 计划”)一节中的指导,检查升级 Pod 的状态。
升级 Pod 成功完成后,我们还需要等待 Helm 控制器创建 Pod 并监控这些 Pod。这些 Pod 将根据升级 Pod 对
HelmChart
清单文件所做的文件更改执行实际升级。
确保一切成功完成后,我们需要校验版本是否已更改:
此结果确认 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 节 “概述”)。