在 Huawei DCS 上管理节点

本文档说明如何使用 Cluster API Machine 资源管理工作节点。

前提条件

WARNING

重要前提条件

  • 在执行节点操作之前,必须先部署控制平面。有关设置说明,请参见 创建集群
  • 确保你对 DCS 平台具有适当的访问权限和所需的权限。
INFO

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

  • 仅修改用 <> 括起来的值
  • 用与你环境相关的设置替换占位符值
  • 除非有明确要求,否则保留所有其他默认配置

概述

工作节点通过 Cluster API Machine 资源进行管理,从而提供声明式和自动化的节点生命周期管理。部署过程包括:

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

工作节点部署

步骤 1:配置 IP-Hostname Pool

IP-Hostname Pool 定义工作节点虚拟机的网络配置。你必须在部署之前规划并配置 IP 地址、主机名、DNS 服务器、额外 NIC 以及其他网络参数。

在 Huawei DCS 上,IP 池也是你声明必须在 VM 替换后仍然保留的持久磁盘的位置。对于平台要求的 /var/cpaas 磁盘,以及任何在删除-重建操作期间必须保留的其他工作节点磁盘,请使用 persistentDisk。此工作流要求 DCS provider v1.0.16 或更高版本。

WARNING

池大小要求 池中包含的条目数量必须至少与计划部署的工作节点数量相同。条目不足将阻止节点部署。

示例:

创建一个名为 <cluster-name>-worker-poolDCSIpHostnamePool

apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DCSIpHostnamePool
metadata:
  name: <cluster-name>-worker-pool
  namespace: cpaas-system
spec:
  pool:
  - ip: "<worker-ip-1>"
    mask: "<worker-cidr-prefix-length>"
    gateway: "<worker-gateway>"
    dns: "<worker-dns>"
    hostname: "<worker-hostname-1>"
    machineName: "<worker-machine-name-1>"
    additionNic:
    - ip: "<worker-additional-ip-1>"
      mask: "<worker-additional-cidr-prefix-length>"
      gateway: "<worker-additional-gateway>"
      dns: "<worker-additional-dns>"
      dvSwitchName: "<additional-dvs>"
      portGroupName: "<additional-port-group>"
    persistentDisk:
    - slot: 0
      quantityGB: 40
      datastoreClusterName: <datastore-cluster-name>
      path: /var/cpaas
      format: xfs
  - ip: "<worker-ip-2>"
    mask: "<worker-cidr-prefix-length>"
    gateway: "<worker-gateway>"
    dns: "<worker-dns>"
    hostname: "<worker-hostname-2>"
    machineName: "<worker-machine-name-2>"
    persistentDisk:
    - slot: 0
      quantityGB: 40
      datastoreClusterName: <datastore-cluster-name>
      path: /var/cpaas
      format: xfs
  - ip: "<worker-ip-3>"
    mask: "<worker-cidr-prefix-length>"
    gateway: "<worker-gateway>"
    dns: "<worker-dns>"
    hostname: "<worker-hostname-3>"
    machineName: "<worker-machine-name-3>"
    persistentDisk:
    - slot: 0
      quantityGB: 40
      datastoreClusterName: <datastore-cluster-name>
      path: /var/cpaas
      format: xfs

关键参数:

ParameterTypeDescriptionRequired
.spec.pool[].ipstring工作虚拟机的 IP 地址Yes
.spec.pool[].maskstring以 CIDR 前缀长度格式表示的子网掩码,不带 /,例如 24Yes
.spec.pool[].gatewaystring网关 IP 地址Yes
.spec.pool[].dnsstringDNS 服务器 IP 地址(多个地址用分号分隔)No
.spec.pool[].machineNamestringDCS 平台中的虚拟机名称No
.spec.pool[].hostnamestring虚拟机的主机名No
.spec.pool[].additionNic[][]object绑定到此 IP 槽位的额外 NIC。可用于存储、管理或隔离的应用网络。No
.spec.pool[].additionNic[].ipstring为生成的来宾网络配置提供的额外 NIC IP 地址。Recommended*
.spec.pool[].additionNic[].maskstring额外 NIC 的子网掩码,以 CIDR 前缀长度格式表示,不带 /,例如 24Recommended*
.spec.pool[].additionNic[].gatewaystring额外 NIC 网络的网关。设置此值之前请确认路由行为。No
.spec.pool[].additionNic[].dnsstring额外 NIC 网络的 DNS 服务器 IP,多个值时用分号分隔。No
.spec.pool[].additionNic[].dvSwitchNamestring用于解析额外 NIC 所属 Port Group 的 DCS distributed virtual switch。Yes*
.spec.pool[].additionNic[].portGroupNamestring用于连接额外 NIC 的 DCS Port Group。Yes*
.spec.pool[].persistentDisk[][]object绑定到此 IP 槽位的持久磁盘。用于 /var/cpaas 以及任何在节点替换后必须保留的磁盘。No

