在 Huawei DCS 上管理节点
本文档说明如何使用 Cluster API Machine 资源管理 Worker 节点。
目录
前提条件概述部署 Worker 节点步骤 1:配置 IP-Hostname 池步骤 2:配置 Machine 模板由 IP 池管理的持久磁盘由 IP 池管理的额外 NIC步骤 3:配置 Bootstrap 模板步骤 4:配置 MachineDeployment节点管理操作扩缩容 Worker 节点添加 Worker 节点移除 Worker 节点升级 Machine 基础设施更新 Bootstrap 模板升级 Kubernetes 版本使用 Web UI 管理节点池查看节点池添加 Worker 节点池删除 Worker 节点池查看 Conditions(仅控制平面)故障排查新的 WorkerMachine 停留在 Provisioning 状态,且 DCS 虚拟机停留在 creating 状态后续步骤前提条件
重要前提条件
- 必须先部署控制平面,然后才能执行节点操作。有关设置说明,请参见 创建集群。
- 确保你拥有对 DCS 平台的适当访问权限以及所需权限。
配置指南 在使用本文档中的配置时:
- 仅修改
<>括号中的值 - 将占位符值替换为你的环境特定设置
- 除非明确要求,否则请保留所有其他默认配置
概述
Worker 节点通过 Cluster API Machine 资源进行管理,从而提供声明式、自动化的节点生命周期管理。部署过程包括:
- IP-Hostname 池配置 - Worker 节点的网络设置
- Machine 模板设置 - 虚拟机规格
- Bootstrap 配置 - 节点初始化和加入设置
- Machine Deployment - 节点创建和管理的编排
部署 Worker 节点
步骤 1:配置 IP-Hostname 池
IP-Hostname 池定义 Worker 节点虚拟机的网络配置。在部署之前,必须规划并配置 IP 地址、主机名、DNS 服务器、额外 NIC 以及其他网络参数。
在 Huawei DCS 上,IP 池也是声明必须在虚拟机替换后保留的持久磁盘的位置。对平台所需的 /var/cpaas 磁盘,以及在删除-重建操作期间必须保留的任何其他 Worker 节点磁盘,请使用 persistentDisk。此工作流需要 DCS provider v1.0.16 或更高版本。
当节点模板在 /var/lib/containerd 声明专用数据磁盘时,DCS provider 的 bootstrap 配置会将 Pod 日志存储在 /var/lib/containerd/pods 下,并将 /var/log/pods 链接到该路径。如果需要将 Pod 日志数据保留在 containerd 数据磁盘上,请在替换节点时保持该磁盘挂载在 /var/lib/containerd。
池大小要求 池中的条目数量必须至少等于计划部署的 Worker 节点数量。条目不足将导致无法部署节点。
示例:
创建一个名为 <cluster-name>-worker-pool 的 DCSIpHostnamePool:
关键参数:
*标记为 是* 的字段是 provider 解析目标网络并附加额外 NIC 所必需的。标记为 建议* 的字段是生成静态客户机网络配置所需要的。CRD 不会强制要求这些字段。
步骤 2:配置 Machine 模板
DCSMachineTemplate 定义 Worker 节点虚拟机的规格,包括虚拟机模板、计算资源、存储配置和网络设置。
此资源中的字段引用多个 Huawei DCS 平台概念(DCS VM Template、DCS VM Folder、DCS Datastore 及相关项)。有关这些概念的定义及其与 Cluster API 资源的映射关系,请参见 Huawei DCS 概念与术语。
必需的磁盘配置 以下磁盘挂载点为必需项。请勿删除:
- 系统卷(
systemVolume: true) /var/lib/kubelet- Kubelet 数据目录/var/lib/containerd- 容器运行时数据
请在 IP 池中将 /var/cpaas 配置为持久磁盘,而不是在 DCSMachineTemplate 中配置。
你可以添加额外的模板磁盘,但必须保留这些必要的模板磁盘。
示例:
创建一个名为 <cluster-name>-worker-template 的 DCSMachineTemplate:
关键参数:
*在指定父对象时为必填
由 IP 池管理的持久磁盘
在匹配的 DCSIpHostnamePool.spec.pool[].persistentDisk 条目中声明任何升级时需保留的磁盘(DCS provider v1.0.16 或更高版本)。
- 将此用于平台所需的
/var/cpaas。 - 系统磁盘以及可能随虚拟机一起重建的模板本地磁盘仍使用
DCSMachineTemplate。 - 为每个 IP 条目选择唯一的
slot。控制器使用(ip, slot)作为持久磁盘的标识。 - 在替换节点上,客户机磁盘设置逻辑会检查是否已存在文件系统。如果磁盘已经格式化,则跳过
mkfs并直接挂载磁盘。 - 持久磁盘工作流需要逐个替换,因此请保持
MachineDeployment.spec.strategy.rollingUpdate.maxSurge = 0。 - 你可以追加新的
persistentDisk条目,但不支持删除现有条目。控制器会在 DCS 侧将新添加的磁盘附加到正在运行的虚拟机,但不会在客户机操作系统内格式化或挂载该磁盘。客户机的格式化和挂载仅在虚拟机被替换且替换后的虚拟机在 bootstrap 期间运行生成的磁盘设置后才会生效。 - 控制器将新的持久卷创建为独立的持久普通卷。当复用现有卷时,仅要求该卷为独立且持久的卷;不要求特定的 DCS 卷类型。
- 将
format、options和pciType视为创建后不可变。 - 仅当 DCS 环境要求为新创建的持久卷显式指定精简配置(thin-provisioning)值时,才使用
isThin。如果省略,provider 不会发送isThin,DCS 将使用平台默认值。 - 将
quantityGB和 datastore 的变更视为会触发滚动更新的敏感变更。当 webhook 具有足够的集群上下文时,会尽力对 DCS 平台执行校验。isThin仅在创建时生效:更改该值不会校验、协调或转换现有卷,仅影响之后创建的持久卷。
要在节点操作期间检查持久磁盘的运行时状态,请查看池上的 status.persistentDiskStatus:
由 IP 池管理的额外 NIC
在 DCSIpHostnamePool.spec.pool[].additionNic[] 中声明 Worker 的额外 NIC。
- provider 仅在创建新虚拟机时应用
additionNic[]。 - 编辑池时,不会对现有 Worker 虚拟机进行热更新。
- 新的 Worker Machine 使用其所占用的池槽位中的
additionNic[]值。 - 每个额外 NIC 都应同时包含
dvSwitchName和portGroupName,以便 provider 在克隆虚拟机之前解析目标 DCS Port Group。 - 如果同时使用
persistentDisk[],请保持MachineDeployment.spec.strategy.rollingUpdate.maxSurge = 0,以便固定 IP 槽位和保留的磁盘一次只迁移一个节点。 - 如果额外 NIC 配置了网关,请确认客户机操作系统的路由表仍然优先使用预期的主网络作为默认路由。
要检查额外 NIC 的运行时状态,请查看 DCSMachine.status.additionalNic:
步骤 3:配置 Bootstrap 模板
KubeadmConfigTemplate 定义 Worker 节点的 bootstrap 配置,包括用户账户、SSH 密钥、系统文件和 kubeadm join 设置。
imagePullCredentialsVerificationPolicy: NeverVerify 仅从 Kubernetes 1.35 开始才需要。在使用 Kubernetes 1.34 或更早版本创建 Worker 时,请省略此参数。如果 contentFrom.secret 提供补丁,请确认所引用的 worker-kubelet-patch.json 在 Kubernetes 1.35 中包含此参数。
模板优化 该模板包含针对安全性和性能预先优化的配置。仅修改需要针对你的环境进行自定义的参数。
示例:
PROVIDER_ID 和 NODE_IP 是 DCS Provider 在机器加入时替换的字面魔法令牌 — 请保持其原样书写。完整列表请参见 魔法令牌占位符。
备选方案:引用集中管理的 Secret 作为 Worker kubelet 补丁
DCS Provider 插件会在 cpaas-system 命名空间中提供名为 dcs-kubernetes-<kubernetes-major-minor>-files 的 Secret(例如,Kubernetes 1.33 对应 dcs-kubernetes-1.33-files)。除了提供给 KubeadmControlPlane 的控制平面文件(参见创建集群附录)外,此 Secret 还包含适用于 Worker KubeadmConfigTemplate 的 worker-kubelet-patch.json 键。当该 Secret 存在时,你可以用 contentFrom.secret 引用替换上面的内联 files 条目 — 这可使 Worker kubelet 补丁与已安装的插件版本保持同步,并避免在集群升级时手动更新。
内联形式和 Secret 引用形式在功能上等效;当目标集群中存在插件 Secret 时,推荐使用 Secret 形式。
最低插件版本:与控制平面附录提示相同 — worker-kubelet-patch.json 是 DCS Provider v1.0.13 起随附的 dcs-kubernetes-1.33-files Secret 的一部分。在较旧的插件版本中该 Secret 不存在;这种情况下请保留内联 content: 形式。
步骤 4:配置 MachineDeployment
MachineDeployment 通过引用先前配置的 DCSMachineTemplate 和 KubeadmConfigTemplate 资源,编排 Worker 节点的创建和管理。它管理所需的节点数量并处理滚动更新。
示例:
关键参数:
节点管理操作
本节介绍管理 Worker 节点的常见运维任务,包括扩缩容、更新、升级和模板修改。
Cluster API 框架 节点管理操作基于 Cluster API 框架。有关详细信息,请参阅 官方 Cluster API 文档。
扩缩容 Worker 节点
Worker 节点扩缩容使你可以根据工作负载需求调整集群容量。Cluster API 通过 MachineDeployment 资源自动管理节点生命周期。
添加 Worker 节点
增加 Worker 节点数量,以应对增加的工作负载或添加新容量。
使用场景:扩容集群以增加计算资源
前提条件:
- 确认 IP 池有足够的可用 IP 地址供新节点使用
- 确保 DCS 平台有足够的资源来置备新的虚拟机
操作步骤:
-
检查当前节点状态
查看集群中的当前 Machine:
-
扩展 IP 池
在扩容之前,向池中添加新节点所需的 IP 配置。
INFOIP 池扩展 IP 池必须至少包含与期望副本数相同数量的条目。为计划部署的每个额外 Worker 节点添加新的 IP 条目。
向池中添加 IP 条目:
首先,导出当前池配置以保留现有条目:
然后使用以下命令添加新的 IP 配置。
pool数组必须包含所有现有条目以及新条目:WARNING重要说明
pool数组必须包含所有现有条目以及要添加的新条目- 从导出的 YAML 中复制现有条目,以避免数据丢失
kubectl patch --type='merge'会替换整个spec.pool数组,因此请原样复制每个现有的persistentDisk块,包括其中的isThin(如果存在),除非你有意添加新磁盘- 确保每个新条目具有唯一的
ip、hostname和machineName值 - 如果新 Worker 节点也需要平台所需的
/var/cpaas磁盘,请在每个新条目的persistentDisk中声明它 - 网络参数(
mask、gateway、dns)通常与现有条目相同
示例:向现有的 3 节点池中添加 2 个新节点
-
验证 IP 池容量
扩展 IP 池后,确认其条目数量足以满足期望的副本数:
检查池中包含的条目数量至少等于期望的副本数。
-
扩容 MachineDeployment
将
replicas字段更新为所需的节点数量:示例:从 3 个节点扩容到 5 个节点
-
监控扩容进度
观察 Machine 的创建过程:
Cluster API 控制器将根据 MachineDeployment 模板自动创建新的 Machine。
-
验证节点已加入集群
切换到目标集群上下文并验证新节点:
新节点应出现在列表中并转换为
Ready状态。
滚动更新行为 扩容时,新节点会立即创建,不影响现有节点。这可确保零停机扩容。
移除 Worker 节点
减少 Worker 节点数量,以降低集群容量或移除未充分利用的资源。Cluster API 支持两种移除策略:
- 随机移除:减少副本数,平台随机选择并删除 Machine
- 定向移除:将特定 Machine 标记为删除,然后减少副本数(推荐用于 IP 回收)
IP 回收场景 当你需要回收特定 Machine 的 IP(例如用于重新分配或 IP 池管理)时,请使用定向移除方法。删除注解可确保平台删除被标记的 Machine,而不是随机的 Machine。
数据丢失警告 缩容会移除节点及其关联的虚拟机。请确保:
- 工作负载能够通过适当的副本机制容忍节点丢失
- 没有仅存储在被移除节点上的关键数据
- 应用设计为可水平扩展
DCSIpHostnamePool.spec.pool[].persistentDisk 中声明的持久磁盘不会仅仅因为 Machine 被替换而被删除。只要相应的 IP 槽位仍保留在池中,它们就可以被复用。从池中移除 IP 槽位、删除池或删除集群可能会触发持久卷清理。
随机移除
使用场景:缩容集群且可以移除任意节点(无特定 IP 要求)
操作步骤:
-
确认当前 Machine 状态
查看 MachineDeployment 中的当前 Machine:
-
缩容 MachineDeployment
更新
replicas字段以减少节点数量:示例:从 5 个节点缩容到 3 个节点
Cluster API 控制器将随机选择并删除 Machine,以匹配期望的副本数。
-
监控移除进度
观察 Machine 的删除过程:
Cluster API 控制器将会:
- 驱逐所选节点(尽可能驱逐 Pod)
- 从 DCS 平台删除底层虚拟机
- 移除 Machine 资源
-
验证节点已移除
切换到目标集群上下文:
被移除的节点不应再出现在列表中。
定向移除
使用场景:移除特定 Machine(例如用于 IP 回收、替换不健康的节点)
操作步骤:
-
确定要移除的 Machine
查看当前 Machine:
记下要移除的 Machine 的
<machine-name>。 -
为 Machine 添加删除注解
将特定 Machine 标记为删除:
对要移除的每个 Machine 重复此操作。
示例:移除两个特定 Machine
-
缩容 MachineDeployment
为 Machine 添加注解后,减少副本数:
INFO副本数必须与被注解的 Machine 数量匹配 减少的副本数必须恰好等于被注解的 Machine 数量。
- 如果减少的数量不足,则并非所有被注解的 Machine 都会被移除
- 如果减少的数量过多,则还会随机选择其他 Machine 进行删除
示例:如果注解了 2 个 Machine,则恰好将副本数减少 2(例如从 5 减到 3)
平台将删除被注解的 Machine,而不是随机选择的 Machine。
-
监控移除进度
观察 Machine 的删除过程:
-
验证节点已移除
切换到目标集群上下文:
被移除的节点不应再出现在列表中。
升级 Machine 基础设施
要升级 Worker 机器规格(CPU、内存、磁盘、虚拟机模板),请按以下步骤操作:
-
创建新的 Machine 模板
- 复制你的
MachineDeployment所引用的现有DCSMachineTemplate - 修改所需的值(CPU、内存、磁盘、虚拟机模板等)
- 为新模板指定唯一名称
- 将新的
DCSMachineTemplate应用到集群
- 复制你的
-
更新 MachineDeployment
- 修改
MachineDeployment资源 - 将
spec.template.spec.infrastructureRef.name字段更新为引用新模板 - 应用更改
- 修改
-
滚动更新
- 系统将自动触发滚动更新
- Worker 节点将替换为新规格
- 在
DCSIpHostnamePool.spec.pool[].persistentDisk中声明的任何磁盘将从旧虚拟机分离并重新附加到替换虚拟机 - 通过 MachineDeployment 状态监控更新进度
如果要将现有集群从旧的模板磁盘布局迁移到由池管理的持久磁盘,请在依赖升级时的数据保留之前,按照 将现有 Huawei DCS 集群迁移到由池管理的持久磁盘 进行操作。
更新 Bootstrap 模板
Bootstrap 模板(KubeadmConfigTemplate)由 MachineDeployment 和 MachineSet 资源使用。对现有模板的更改不会自动触发现有 Machine 的滚动更新;只有新的 Machine 会使用更新后的模板。
更新流程:
-
导出现有模板
-
修改配置
- 更新导出 YAML 中所需的字段
- 对于 Kubernetes 1.35 或更高版本,将 所需的 kubelet 补丁设置 添加到
/etc/kubernetes/patches/kubeletconfiguration0+strategic.json - 将
metadata.name更改为新的唯一名称 - 移除多余的元数据字段(
resourceVersion、uid、creationTimestamp等)
-
创建新模板
-
更新 MachineDeployment
- 修改 MachineDeployment 资源
- 将
spec.template.spec.bootstrap.configRef.name更新为引用新模板 - 应用更改以触发滚动更新
模板滚动更新行为 现有 Machine 继续使用旧的 bootstrap 配置。只有新创建的 Machine(在扩缩容或滚动更新期间)才会使用更新后的模板。
升级 Kubernetes 版本
有关在 Huawei DCS 上升级 Kubernetes 和 Alauda OS,请参见 在 Huawei DCS 上升级 Kubernetes。该指南涵盖了控制平面和 Worker 替换所需的顺序以及 YAML 工作流。
使用 Web UI 管理节点池
Fleet Essentials 升级边界
Fleet Essentials 1.0.4 及更高版本可以通过 CVO 请求 ACP 4.3 及更高版本的 Distribution Version 升级。它不会执行 DCS Kubernetes 和 Alauda OS 的替换。该第 2 阶段 YAML 操作步骤请使用 在 Huawei DCS 上升级 Kubernetes。通过 Fleet Essentials 添加、删除和查看节点池不受此边界影响。
节点池提供了一种声明式方式来管理具有相同配置的节点组。你可以通过 Web UI 查看、添加和删除 Worker 节点池。
版本要求:此工作流需要 Fleet Essentials 和 Alauda Container Platform DCS Infrastructure Provider 1.0.13 或更高版本。如果 provider 版本早于 1.0.13,请使用本文档中基于 YAML 的节点池工作流。如果节点池工作流依赖由池管理的持久磁盘,请使用 DCS provider v1.0.16 或更高版本。在 v1.0.16 中,DCSIpHostnamePool 上的 persistentDisk 声明仍仅支持 YAML,不会在节点池 UI 中公开。
如果节点池依赖由池管理的持久磁盘,请在使用此处的 Web UI 工作流之前,先用 YAML 准备或更新相应的 DCSIpHostnamePool 条目。
导航:集群 → 集群 → 选择集群 → 节点池选项卡
查看节点池
节点池选项卡显示集群中的所有节点池:
控制平面节点池:
- 固定为 3 个副本,以实现高可用性
- 显示 Kubernetes 版本,若有可用升级则显示升级标识
- 显示 Conditions 链接以查看详细状态
Worker 节点池:
- 可自定义副本数
- 独立的 Kubernetes 版本管理
- 扩缩容和升级操作
节点池卡片信息:
添加 Worker 节点池
导航:节点池选项卡 → 单击 添加 Worker 节点池
表单字段:
校验:
- 池名称在集群内必须唯一
- IP 池必须有足够的可用 IP 地址(≥ 副本数)
- 必须满足 maxSurge/maxUnavailable 约束
- 如果节点池依赖持久磁盘,请保持
maxSurge = 0,以便逐个替换 Machine
提示:使用集群名称后跟连字符作为池名称的前缀(例如 mycluster-worker-1),以避免命名冲突。
创建后,新节点将出现在 节点 选项卡中。节点数量等于配置的副本数值。
删除 Worker 节点池
步骤:
- 单击 Worker 节点池卡片上的删除图标
- 在对话框中确认删除
删除 Worker 节点池将永久移除所有关联的节点和 Machine。请确保工作负载能够通过适当的副本机制容忍这些节点的丢失。
查看 Conditions(仅控制平面)
单击控制平面节点池卡片上的 Conditions 链接以查看详细状态信息。
Conditions 列表:
故障排查
新的 Worker Machine 停留在 Provisioning 状态,且 DCS 虚拟机停留在 creating 状态
控制平面和 Worker Machine 对象的诊断流程相同 — 当 DCSMachine 进入 Provisioning 且 status.cdRomFile 已设置(DCS API 认证和 ISO 上传成功),但底层 DCS 虚拟机从未调度到主机时,故障出在 DCS 平台侧,而非控制器。
完整诊断阶梯请参见 基础设施 → 故障排查:虚拟机卡在 creating 状态,其中涵盖:
- 确认该症状是放置停滞(而非启动缓慢)。
- 检查 datastore 可用空间。
- 检查主机 CPU / 内存利用率以及超售比率。
- 当单个 DCS Host 饱和时,与 DCS 平台团队协调以重新平衡负载。
- 当部署任务确实死锁时的上报路径。
有关控制平面跨多个物理主机的高可用性,请参见 基础设施 → 控制平面跨主机高可用性。
无论卡住的节点是全新集群的第一个控制平面节点、通过 MachineDeployment 扩容添加的新 Worker,还是滚动更新期间创建的替换 Worker,均适用相同的诊断方法。