调整用户集群的大小

本页面介绍如何调整 GKE On-Prem 用户集群的大小。调整用户集群的大小意味着在该集群中添加节点或者从中移除节点。从集群中移除节点会释放该集群的 IP 地址,以供其他节点使用。如果添加节点,则需要有可用于这些节点的 IP 地址。

您可以通过更改集群的 MachineDeployment 配置的 replicas 字段来调整用户集群的大小。您可以从命令行使用 kubectl patch 修补配置。

如需了解用户集群数量的上限和下限,请参阅配额和限制

验证是否有足够的可用 IP 地址

若要向集群添加其他节点,请确保集群具有足够的 IP 地址。是否确认有足够的 IP 地址取决于集群使用的是 DHCP 服务器还是静态 IP。

DHCP

如果集群使用 DHCP,请检查创建节点所在网络中的 DHCP 服务器是否具有足够的 IP 地址。IP 地址应该多于用户集群中运行的节点。

静态 IP

如果集群使用静态 IP,请检查您是否在集群中分配了足够的 IP 地址:

kubectl get cluster --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] \
-n [USER_CLUSTER_NAME] [USER_CLUSTER_NAME] -o yaml

其中:

  • [ADMIN_CLUSTER_KUBECONFIG] 告知 kubectl 使用管理员集群的 kubeconfig,后者用于查看和/或更改用户集群配置。
  • -n [USER_CLUSTER_NAME] 告知 kubectl 查找以用户集群命名的命名空间。
  • [USER_CLUSTER_NAME] -o yaml 告知 kubectl 您要对哪个用户集群运行命令。-o yaml 显示用户集群的配置。

在命令的输出中,查找 reservedAddresses 字段。字段中的 IP 地址应该多于用户集群中运行的节点。

如果您需要向 reservedAddresses 字段添加更多地址,请执行以下步骤:

  1. 打开用户集群的 Cluster 资源以进行修改:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] edit cluster [USER_CLUSTER_NAME] \
    -n [USER_CLUSTER_NAME]
    

    Cluster 配置会在 shell 的默认编辑器中打开。

  2. 根据需要添加任意数量的静态 IP 地址块。IP 地址块由 gatewayhostnameipnetmask 字段组成。

以下是一个示例 reservedAddresses 字段,其中突出显示了四个静态 IP 块:

...
networkSpec:
  dns:
  - 172.x.x.x
  ntp: 129.x.x.x
  reservedAddresses:
  - gateway: 100.x.x.x
    hostname: host-1
    ip: 100.x.x.x
    netmask: x
  - gateway: 100.x.x.x
    hostname: host-2
    ip: 100.x.x.x
    netmask: x
  - gateway: 100.x.x.x
    hostname: host-3
    ip: 100.x.x.x
    netmask: x
  - gateway: 100.x.x.x
    hostname: host-4
    ip: 100.x.x.x
    netmask: x
...

准备工作

导出 KUBECONFIG 环境变量,此变量指向您要调整其大小的用户集群的 kubeconfig:

export KUBECONFIG=[USER_CLUSTER_KUBECONFIG]

调整用户集群的大小

您可以通过修改用户集群的 MachineDeployment 资源来调整集群的大小。如需查找用户集群的 MachineDeployment 资源的名称,请运行以下命令:

kubectl get machinedeployments

用户集群的 MachineDeployment 包含用户集群的名称。

如需调整用户集群的大小,您需要修补集群的 MachineDeployment 配置。您可以更改配置的 replicas 字段的值,此值指示集群应运行的节点数:

kubectl patch machinedeployment [MACHINE_DEPLOYMENT_NAME] -p "{\"spec\": {\"replicas\": [INT] }}" --type=merge

其中,[INT] 是您希望用户集群运行的节点数。

验证调整大小

如需验证调整大小是否成功,请运行:

kubectl get nodes
kubectl describe machinedeployments [MACHINE_DEPLOYMENT_NAME] | grep Replicas

您选择的节点数应反映在这些命令的输出中。

问题排查

如需了解详情,请参阅问题排查

无法调整用户集群的大小

表现

对用户集群执行的调整大小操作失败。

潜在原因

有几个因素可能会导致调整大小操作失败。

解决方法

如果调整大小失败,请按以下步骤操作:

  1. 检查集群的 MachineDeployment 状态,看看是否有任何事件或错误消息:

    kubectl describe machinedeployments [MACHINE_DEPLOYMENT_NAME]
  2. 检查新创建的 Machine 上是否存在错误:

    kubectl describe machine [MACHINE_NAME]

错误:“无法分配任何地址”

表现

调整用户集群的大小后,kubectl describe machine [MACHINE_NAME] 会显示以下错误:

Events:
   Type     Reason  Age                From                    Message
   ----     ------  ----               ----                    -------
   Warning  Failed  9s (x13 over 56s)  machineipam-controller  ipam: no addresses can be allocated
   
潜在原因

可用于用户集群的 IP 地址不足。

解决方法

为集群分配更多 IP 地址。然后,删除受影响的 Machine:

kubectl delete machine [MACHINE_NAME]

如果集群已正确配置,则会使用 IP 地址创建替换 Machine。

已分配足够数量的 IP 地址,但 Machine 无法向集群注册

表现

网络分配了足够的地址,但 Machine 仍然无法向用户集群注册。

可能的原因

可能存在 IP 冲突。该 IP 可能被其他 Machine 或您的负载平衡器占用。

解决方法

确认受影响的 Machine 的 IP 地址未被占用。如果存在冲突,则需要解决您的环境中的冲突。

新节点已创建,但运行状况不佳

表现

在使用手动负载平衡模式时,新节点不会自行向用户集群控制层面注册。

可能的原因

可能启用了节点内 Ingress 验证,导致节点的启动流程被阻止。

解决方法

如需停用验证,请运行以下命令:

kubectl patch machinedeployment [MACHINE_DEPLOYMENT_NAME] -p '{"spec":{"template":{"spec":{"providerSpec":{"value":{"machineVariables":{"net_validation_ports": null}}}}}}}' --type=merge

使用 gkectl 诊断集群问题

使用 gkectl diagnose 命令识别集群问题并与 Google 共享集群信息。请参阅诊断集群问题

以 verbose 模式运行 gkectl 命令

-v5

gkectl 错误记录到 stderr

--alsologtostderr

在管理员工作站中查找 gkectl 日志

即使未传入其调试标志,您也可以在以下管理员工作站目录中查看 gkectl 日志:

/home/ubuntu/.config/gke-on-prem/logs

在管理员集群中查找 Cluster API 日志

如果虚拟机在管理员控制层面启动后无法启动,您可以通过在管理员集群中检查 Cluster API 控制器的日志来尝试进行调试:

  1. kube-system 命名空间中找到 Cluster API 控制器 pod 的名称,其中 [ADMIN_CLUSTER_KUBECONFIG] 是管理员集群的 kubeconfig 文件的路径:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] -n kube-system get pods | grep clusterapi-controllers
  2. 打开 pod 的日志,其中 [POD_NAME] 是 pod 的名称。您可以选择使用 grep 或类似工具来搜索错误:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] -n kube-system logs [POD_NAME] vsphere-controller-manager