*标记为 Yes* 的字段是 provider 解析目标网络并连接额外 NIC 所必需的。标记为 Recommended* 的字段用于生成静态来宾网络配置。CRD 不会强制校验这些字段。

步骤 2:配置 Machine 模板

DCSMachineTemplate 定义工作节点虚拟机的规格,包括 VM 模板、计算资源、存储配置和网络设置。

此资源中的字段引用了多个 Huawei DCS 平台概念(DCS VM Template、DCS VM Folder、DCS Datastore 以及相关项)。有关这些概念的定义以及它们如何映射到 Cluster API 资源,请参见 Huawei DCS 概念与术语

WARNING

必需的磁盘配置 以下磁盘挂载点是必需的。请不要删除它们:

  • 系统卷(systemVolume: true
  • /var/lib/kubelet - Kubelet 数据目录
  • /var/lib/containerd - 容器运行时数据

请在 IP 池中将 /var/cpaas 配置为持久磁盘,而不是在 DCSMachineTemplate 中配置。

你可以添加额外的模板磁盘,但这些基础模板磁盘必须保留。

示例:

创建一个名为 <cluster-name>-worker-templateDCSMachineTemplate

apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DCSMachineTemplate
metadata:
  name: <cluster-name>-worker-template
  namespace: cpaas-system
spec:
  template:
    spec:
      vmTemplateName: <vm-template-name>
      location:
        type: folder
        name: <folder-name>
      vmConfig:
        dvSwitchName: <dv-switch-name> # Optional
        portGroupName: <port-group-name> # Optional
        dcsMachineCpuSpec:
          quantity: <worker-cpu>
        dcsMachineMemorySpec: # MB
          quantity: <worker-memory>
        dcsMachineDiskSpec: # GB
        - quantity: 0
          datastoreClusterName: <datastore-cluster-name>
          systemVolume: true
        - quantity: 100
          datastoreClusterName: <datastore-cluster-name>
          path: /var/lib/kubelet
          format: xfs
        - quantity: 100
          datastoreClusterName: <datastore-cluster-name>
          path: /var/lib/containerd
          format: xfs
      ipHostPoolRef:
        name: <cluster-name>-worker-pool

关键参数:

ParameterTypeDescriptionRequired
.spec.template.spec.vmTemplateNamestring在 DCS 平台上注册的 DCS VM Template 名称。Yes
.spec.template.spec.locationobject将克隆出的虚拟机放置到 DCS VM Folder 下,用于组织分组。如果省略,虚拟机将不会被放入任何文件夹。有关 VM Folder 的定义,请参见 Huawei DCS 概念与术语;有关此字段在多集群中的使用,请参见 基础设施 → 高级:多集群部署No
.spec.template.spec.location.typestring标准工作流中设置为 folder。该文件夹必须已存在于 DCS 平台上。Yes*
.spec.template.spec.location.namestring现有 DCS VM Folder 的名称。Yes*
.spec.template.spec.vmConfigobject虚拟机配置Yes
.spec.template.spec.vmConfig.dvSwitchNamestring虚拟交换机名称(未指定时使用模板默认值)No
.spec.template.spec.vmConfig.portGroupNamestringPort group 名称(必须属于指定的 switch)No
.spec.template.spec.vmConfig.dcsMachineCpuSpec.quantityint工作 VM 的 CPU 核数Yes
.spec.template.spec.vmConfig.dcsMachineMemorySpec.quantityint内存大小,单位为 MBYes
.spec.template.spec.vmConfig.dcsMachineDiskSpec[]object磁盘配置数组Yes
.spec.template.spec.vmConfig.dcsMachineDiskSpec[].quantityint磁盘大小,单位为 GB(系统盘为 0 时使用模板大小)Yes
.spec.template.spec.vmConfig.dcsMachineDiskSpec[].datastoreClusterNamestringDatastore 集群名称Yes
.spec.template.spec.vmConfig.dcsMachineDiskSpec[].systemVolumebool系统盘标志(只能有一个磁盘为 true)No
.spec.template.spec.vmConfig.dcsMachineDiskSpec[].pathstring挂载路径(如果省略则不挂载磁盘)No
.spec.template.spec.vmConfig.dcsMachineDiskSpec[].formatstring文件系统格式(例如 xfs、ext4)No
.spec.template.spec.ipHostPoolRef.namestring引用的 DCSIpHostnamePool 名称Yes

*当指定父对象时为必需

由 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 卷类型。
  • formatoptionspciType 视为创建后不可变。
  • 仅在 DCS 环境要求为新建持久卷显式指定 thin-provisioning 值时使用 isThin。如果省略该字段,provider 不会发送 isThin,而 DCS 会使用平台默认值。
  • quantityGB 和 datastore 变更视为会影响滚动更新的变更。当控制器具备足够的集群上下文时,webhook 会尽最大努力对 DCS 平台执行校验。isThin 仅在创建时生效:修改它不会对现有卷进行校验、协调或转换,只会影响之后创建的持久卷。

要在节点操作期间检查持久磁盘的运行状态,请查看池上的 status.persistentDiskStatus

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

由 IP 池管理的额外 NIC

DCSIpHostnamePool.spec.pool[].additionNic[] 中声明工作节点的额外 NIC。

  • provider 仅在创建新 VM 时应用 additionNic[]
  • 当你编辑 Pool 时,现有工作 VM 不会热更新。
  • 新的工作 Machine 会使用其所认领的 Pool 槽位中的 additionNic[] 值。
  • 每个额外 NIC 都应包含 dvSwitchNameportGroupName,以便 provider 在 VM 克隆之前解析目标 DCS Port Group。
  • 如果你也使用 persistentDisk[],请保持 MachineDeployment.spec.strategy.rollingUpdate.maxSurge = 0,以便固定 IP 槽位和保留磁盘逐个迁移到一个节点。
  • 如果额外 NIC 配置了网关,请确认来宾 OS 路由表仍然优先使用预期的主网络作为默认路由。

要检查额外 NIC 的运行状态,请查看 DCSMachine.status.additionalNic

kubectl -n cpaas-system get dcsmachine -l cluster.x-k8s.io/cluster-name=<cluster-name> \
  -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.networkConfig.ip}{"\t"}{.status.additionalNic}{"\n"}{end}'

