在 Huawei DCS 上管理节点
本文档说明如何使用 Cluster API Machine 资源管理 worker 节点。
前提条件
WARNING
重要前提条件
- 在执行节点操作之前,必须先部署控制平面。有关设置说明,请参见 Create Cluster。
- 确保您对 DCS 平台具有适当的访问权限和所需权限。
INFO
配置指南
在处理本文档中的配置时:
- 仅修改用
<> 括起来的值
- 使用与您的环境相关的设置替换占位符值
- 除非有明确要求,否则保留所有其他默认配置
概述
worker 节点通过 Cluster API Machine 资源进行管理,从而提供声明式和自动化的节点生命周期管理。部署过程包括:
- IP-Hostname 池配置 - worker 节点的网络设置
- Machine 模板设置 - VM 规格
- Bootstrap 配置 - 节点初始化和加入设置
- Machine 部署 - 节点创建和管理编排
worker 节点部署
第 1 步:配置 IP-Hostname 池
IP-Hostname Pool 定义了 worker 节点虚拟机的网络配置。您必须在部署前规划并配置 IP 地址、主机名、DNS 服务器以及其他网络参数。
WARNING
池大小要求
池中包含的条目数必须至少与您计划部署的 worker 节点数量相同。条目不足将导致节点无法部署。
示例:
创建一个名为 <worker-iphostname-pool-name> 的 DCSIpHostnamePool:
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DCSIpHostnamePool
metadata:
name: <worker-iphostname-pool-name>
namespace: cpaas-system
spec:
pool:
- ip: "<worker-ip-1>"
mask: "<worker-mask>"
gateway: "<worker-gateway>"
dns: "<worker-dns>"
hostname: "<worker-hostname-1>"
machineName: "<worker-machine-name-1>"
- ip: "<worker-ip-2>"
mask: "<worker-mask>"
gateway: "<worker-gateway>"
dns: "<worker-dns>"
hostname: "<worker-hostname-2>"
machineName: "<worker-machine-name-2>"
- ip: "<worker-ip-3>"
mask: "<worker-mask>"
gateway: "<worker-gateway>"
dns: "<worker-dns>"
hostname: "<worker-hostname-3>"
machineName: "<worker-machine-name-3>"
关键参数:
第 2 步:配置 Machine 模板
DCSMachineTemplate 定义了 worker 节点虚拟机的规格,包括 VM 模板、计算资源、存储配置和网络设置。
WARNING
必需的磁盘配置
以下磁盘挂载点是必需的,请不要删除:
- 系统卷(
systemVolume: true)
/var/lib/kubelet - Kubelet 数据目录
/var/lib/containerd - 容器运行时数据
/var/cpaas - 平台特定数据
您可以添加额外磁盘,但必须保留这些关键配置。
示例:
创建一个名为 <worker-dcs-machine-template-name> 的 DCSMachineTemplate:
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DCSMachineTemplate
metadata:
name: <worker-dcs-machine-template-name>
namespace: cpaas-system
spec:
template:
spec:
vmTemplateName: <vm-template-name>
location:
type: folder
name: <folder-name>
resource: # 可选,如果未指定,则使用模板默认值
type: cluster # cluster | host. 可选
name: <cluster-name> # 可选
vmConfig:
dvSwitchName: <dv-switch-name> # 可选
portGroupName: <port-group-name> # 可选
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
- quantity: 40
datastoreClusterName: <datastore-cluster-name>
path: /var/cpaas
format: xfs
ipHostPoolRef:
name: <worker-iphostname-pool-name>
关键参数:
*当指定父对象时为必需
第 3 步:配置 Bootstrap 模板
KubeadmConfigTemplate 定义了 worker 节点的 bootstrap 配置,包括用户账户、SSH 密钥、系统文件以及 kubeadm join 设置。
INFO
模板优化
该模板包含针对安全性和性能预优化的配置。仅修改您环境中需要自定义的参数。
示例:
apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
kind: KubeadmConfigTemplate
metadata:
name: <worker-kubeadm-config-template>
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",
"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:
provider-id: PROVIDER_ID
volume-plugin-dir: "/opt/libexec/kubernetes/kubelet-plugins/volume/exec/"
第 4 步:配置 Machine Deployment
MachineDeployment 通过引用前面配置的 DCSMachineTemplate 和 KubeadmConfigTemplate 资源来编排 worker 节点的创建和管理。它管理所需节点数量并处理滚动更新。
示例:
apiVersion: cluster.x-k8s.io/v1beta1
kind: MachineDeployment
metadata:
name: <worker-machine-deployment-name>
namespace: cpaas-system
spec:
strategy:
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
type: RollingUpdate
clusterName: <cluster-name>
replicas: 3
selector:
matchLabels: null
template:
spec:
nodeDrainTimeout: 1m
nodeDeletionTimeout: 5m
bootstrap:
configRef:
apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
kind: KubeadmConfigTemplate
name: <worker-kubeadm-config-template-name>
namespace: cpaas-system
clusterName: <cluster-name>
infrastructureRef:
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DCSMachineTemplate
name: <worker-dcs-machine-template-name>
namespace: cpaas-system
version: <worker-kubernetes-version>
关键参数:
节点管理操作
本节介绍管理 worker 节点的常见操作任务,包括扩缩容、更新、升级以及模板修改。
扩缩 worker 节点
worker 节点扩缩容可让您根据工作负载需求调整集群容量。Cluster API 通过 MachineDeployment 资源自动管理节点生命周期。
添加 worker 节点
增加 worker 节点数量,以应对工作负载增加或扩展新的容量。
使用场景:扩容集群以增加更多计算资源
前提条件:
- 确认 IP 池中有足够的可用 IP 地址用于新节点
- 确保 DCS 平台有足够资源来创建新的 VM
操作步骤:
-
检查当前节点状态
查看集群中当前的机器:
# 列出集群中的所有机器
kubectl get machines -n cpaas-system
# 列出某个特定 MachineDeployment 的机器
kubectl get machines -n cpaas-system -l cluster.x-k8s.io/deployment-name=<worker-machine-deployment-name>
-
扩展 IP 池
在扩容之前,请为新增节点向池中添加新的 IP 配置。
INFO
IP 池扩展
IP 池中包含的条目数必须至少与期望的副本数相同。为您计划部署的每个额外 worker 节点添加新的 IP 条目。
向池中添加 IP 条目:
首先,导出现有池配置以保留已有条目:
kubectl get dcsiphostnamepool <worker-iphostname-pool-name> -n cpaas-system -o yaml
然后使用以下命令添加新的 IP 配置。pool 数组必须包含所有现有条目以及新条目:
kubectl patch dcsiphostnamepool <worker-iphostname-pool-name> -n cpaas-system \
--type='merge' -p='
{
"spec": {
"pool": [
{
"ip": "<existing-ip-1>",
"mask": "<worker-mask>",
"gateway": "<worker-gateway>",
"dns": "<worker-dns>",
"hostname": "<existing-hostname-1>",
"machineName": "<existing-machine-name-1>"
},
{
"ip": "<existing-ip-2>",
"mask": "<worker-mask>",
"gateway": "<worker-gateway>",
"dns": "<worker-dns>",
"hostname": "<existing-hostname-2>",
"machineName": "<existing-machine-name-2>"
},
{
"ip": "<new-worker-ip-1>",
"mask": "<worker-mask>",
"gateway": "<worker-gateway>",
"dns": "<worker-dns>",
"hostname": "<new-worker-hostname-1>",
"machineName": "<new-worker-machine-name-1>"
},
{
"ip": "<new-worker-ip-2>",
"mask": "<worker-mask>",
"gateway": "<worker-gateway>",
"dns": "<worker-dns>",
"hostname": "<new-worker-hostname-2>",
"machineName": "<new-worker-machine-name-2>"
}
]
}'
WARNING
重要说明
pool 数组必须包含所有现有条目以及您要添加的新条目
- 请从导出的 YAML 中复制现有条目,以避免数据丢失
- 确保每个新条目的
ip、hostname 和 machineName 值唯一
- 网络参数(
mask、gateway、dns)通常与现有条目一致
示例:向现有 3 个节点的池中添加 2 个新节点
# 当前池包含 3 个条目(10.0.1.11, 10.0.1.12, 10.0.1.13)
# 为第 4 和第 5 个节点添加 2 个条目
kubectl patch dcsiphostnamepool worker-pool-1-ippool -n cpaas-system \
--type='merge' -p='
{
"spec": {
"pool": [
{
"ip": "10.0.1.11",
"mask": "255.255.255.0",
"gateway": "10.0.1.1",
"dns": "10.0.0.2",
"hostname": "worker-node-1",
"machineName": "worker-vm-1"
},
{
"ip": "10.0.1.12",
"mask": "255.255.255.0",
"gateway": "10.0.1.1",
"dns": "10.0.0.2",
"hostname": "worker-node-2",
"machineName": "worker-vm-2"
},
{
"ip": "10.0.1.13",
"mask": "255.255.255.0",
"gateway": "10.0.1.1",
"dns": "10.0.0.2",
"hostname": "worker-node-3",
"machineName": "worker-vm-3"
},
{
"ip": "10.0.1.14",
"mask": "255.255.255.0",
"gateway": "10.0.1.1",
"dns": "10.0.0.2",
"hostname": "worker-node-4",
"machineName": "worker-vm-4"
},
{
"ip": "10.0.1.15",
"mask": "255.255.255.0",
"gateway": "10.0.1.1",
"dns": "10.0.0.2",
"hostname": "worker-node-5",
"machineName": "worker-vm-5"
}
]
}'
-
验证 IP 池容量
扩展 IP 池后,验证其是否具有足够的条目来满足期望的副本数:
kubectl get dcsiphostnamepool -n cpaas-system <worker-iphostname-pool-name> -o yaml
检查池中条目数是否至少与期望的副本数相同。
-
扩容 MachineDeployment
将 replicas 字段更新为所需的节点数量:
kubectl patch machinedeployment <worker-machine-deployment-name> -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}]'
-
监控扩容进度
观察机器创建过程:
# 观察正在创建的机器
kubectl get machines -n cpaas-system -w
# 检查 MachineDeployment 状态
kubectl get machinedeployment <worker-machine-deployment-name> -n cpaas-system
Cluster API controller 将根据 MachineDeployment 模板自动创建新机器。
-
验证节点已加入集群
切换到目标集群上下文并验证新节点:
# 切换到目标集群上下文
kubectl config use-context <target-cluster-context>
# 检查所有节点是否处于 Ready 状态
kubectl get nodes
新节点应出现在列表中,并转为 Ready 状态。
INFO
滚动更新行为
在扩容时,新节点会立即创建,不会影响现有节点。这确保了零停机扩容。
删除 worker 节点
减少 worker 节点数量以降低集群容量或移除利用率较低的资源。Cluster API 支持两种删除策略:
- 随机删除:减少 replicas,平台会随机选择并删除机器
- 定向删除:将特定机器标记为删除,然后减少 replicas(建议用于 IP 回收)
INFO
IP 回收场景
当您需要回收特定机器的 IP(例如用于重新分配或 IP 池管理)时,请使用定向删除方法。删除注解可确保平台删除被标记的机器,而不是随机删除。
WARNING
数据丢失警告
缩容会移除节点及其关联磁盘。请确保:
- 工作负载可通过适当的副本机制容忍节点丢失
- 没有关键数据仅存储在被移除的节点上
- 应用程序已针对水平扩展进行设计
随机删除
使用场景:缩容集群,允许删除任意节点(无特定 IP 要求)
操作步骤:
-
识别当前机器状态
查看 MachineDeployment 中当前的机器:
kubectl get machines -n cpaas-system -l cluster.x-k8s.io/deployment-name=<worker-machine-deployment-name>
-
缩容 MachineDeployment
将 replicas 字段更新为较小的节点数量:
kubectl patch machinedeployment <worker-machine-deployment-name> -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 将随机选择并删除机器,以匹配期望的副本数。
-
监控删除进度
观察机器删除过程:
kubectl get machines -n cpaas-system -w
Cluster API controller 将:
- 排空所选节点(尽可能驱逐 pods)
- 从 DCS 平台删除底层 VM
- 移除 machine 资源
-
验证节点已删除
切换到目标集群上下文:
kubectl config use-context <target-cluster-context>
kubectl get nodes
被移除的节点应不再出现在列表中。
定向删除
使用场景:删除特定机器(例如用于 IP 回收、替换异常节点)
操作步骤:
-
识别要删除的机器
查看当前机器:
kubectl get machines -n cpaas-system -l cluster.x-k8s.io/deployment-name=<worker-machine-deployment-name>
记下您要删除的机器的 <machine-name>。
-
为机器添加删除注解
将特定机器标记为删除:
kubectl patch machine <machine-name> -n cpaas-system \
--type='merge' -p='{"metadata": {"annotations": {"cluster.x-k8s.io/delete-machine": "true"}}}'
对您要删除的每台机器重复执行此操作。
示例:删除两台特定机器
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"}}}'
-
缩容 MachineDeployment
在为机器添加注解后,减少副本数:
INFO
副本数必须与已注解的机器数量匹配
请将副本数恰好减少与已注解机器数量相同的数量。
- 如果减少得更少,并非所有已注解机器都会被移除
- 如果减少得更多,额外的机器将被随机选中删除
kubectl patch machinedeployment <worker-machine-deployment-name> -n cpaas-system \
--type='json' -p='[{"op": "replace", "path": "/spec/replicas", "value": <new-replica-count>}]'
示例:如果您标记了 2 台机器,则副本数应恰好减少 2 个(例如从 5 减到 3)
平台将删除已注解的机器,而不是随机选择的机器。
-
监控删除进度
观察机器删除过程:
kubectl get machines -n cpaas-system -w
-
验证节点已删除
切换到目标集群上下文:
kubectl config use-context <target-cluster-context>
kubectl get nodes
被移除的节点应不再出现在列表中。
升级 Machine 基础设施
如需升级 worker machine 规格(CPU、内存、磁盘、VM 模板),请按以下步骤操作:
-
创建新的 Machine 模板
- 复制
MachineDeployment 所引用的现有 DCSMachineTemplate
- 修改所需值(CPU、内存、磁盘、VM 模板等)
- 为新模板指定唯一名称
- 将新的
DCSMachineTemplate 应用到集群
-
更新 Machine Deployment
- 修改
MachineDeployment 资源
- 更新
spec.template.spec.infrastructureRef.name 字段以引用新模板
- 应用更改
-
滚动更新
- 系统将自动触发滚动更新
- worker 节点将被新规格的节点替换
- 通过 MachineDeployment 状态监控更新进度
更新 Bootstrap 模板
Bootstrap 模板(KubeadmConfigTemplate)由 MachineDeployment 和 MachineSet 资源使用。对现有模板的修改不会自动触发现有机器的滚动更新;只有新机器会使用更新后的模板。
更新流程:
-
导出现有模板
kubectl get KubeadmConfigTemplate <template-name> -o yaml > new-template.yaml
-
修改配置
- 更新导出 YAML 中需要的字段
- 将
metadata.name 更改为新的唯一名称
- 删除多余的元数据字段(
resourceVersion、uid、creationTimestamp 等)
-
创建新模板
kubectl apply -f new-template.yaml
-
更新 MachineDeployment
- 修改 MachineDeployment 资源
- 更新
spec.template.spec.bootstrap.configRef.name 以引用新模板
- 应用更改以触发滚动更新
INFO
模板滚动行为
现有机器将继续使用旧的 bootstrap 配置。只有新创建的机器(在扩容或滚动更新期间)会使用更新后的模板。
升级 Kubernetes 版本
有关 Huawei DCS 上的 Kubernetes 升级,请参见 在 Huawei DCS 上升级 Kubernetes。该指南涵盖所需的升级顺序、MachineDeployment 资源的 YAML 工作流,以及 Node Pool 升级的 web UI 工作流。
使用 Web UI 管理 Node Pools
Node pools 提供了一种声明式方式来管理具有相同配置的一组节点。您可以通过 web UI 查看、添加和删除 worker node pool。
版本要求:此工作流需要 Fleet Essentials 和 Alauda Container Platform DCS Infrastructure Provider 1.0.13 或更高版本。如果 provider 版本早于 1.0.13,请使用本文档中的基于 YAML 的 node pool 工作流。
INFO
导航:Clusters → Clusters → 选择集群 → Node Pools 选项卡
查看 Node Pools
Node Pools 选项卡会显示集群中的所有 node pool:
控制平面 Node Pool:
- 为高可用固定为 3 个副本
- 显示 Kubernetes 版本,并在可用时显示升级指示器
- 显示 Conditions 链接以查看详细状态
worker Node Pools:
- 可自定义副本数
- 单独管理 Kubernetes 版本
- 扩缩容和升级操作
Node Pool 卡片信息:
添加 worker Node Pool
导航:Node Pools 选项卡 → 点击 Add Worker Node Pool
表单字段:
校验:
- Pool 名称在集群内必须唯一
- IP Pool 必须有足够的可用 IP 地址(≥ Replicas)
- 必须满足 maxSurge/maxUnavailable 约束
提示:建议使用集群名称加连字符作为池名称前缀(例如 mycluster-worker-1),以避免命名冲突。
创建后,新节点会出现在 Nodes 选项卡中。节点数量等于配置的 Replicas 值。
删除 worker Node Pool
步骤:
- 点击 Worker Node Pool 卡片上的删除图标
- 在对话框中确认删除
WARNING
删除 worker node pool 将永久移除所有关联的节点和机器。请确保工作负载通过适当的副本机制能够承受这些节点的丢失。
查看 Conditions(仅 Control Plane)
点击 Control Plane Node Pool 卡片上的 Conditions 链接以查看详细状态信息。
Conditions 列表:
后续步骤