管理 Huawei DCS 上的节点

本文介绍如何使用 Cluster API Machine 资源管理工作节点。

INFO

如需升级节点的 Kubernetes 版本,请参阅在 Huawei DCS 上升级 Kubernetes。

前提条件

WARNING

重要前提条件

  • 执行节点操作前,必须先部署控制平面。有关设置说明,请参阅创建集群。
  • 确保您拥有 DCS 平台的适当访问权限和所需权限。
  • 要管理 global 集群本身的节点,必须先在 global 上安装 provider;请参阅管理 Alauda OS 集群上的节点。
INFO

配置指南 使用本文档中的配置时:

  • 仅修改 <> 括号内的值
  • 将占位值替换为特定于您环境的设置
  • 除非明确要求,否则保留所有其他默认配置

概述

工作节点通过 Cluster API Machine 资源进行管理,从而以声明式和自动化的方式管理节点生命周期。一个工作节点池由以下四种资源构成:

  1. IP-主机名池配置 - 工作节点的网络设置
  2. Machine 模板设置 - VM 规格
  3. Bootstrap 配置 - 节点初始化和加入设置
  4. MachineDeployment - 节点创建和管理的编排

要使用 YAML 添加另一个工作节点池,请按照集群创建页面中的部署工作节点操作。

节点管理操作

本节介绍管理工作节点时的常见操作任务,包括扩缩容、Machine 基础设施变更以及 Bootstrap 模板更新。

INFO

Cluster API 框架 节点管理操作基于 Cluster API 框架。有关详细信息,请参阅 Cluster API 官方文档。

扩缩工作节点

工作节点扩缩容可根据工作负载需求调整集群容量。Cluster API 通过 MachineDeployment 资源自动管理节点生命周期。

添加工作节点

增加工作节点数量,以处理增加的工作负载或添加新容量。

使用场景:扩展集群以添加更多计算资源

前提条件:

  • 确认 IP 池有足够的可用 IP 地址供新节点使用
  • 确保 DCS 平台有足够的资源来创建新 VM