步骤 3:配置 Bootstrap 模板

KubeadmConfigTemplate 定义工作节点的 bootstrap 配置,包括用户账户、SSH 密钥、系统文件以及 kubeadm 加入设置。

imagePullCredentialsVerificationPolicy: NeverVerify 仅在 Kubernetes 1.35 及之后版本中必需。使用 Kubernetes 1.34 或更早版本创建工作节点时,请省略此参数。如果 contentFrom.secret 提供了补丁,请确认引用的 worker-kubelet-patch.json 在 Kubernetes 1.35 中包含此参数。

INFO

模板优化 该模板包含针对安全性和性能的预优化配置。仅修改需要为你的环境定制的参数。

示例:

apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
kind: KubeadmConfigTemplate
metadata:
  name: <cluster-name>-worker-kct
  namespace: cpaas-system
spec:
  template:
    spec:
      format: ignition
      users:
      - name: boot
        sshAuthorizedKeys:
        - "<ssh-authorized-keys>"
      files:
      - path: /etc/kubernetes/patches/kubeletconfiguration0+strategic.json
        owner: "root:root"
        permissions: "0644"
        content: |
          {
            "apiVersion": "kubelet.config.k8s.io/v1beta1",
            "kind": "KubeletConfiguration",
            "imagePullCredentialsVerificationPolicy": "NeverVerify",
            "protectKernelDefaults": true,
            "staticPodPath": null,
            "tlsCertFile": "/etc/kubernetes/pki/kubelet.crt",
            "tlsPrivateKeyFile": "/etc/kubernetes/pki/kubelet.key",
            "streamingConnectionIdleTimeout": "5m",
            "clientCAFile": "/etc/kubernetes/pki/ca.crt"
          }
      preKubeadmCommands:
      - while ! ip route | grep -q "default via"; do sleep 1; done; echo "NetworkManager started"
      - mkdir -p /run/cluster-api && restorecon -Rv /run/cluster-api
      - if [ -f /etc/disk-setup.sh ]; then bash /etc/disk-setup.sh; fi
      postKubeadmCommands:
      - chmod 600 /var/lib/kubelet/config.yaml
      joinConfiguration:
        patches:
          directory: /etc/kubernetes/patches
        nodeRegistration:
          kubeletExtraArgs:
            node-ip: NODE_IP
            provider-id: PROVIDER_ID
            volume-plugin-dir: "/opt/libexec/kubernetes/kubelet-plugins/volume/exec/"
            protect-kernel-defaults: "true"

PROVIDER_IDNODE_IP 是 DCS Provider 在机器加入时替换的字面魔法令牌——请保持其原样。完整列表请参见 Magic-Token 占位符

