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