管理 VMware vSphere 上的节点

本文档说明在基础集群运行后,如何管理 VMware vSphere 上的 worker 节点。节点生命周期操作通过 VSphereMachineConfigPoolVSphereMachineTemplateKubeadmConfigTemplateMachineDeployment 资源进行管理。

前提条件

开始之前,请确保满足以下条件:

  • 业务集群已成功创建。请参见 在 VMware vSphere 上创建集群
  • worker machine config pool 有足够的可用 slot。
  • 控制平面运行正常且可访问。
  • 你知道当前定义 worker 节点的 manifest 文件。

步骤

扩容 worker 节点

当你添加更多 worker 节点时,请先更新 worker machine config pool,再增加 replica 数量。

  1. 03-vspheremachineconfigpool-worker.yaml 中添加一个或多个新的节点 slot。
  2. 更新 30-workers-md-0.yaml 中的 replicas
  3. 应用更新后的 manifest。

请按以下顺序执行:

kubectl apply -f 03-vspheremachineconfigpool-worker.yaml
kubectl apply -f 30-workers-md-0.yaml

注意: 如果 MachineDeployment.spec.replicas 大于 VSphereMachineConfigPool.spec.configs[] 中可用 slot 的数量,则无法正确分配新的 worker 节点。

部署更新后的 worker 节点配置

当你需要更改 worker VM 规格时,请创建一个新的 VSphereMachineTemplate 并更新 MachineDeployment 以引用它。这会触发滚动更新,用新的配置替换 worker 节点。

WARNING

模板不可变

VSphereMachineTemplate 资源不能原地修改。你必须创建一个新名称的模板,并更新 MachineDeployment 中的引用。更多信息请参阅 Cluster API 文档

常见变更包括:

  • VM 模板名称 (spec.template.spec.template)
  • CPU 或内存规格 (numCPUs, memoryMiB)
  • 系统磁盘或数据磁盘布局 (diskGiB, dataDisks)
  1. 导出现有模板

    kubectl get vspheremachinetemplate <cluster_name>-worker -n <namespace> -o yaml > new-worker-template.yaml
  2. 修改模板

    编辑 new-worker-template.yaml

    • metadata.name 设置为一个新的唯一名称(例如,<cluster_name>-worker-v2
    • 更新所需的规范字段
    • 删除服务器生成的字段:metadata.resourceVersionmetadata.uidmetadata.generationmetadata.creationTimestampmetadata.managedFieldsmetadata.annotations["kubectl.kubernetes.io/last-applied-configuration"]status
  3. 应用新模板

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

    kubectl patch machinedeployment <cluster_name>-md-0 -n <namespace> \
      --type='merge' -p='{
        "spec": {
          "template": {
            "spec": {
              "infrastructureRef": {
                "name": "<new-template-name>"
              }
            }
          }
        }
      }'

    如果你还需要更改 bootstrap 设置,请参见下方的 更新 Bootstrap 模板

  5. 监控滚动更新

    kubectl -n <namespace> get machinedeployment <cluster_name>-md-0 -w
    kubectl -n <namespace> get machine
TIP

回滚失败的更新

如果滚动更新失败(例如,新 VM 启动失败),请将 MachineDeployment 的引用恢复为之前的模板名称。旧模板仍然存在,Cluster API 会回滚到该模板。

验证 worker 节点状态

运行以下命令,验证 management-cluster 和 workload-cluster 的状态:

kubectl -n <namespace> get machinedeployment,machine,vspheremachine,vspherevm
kubectl --kubeconfig=/tmp/<cluster_name>.kubeconfig get nodes -o wide

确认以下结果:

  • 已达到目标 worker replica 数量。
  • 每个新的 worker 节点都已加入集群。
  • 节点最终变为 Ready

更新 Bootstrap 模板

KubeadmConfigTemplate 资源同样是不可变的。对现有模板的修改不会触发已有机器的滚动更新。要更新 bootstrap 配置,请创建一个新模板,并更新 MachineDeployment 中的引用。

  1. 导出现有模板

    kubectl get kubeadmconfigtemplate <cluster_name>-worker-bootstrap -n <namespace> -o yaml > new-bootstrap-template.yaml
  2. 修改模板

    编辑 new-bootstrap-template.yaml

    • metadata.name 设置为一个新的唯一名称(例如,<cluster_name>-worker-bootstrap-v2
    • 更新所需的 bootstrap 配置字段
    • 删除在 部署更新后的 worker 节点配置 第 2 步中列出的相同服务器生成字段
  3. 应用新模板

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

    kubectl patch machinedeployment <cluster_name>-md-0 -n <namespace> \
      --type='merge' -p='{
        "spec": {
          "template": {
            "spec": {
              "bootstrap": {
                "configRef": {
                  "name": "<new-bootstrap-template-name>"
                }
              }
            }
          }
        }
      }'

    Cluster API 控制器会触发滚动更新。在机器被替换之前,现有机器会继续使用旧的 bootstrap 配置。

INFO

要升级 Kubernetes 版本? 请参阅 升级 VMware vSphere 上的集群,了解完整的控制平面和 worker 升级流程。

故障排除

当 worker 节点管理失败时,先执行以下检查:

  • 检查 VSphereMachineMachineConfigPoolReady 的条件。如果为 False,原因会说明 slot 分配失败的原因:
    • PoolBoundToOtherConsumer:该 pool 已绑定到其他 KubeadmControlPlaneMachineDeployment
    • NoAvailableSlots:没有 slot 匹配所需的 datacenter 或 failure domain。
  • 验证 worker machine config pool 仍然有可用 slot。
  • 验证 worker IP 地址、网关和 DNS 设置正确。
  • 验证 worker VM 模板仍然满足所需的 Kubernetes 版本和 guest-tools 要求。
  • 当节点正在等待分配 IP 时,检查 VSphereVM.status.addresses

后续步骤

如果你需要更改 worker 网络、放置位置或磁盘拓扑,请继续阅读 扩展 VMware vSphere 集群部署