TIP

替代方案:引用集中管理的 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 还包含一个适用于工作节点 KubeadmConfigTemplateworker-kubelet-patch.json 键。当该 Secret 存在时,你可以将上面的内联 files 条目替换为 contentFrom.secret 引用——这可使工作节点 kubelet patch 与已安装的插件版本保持同步,并避免在集群升级时进行手动更新。

files:
- contentFrom:
    secret:
      key: worker-kubelet-patch.json
      name: dcs-kubernetes-1.33-files
  owner: "root:root"
  path: /etc/kubernetes/patches/kubeletconfiguration0+strategic.json
  permissions: "0644"

内联形式和引用 Secret 的形式在功能上等价;当目标集群中可用该插件 Secret 时,推荐使用 Secret 形式。

最低插件版本:与控制平面附录提示相同——worker-kubelet-patch.json 是从 DCS Provider v1.0.13 起随 dcs-kubernetes-1.33-files Secret 一起提供的。在更早的插件版本中,该 Secret 不存在;这种情况下请保留内联 content: 形式。

步骤 4:配置 Machine Deployment

MachineDeployment 通过引用之前配置的 DCSMachineTemplateKubeadmConfigTemplate 资源来编排工作节点的创建和管理。它管理所需的节点数量并处理滚动更新。

示例:

apiVersion: cluster.x-k8s.io/v1beta1
kind: MachineDeployment
metadata:
  name: <cluster-name>-md-0
  namespace: cpaas-system
spec:
  strategy:
    rollingUpdate:
      maxSurge: 0 # Required when this node pool relies on persistent disks
      maxUnavailable: 1
    type: RollingUpdate
  clusterName: <cluster-name>
  replicas: 3
  selector:
    matchLabels: null
  template:
    metadata:
      labels:
        cluster.x-k8s.io/cluster-name: <cluster-name>
        pool.name: <cluster-name>-md-0
    spec:
      nodeDrainTimeout: 1m
      nodeDeletionTimeout: 5m
      bootstrap:
        configRef:
          apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
          kind: KubeadmConfigTemplate
          name: <cluster-name>-worker-kct
          namespace: cpaas-system
      clusterName: <cluster-name>
      infrastructureRef:
        apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
        kind: DCSMachineTemplate
        name: <cluster-name>-worker-template
        namespace: cpaas-system
      version: <worker-kubernetes-version>

关键参数:

ParameterTypeDescriptionRequired
.spec.clusterNamestring节点部署的目标集群名称Yes
.spec.replicasint工作节点数量(不得超过 IP 池大小)Yes
.spec.template.spec.bootstrap.configRefobjectKubeadmConfigTemplate 的引用Yes
.spec.template.spec.infrastructureRefobjectDCSMachineTemplate 的引用Yes
.spec.template.spec.versionstringKubernetes 版本(必须与 VM 模板匹配)Yes
.spec.strategy.rollingUpdate.maxSurgeint更新期间超过所需数量的最大节点数。当节点池依赖持久磁盘时,请将其保持为 0No
.spec.strategy.rollingUpdate.maxUnavailableint更新期间不可用节点的最大数量。当使用持久磁盘且 maxSurge = 0 时,请将此值保持大于 0 且不超过副本数No

节点管理操作

本节介绍管理工作节点的常见运维任务,包括扩缩容、更新、升级和模板修改。

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,除非你确实要添加新磁盘
    • 确保每个新条目都具有唯一的 iphostnamemachineName
    • 如果新工作节点也需要平台要求的 /var/cpaas 磁盘,请在每个新条目的 persistentDisk 中声明它
    • 网络参数(maskgatewaydns)通常与现有条目一致

    示例:在一个已有 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 controller 会根据 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,而不是随机删除。

WARNING

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

  • 通过适当的副本机制保证工作负载能够容忍节点丢失
  • 没有关键数据仅存储在将被移除的节点上
  • 应用程序已针对水平扩展进行设计