操作步骤:

  1. 检查当前节点状态

    查看集群中的当前 Machine:

    # List all machines in the cluster
    kubectl get machines -n cpaas-system
    
    # List machines for a specific MachineDeployment
    kubectl get machines -n cpaas-system -l cluster.x-k8s.io/deployment-name=<cluster-name>-md-0
  2. 扩展 IP 池

    扩容前,将新的 IP 配置添加到池中,以供新增节点使用。

    INFO

    IP 池扩展 IP 池中的条目数必须至少等于所需的副本数。为计划部署的每个新增工作节点添加新的 IP 条目。

    向池中添加 IP 条目:

    首先,导出当前池配置以保留现有条目:

    kubectl get dcsiphostnamepool <cluster-name>-worker-pool -n cpaas-system -o yaml

    然后使用以下命令添加新的 IP 配置。pool 数组必须包含所有现有条目以及新条目:

    kubectl patch dcsiphostnamepool <cluster-name>-worker-pool -n cpaas-system \
      --type='merge' -p='
    {
      "spec": {
        "pool": [
          {
            "ip": "<existing-ip-1>",
            "mask": "<worker-cidr-prefix-length>",
            "gateway": "<worker-gateway>",
            "dns": "<worker-dns>",
            "hostname": "<existing-hostname-1>",
            "machineName": "<existing-machine-name-1>",
            "persistentDisk": [
              {
                "slot": 0,
                "quantityGB": 40,
                "datastoreClusterName": "<datastore-cluster-name>",
                "path": "/var/cpaas",
                "format": "xfs"
              }
            ]
          },
          {
            "ip": "<existing-ip-2>",
            "mask": "<worker-cidr-prefix-length>",
            "gateway": "<worker-gateway>",
            "dns": "<worker-dns>",
            "hostname": "<existing-hostname-2>",
            "machineName": "<existing-machine-name-2>",
            "persistentDisk": [
              {
                "slot": 0,
                "quantityGB": 40,
                "datastoreClusterName": "<datastore-cluster-name>",
                "path": "/var/cpaas",
                "format": "xfs"
              }
            ]
          },
          {
            "ip": "<new-worker-ip-1>",
            "mask": "<worker-cidr-prefix-length>",
            "gateway": "<worker-gateway>",
            "dns": "<worker-dns>",
            "hostname": "<new-worker-hostname-1>",
            "machineName": "<new-worker-machine-name-1>",
            "persistentDisk": [
              {
                "slot": 0,
                "quantityGB": 40,
                "datastoreClusterName": "<datastore-cluster-name>",
                "path": "/var/cpaas",
                "format": "xfs"
              }
            ]
          },
          {
            "ip": "<new-worker-ip-2>",
            "mask": "<worker-cidr-prefix-length>",
            "gateway": "<worker-gateway>",
            "dns": "<worker-dns>",
            "hostname": "<new-worker-hostname-2>",
            "machineName": "<new-worker-machine-name-2>",
            "persistentDisk": [
              {
                "slot": 0,
                "quantityGB": 40,
                "datastoreClusterName": "<datastore-cluster-name>",
                "path": "/var/cpaas",
                "format": "xfs"
              }
            ]
          }
        ]
      }'
    WARNING

    重要说明

    • pool 数组必须包含所有现有条目以及要添加的新条目
    • 从导出的 YAML 中复制现有条目,以避免数据丢失
    • kubectl patch --type='merge' 会替换整个 spec.pool 数组,因此请原样复制每个现有的 persistentDisk 块,包括其中存在的 isThin,除非您确实要添加新磁盘
    • 确保每个新条目具有唯一的 ip、hostname 和 machineName 值
    • 如果新工作节点也需要平台要求的 /var/cpaas 磁盘,请在每个新条目的 persistentDisk 中声明该磁盘
    • 网络参数(mask、gateway、dns)通常与现有条目一致

    示例:向包含 3 个节点的现有池中添加 2 个新节点

    # Current pool has 3 entries (10.0.1.11, 10.0.1.12, 10.0.1.13)
    # Adding 2 more entries for nodes 4 and 5
    kubectl patch dcsiphostnamepool worker-pool-1-ippool -n cpaas-system \
      --type='merge' -p='
    {
      "spec": {
        "pool": [
          {
            "ip": "10.0.1.11",
            "mask": "24",
            "gateway": "10.0.1.1",
            "dns": "10.0.0.2",
            "hostname": "worker-node-1",
            "machineName": "worker-vm-1",
            "persistentDisk": [
              {
                "slot": 0,
                "quantityGB": 40,
                "datastoreClusterName": "shared-datastore-cluster",
                "path": "/var/cpaas",
                "format": "xfs"
              }
            ]
          },
          {
            "ip": "10.0.1.12",
            "mask": "24",
            "gateway": "10.0.1.1",
            "dns": "10.0.0.2",
            "hostname": "worker-node-2",
            "machineName": "worker-vm-2",
            "persistentDisk": [
              {
                "slot": 0,
                "quantityGB": 40,
                "datastoreClusterName": "shared-datastore-cluster",
                "path": "/var/cpaas",
                "format": "xfs"
              }
            ]
          },
          {
            "ip": "10.0.1.13",
            "mask": "24",
            "gateway": "10.0.1.1",
            "dns": "10.0.0.2",
            "hostname": "worker-node-3",
            "machineName": "worker-vm-3",
            "persistentDisk": [
              {
                "slot": 0,
                "quantityGB": 40,
                "datastoreClusterName": "shared-datastore-cluster",
                "path": "/var/cpaas",
                "format": "xfs"
              }
            ]
          },
          {
            "ip": "10.0.1.14",
            "mask": "24",
            "gateway": "10.0.1.1",
            "dns": "10.0.0.2",
            "hostname": "worker-node-4",
            "machineName": "worker-vm-4",
            "persistentDisk": [
              {
                "slot": 0,
                "quantityGB": 40,
                "datastoreClusterName": "shared-datastore-cluster",
                "path": "/var/cpaas",
                "format": "xfs"
              }
            ]
          },
          {
            "ip": "10.0.1.15",
            "mask": "24",
            "gateway": "10.0.1.1",
            "dns": "10.0.0.2",
            "hostname": "worker-node-5",
            "machineName": "worker-vm-5",
            "persistentDisk": [
              {
                "slot": 0,
                "quantityGB": 40,
                "datastoreClusterName": "shared-datastore-cluster",
                "path": "/var/cpaas",
                "format": "xfs"
              }
            ]
          }
        ]
      }'
  3. 验证 IP 池容量

    扩展 IP 池后,验证其条目数足以满足所需的副本数:

    kubectl get dcsiphostnamepool -n cpaas-system <cluster-name>-worker-pool -o yaml

    检查池中的条目数是否至少等于所需的副本数。

  4. 扩展 MachineDeployment

    将 replicas 字段更新为所需的节点数:

    kubectl patch machinedeployment <cluster-name>-md-0 -n cpaas-system \
      --type='json' -p='[{"op": "replace", "path": "/spec/replicas", "value": <new-replica-count>}]'

    示例:从 3 个节点扩展到 5 个节点

    kubectl patch machinedeployment worker-pool-1 -n cpaas-system \
      --type='json' -p='[{"op": "replace", "path": "/spec/replicas", "value": 5}]'
  5. 监控扩容进度

    查看 Machine 创建过程:

    # Watch machines being created
    kubectl get machines -n cpaas-system -w
    
    # Check MachineDeployment status
    kubectl get machinedeployment <cluster-name>-md-0 -n cpaas-system

    Cluster API 控制器将根据 MachineDeployment 模板自动创建新的 Machine。

  6. 验证节点已加入集群

    切换到目标集群上下文并验证新节点:

    # Switch to target cluster context
    kubectl config use-context <target-cluster-context>
    
    # Check all nodes are Ready
    kubectl get nodes

    新节点应出现在列表中,并转换为 Ready 状态。

INFO

滚动更新行为 扩容时,新节点会立即创建,不会影响现有节点,从而确保扩容期间零停机。

移除工作节点

减少工作节点数量,以降低集群容量或移除未充分利用的资源。Cluster API 支持两种移除策略:

  1. 随机移除:减少副本数,由平台随机选择并删除 Machine
  2. 定向移除:标记要删除的特定 Machine,然后减少副本数(推荐用于 IP 回收)
INFO

IP 回收场景 需要回收特定 Machine 的 IP(例如重新分配或管理 IP 池)时,请使用定向移除方法。删除注解可确保平台删除已标记的 Machine,而不是随机删除 Machine。

WARNING

数据丢失警告 缩容会移除节点及其关联的 VM。请确保:

  • 工作负载通过适当的副本机制能够容忍节点丢失
  • 要移除的节点上没有仅存储一份的关键数据
  • 应用程序设计为支持水平扩展

仅仅因为替换 Machine,不会删除 DCSIpHostnamePool.spec.pool[].persistentDisk 中声明的持久化磁盘。在相应 IP 槽位仍保留在池中时,这些磁盘仍可供重复使用。从池中移除 IP 槽位、删除池或删除集群,都可能触发持久卷清理。

随机移除

使用场景:缩小集群,任意节点均可移除(无特定 IP 要求)

操作步骤:

  1. 确定当前 Machine 状态

    查看 MachineDeployment 中的当前 Machine:

    kubectl get machines -n cpaas-system -l cluster.x-k8s.io/deployment-name=<cluster-name>-md-0
  2. 缩小 MachineDeployment

    更新 replicas 字段以减少节点数:

    kubectl patch machinedeployment <cluster-name>-md-0 -n cpaas-system \
      --type='json' -p='[{"op": "replace", "path": "/spec/replicas", "value": <new-replica-count>}]'

    示例:从 5 个节点缩小到 3 个节点

    kubectl patch machinedeployment worker-pool-1 -n cpaas-system \
      --type='json' -p='[{"op": "replace", "path": "/spec/replicas", "value": 3}]'

    Cluster API 控制器将随机选择并删除 Machine,使其达到所需的副本数。

  3. 监控移除进度

    查看 Machine 删除过程:

    kubectl get machines -n cpaas-system -w

    Cluster API 控制器将:

    • 排空选定的节点(如果可能则驱逐 Pod)
    • 从 DCS 平台删除底层 VM
    • 移除 Machine 资源
  4. 验证节点已移除

    切换到目标集群上下文:

    kubectl config use-context <target-cluster-context>
    kubectl get nodes

    已移除的节点不应再出现在列表中。

定向移除

使用场景:移除特定 Machine(例如回收 IP、替换运行状况不佳的节点)

操作步骤:

  1. 确定要移除的 Machine

    查看当前 Machine:

    kubectl get machines -n cpaas-system -l cluster.x-k8s.io/deployment-name=<cluster-name>-md-0

    记录要移除的 Machine 的 <machine-name>。

  2. 为 Machine 添加删除注解

    标记要删除的特定 Machine:

    kubectl patch machine <machine-name> -n cpaas-system \
      --type='merge' -p='{"metadata": {"annotations": {"cluster.x-k8s.io/delete-machine": "true"}}}'

    对要移除的每个 Machine 重复此操作。

    示例:移除两个特定的 Machine

    kubectl patch machine worker-pool-1-abc123 -n cpaas-system \
      --type='merge' -p='{"metadata": {"annotations": {"cluster.x-k8s.io/delete-machine": "true"}}}'
    
    kubectl patch machine worker-pool-1-def456 -n cpaas-system \
      --type='merge' -p='{"metadata": {"annotations": {"cluster.x-k8s.io/delete-machine": "true"}}}'
  3. 缩小 MachineDeployment

    为 Machine 添加注解后,减少副本数:

    INFO

    副本数必须与已添加注解的 Machine 数量一致 副本数必须恰好减少已添加注解的 Machine 数量。

    • 如果减少的数量较少,则不会移除所有已添加注解的 Machine
    • 如果减少的数量较多,则会随机选择其他 Machine 进行删除
    kubectl patch machinedeployment <cluster-name>-md-0 -n cpaas-system \
      --type='json' -p='[{"op": "replace", "path": "/spec/replicas", "value": <new-replica-count>}]'

    示例:如果为 2 个 Machine 添加了注解,则副本数必须恰好减少 2(例如从 5 减少到 3)

    平台将删除已添加注解的 Machine,而不是随机选择的 Machine。

  4. 监控移除进度

    查看 Machine 删除过程:

    kubectl get machines -n cpaas-system -w
  5. 验证节点已移除

    切换到目标集群上下文:

    kubectl config use-context <target-cluster-context>
    kubectl get nodes

    已移除的节点不应再出现在列表中。

更改 Machine 基础设施

要更改工作节点的 Machine 规格(CPU、内存、磁盘、VM 模板),请创建新的 Machine 模板,然后将 MachineDeployment 指向该模板。工作节点会逐个替换。

  1. 创建新的 Machine 模板

    将 MachineDeployment 引用的 DCSMachineTemplate 导出到新文件:

    kubectl get dcsmachinetemplate <current-template-name> -n cpaas-system -o yaml > new-template.yaml

    在新文件中:

    • 将 metadata.name 设置为唯一名称
    • 修改所需的值(spec.template.spec.vmTemplateName、spec.template.spec.vmConfig.dcsMachineCpuSpec.quantity、spec.template.spec.vmConfig.dcsMachineMemorySpec.quantity、spec.template.spec.vmConfig.dcsMachineDiskSpec)
    • 移除服务器生成的元数据(resourceVersion、uid、generation、creationTimestamp、managedFields、kubectl.kubernetes.io/last-applied-configuration 注解)以及整个 status 字段
    • 不设置 spec.template.spec.providerID

    将池管理的持久化磁盘(包括 /var/cpaas)保留在 DCSIpHostnamePool.spec.pool[].persistentDisk 中,并将其他 NIC 保留在 DCSIpHostnamePool.spec.pool[].additionNic[] 中。仅将 dcsMachineDiskSpec 用于系统磁盘和模板本地磁盘。

    应用新模板:

    kubectl apply -f new-template.yaml -n cpaas-system
  2. 更新 MachineDeployment

    将 MachineDeployment 指向新模板:

    kubectl patch machinedeployment <cluster-name>-md-0 -n cpaas-system \
      --type='merge' -p='{"spec":{"template":{"spec":{"infrastructureRef":{"name":"<new-template-name>"}}}}}'
  3. 监控滚动更新

    • 工作节点将使用新规格逐个替换

    • DCSIpHostnamePool.spec.pool[].persistentDisk 中声明的任何磁盘都会从旧 VM 分离,并重新连接到替换 VM。如果池使用持久化磁盘,请在 MachineDeployment 上将 spec.strategy.rollingUpdate.maxSurge 保持为 0

    • 监控进度:

      kubectl get machinedeployment <cluster-name>-md-0 -n cpaas-system
      kubectl get machines -n cpaas-system -w

要更改控制平面节点的 Machine 规格,请使用相同的步骤,并改为修补 KubeadmControlPlane.spec.machineTemplate.infrastructureRef.name。

要将节点迁移到新 Kubernetes 版本的 Alauda OS 镜像,请改为按照在 Huawei DCS 上升级 Kubernetes操作。

如果要将现有集群从旧的模板磁盘布局迁移到池管理的持久化磁盘,请在依赖升级期间的数据保留功能之前,按照将现有 Huawei DCS 集群迁移到池管理的持久化磁盘操作。

更新 Bootstrap 模板

Bootstrap 模板(KubeadmConfigTemplate)由 MachineDeployment 和 MachineSet 资源使用。更改现有模板不会自动触发现有 Machine 的滚动更新;只有新 Machine 会使用更新后的模板。

更新流程:

  1. 导出现有模板

    kubectl get KubeadmConfigTemplate <template-name> -o yaml > new-template.yaml
  2. 修改配置

    • 更新导出 YAML 中所需的字段
    • 对于 Kubernetes 1.35 或更高版本,将所需的 kubelet 修补设置添加到 /etc/kubernetes/patches/kubeletconfiguration0+strategic.json
    • 将 metadata.name 更改为新的唯一名称
    • 移除多余的元数据字段(resourceVersion、uid、creationTimestamp 等)
  3. 创建新模板

    kubectl apply -f new-template.yaml
  4. 更新 MachineDeployment

    • 修改 MachineDeployment 资源
    • 更新 spec.template.spec.bootstrap.configRef.name 以引用新模板
    • 应用更改以触发滚动更新
INFO

模板滚动更新行为 现有 Machine 继续使用旧的 Bootstrap 配置。只有新创建的 Machine(在扩缩容或滚动更新期间)会使用更新后的模板。


使用 Web UI 管理节点池

通过 Fleet Essentials 添加、删除和查看节点池不受《Fleet Essentials 限制》中所述升级限制的影响。

节点池提供了一种声明式方式,用于管理具有相同配置的节点组。您可以通过 Web UI 查看、添加和删除工作节点池。

要求:此操作流程需要 Fleet Essentials。persistentDisk 上的 DCSIpHostnamePool 声明仍仅支持 YAML,未在节点池 UI 中提供。

如果节点池依赖池管理的持久磁盘,请在使用此处的 Web UI 操作流程之前,使用 YAML 准备或更新相应的 DCSIpHostnamePool 条目。

INFO

导航:集群 → 集群 → 选择集群 → 节点池选项卡

查看节点池

节点池选项卡显示集群中的所有节点池:

控制平面节点池:

  • 固定为 3 个从节点,以实现高可用性
  • 显示 Kubernetes 版本;如果有可用升级,则显示升级指示器
  • 显示“Conditions”链接以查看详细状态

工作节点池:

  • 可自定义从节点数量
  • 可单独管理 Kubernetes 版本
  • 支持扩缩容和升级操作

节点池卡片信息:

字段描述
类型控制平面 / 工作节点
名称资源名称
状态显示节点池运行状况的徽章
从节点数量当前数量(工作节点显示 Max Surge/Max Unavailable)
SSH 授权密钥SSH 公钥列表
Kubernetes 版本当前版本(如果有可用升级,则显示升级指示器)
Machine 模板关联的模板名称
ConditionsConditions 列表链接(仅限控制平面)

添加工作节点池

导航:节点池选项卡 → 单击添加工作节点池

表单字段:

字段类型必填描述
池名称文本是节点池的唯一标识符
Machine 模板下拉列表是按类型“工作节点”和兼容的 Kubernetes 版本进行筛选
从节点数量数字是节点池中的节点数量
Max Surge数字否默认值:0,必须 ≥ 0。如果节点池依赖持久磁盘,请将此值保持为 0
Max Unavailable数字否默认值:1,必须 ≥ 0。当 maxSurge = 0 时,必须 > 0 且 ≤ 从节点数量
SSH 授权密钥文本否添加多个 SSH 公钥

验证:

  • 池名称在集群内必须唯一
  • IP Pool 必须有足够的可用 IP 地址(≥ 从节点数量)
  • 必须满足 maxSurge/maxUnavailable 约束
  • 如果节点池依赖持久磁盘,请保留 maxSurge = 0,以便逐个替换 Machine

提示:将集群名称后接连字符作为池名称前缀(例如 mycluster-worker-1),以避免名称冲突。

创建后,新节点会显示在节点选项卡中。节点数量等于配置的从节点数量值。

删除工作节点池

操作步骤:

  1. 单击工作节点池卡片上的删除图标
  2. 在对话框中确认删除
WARNING

删除工作节点池会永久移除所有关联的节点和 Machine。请通过适当的副本机制,确保工作负载能够承受这些节点的丢失。

查看 Conditions(仅限控制平面)

单击控制平面节点池卡片上的Conditions链接,查看详细状态信息。

Conditions 列表:

类型状态上次转换时间原因消息
Condition 类型状态时间戳原因人类可读的详细信息

故障排查

新工作节点 Machine 一直处于 Provisioning 状态,且 DCS VM 一直处于 creating 状态

控制平面和工作节点 Machine 对象的诊断流程相同:当 DCSMachine 达到 Provisioning,且已设置 status.cdRomFile(DCS API 身份验证和 ISO 上传均已成功),但底层 DCS VM 始终无法调度到主机时,故障出在 DCS 平台侧,而非控制器。

有关完整的诊断步骤,请参阅基础设施 → 故障排查:VM 卡在 creating,其中包括:

  • 确认问题是放置停滞(而非启动缓慢)。
  • 检查数据存储的可用空间。
  • 检查主机 CPU / 内存利用率和超额分配比率。
  • 当单个 DCS Host 负载饱和时,与 DCS 平台团队协调以重新平衡负载。
  • 部署任务确实陷入死锁时的升级处理路径。

有关跨多个物理主机实现控制平面高可用性的信息,请参阅基础设施 → 控制平面跨主机高可用性。

无论停滞的节点是新集群的第一个控制平面节点、通过 MachineDeployment 扩容添加的新工作节点,还是滚动更新期间创建的替换工作节点,诊断方法都相同。


后续步骤