DCSIpHostnamePool.spec.pool[].persistentDisk 中声明的持久磁盘,不会因为 Machine 被替换而被删除。只要对应的 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 controller 会随机选择并删除 machine,以匹配期望的副本数。

  3. 监控删除进度

    观察 machine 删除过程:

    kubectl get machines -n cpaas-system -w

    Cluster API controller 将:

    • Drain 选定的节点(如有可能,逐出 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 模板),请按以下步骤操作:

  1. 创建新的 Machine 模板

    • 复制 MachineDeployment 引用的现有 DCSMachineTemplate
    • 修改所需值(CPU、内存、磁盘、VM 模板等)
    • 为新模板指定唯一名称
    • 将新的 DCSMachineTemplate 应用到集群
  2. 更新 Machine Deployment

    • 修改 MachineDeployment 资源
    • 更新 spec.template.spec.infrastructureRef.name 字段以引用新模板
    • 应用更改
  3. 滚动更新

    • 系统将自动触发滚动更新
    • 工作节点将使用新规格进行替换
    • DCSIpHostnamePool.spec.pool[].persistentDisk 中声明的任何磁盘,都会从旧 VM 卸载并重新挂载到替换后的 VM 上
    • 通过 MachineDeployment 状态监控更新进度

如果你要将现有集群从旧的模板磁盘布局迁移到由池管理的持久磁盘,请先按照 将现有 Huawei DCS 集群迁移到由池管理的持久磁盘 进行操作,然后再依赖升级期间的数据保留。

更新 Bootstrap 模板

Bootstrap 模板(KubeadmConfigTemplate)由 MachineDeploymentMachineSet 资源使用。对现有模板的修改不会自动触发现有 machine 的滚动更新;只有新 machine 才会使用更新后的模板。

更新流程:

  1. 导出现有模板

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

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

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

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

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

升级 Kubernetes 版本

有关 Huawei DCS 上的 Kubernetes 和 Alauda OS 升级,请参见 在 Huawei DCS 上升级 Kubernetes。该指南涵盖了控制平面和工作节点替换所需的顺序以及 YAML 工作流。


使用 Web UI 管理节点池

INFO

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 工作流。

INFO

导航路径:Clusters → Clusters → 选择集群 → Node Pools 选项卡

查看节点池

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

控制平面节点池

  • 为高可用性固定为 3 个副本
  • 如果可用,会显示带升级指示器的 Kubernetes 版本
  • 显示 Conditions 链接以查看详细状态

工作节点池

  • 可自定义副本数
  • 单独管理 Kubernetes 版本
  • 扩容和升级操作

节点池卡片信息

FieldDescription
Type控制平面 / 工作节点
Name资源名称
Status显示池健康状态的徽标
Replicas当前数量(工作节点还会显示 Max Surge/Max Unavailable)
SSH Authorized KeysSSH 公钥列表
Kubernetes Version当前版本(如果可用则显示升级指示器)
Machine Template关联的模板名称
Conditions指向 conditions 列表的链接(仅控制平面)

添加工作节点池

导航路径:Node Pools 选项卡 → 单击 Add Worker Node Pool

表单字段

FieldTypeRequiredDescription
Pool NametextYes节点池的唯一标识符
Machine TemplatedropdownYes按 Type: Worker Node 和兼容的 Kubernetes 版本筛选
ReplicasnumberYes池中的节点数量
Max SurgenumberNo默认值:0,必须大于等于 0。如果节点池依赖持久磁盘,请将此值保持为 0
Max UnavailablenumberNo默认值:1,必须大于等于 0。当 maxSurge = 0 时,必须大于 0 且小于等于 Replicas
SSH Authorized KeystextNo添加多个 SSH 公钥

校验

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

提示:建议在池名称前加上集群名称并用连字符分隔(例如 mycluster-worker-1),以避免命名冲突。

创建完成后,新节点会出现在 Nodes 选项卡中。节点数量等于配置的 Replicas 值。

删除工作节点池

步骤

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

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

查看 Conditions(仅控制平面)

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

Conditions 列表

TypeStatusLast Transition TimeReasonMessage
Condition TypeStatusTimestampReasonHuman-readable details

故障排查

新的工作 Machine 一直处于 Provisioning,且 DCS VM 一直处于 creating

控制平面和工作 Machine 对象的诊断流程完全相同——当 DCSMachine 已进入 Provisioningstatus.cdRomFile 已设置(DCS API 认证和 ISO 上传成功),但底层 DCS VM 从未调度到某个主机时,故障位于 DCS 平台侧,而不是 controller 中。

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

  • 确认症状是放置停滞,而不是启动缓慢。
  • 检查 datastore 可用空间。
  • 检查主机 CPU / 内存利用率和超分配比例。
  • 当某个 DCS Host 已饱和时,与 DCS 平台团队协调重新平衡负载。
  • 当部署任务确实发生死锁时的升级处理路径。

有关跨多个物理主机的控制平面高可用性,请参见 基础设施 → 控制平面的跨主机高可用

无论卡住的是新集群的第一个控制平面节点、通过 MachineDeployment 扩容新添加的工作节点,还是滚动更新期间创建的替换工作节点,以上诊断都适用。


后续步骤