调整用户集群的大小

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

您可以通过以下方式调整用户集群的大小:更改配置文件的 nodePools 部分中的 replicas 字段,然后使用 gkectl update cluster 命令将这些更改部署到现有集群。

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

如需了解如何使用 gkectl update cluster 管理节点池,请参阅创建和管理节点池

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

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

DHCP

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

静态 IP 地址

如果集群使用静态 IP 地址,则运行 gkectl update cluster 时,系统会首先验证您是否在该集群中分配了足够的 IP 地址。如果没有分配足够的 IP 地址,您可以在错误消息中找到更新操作所需的额外 IP 地址数量。

如果您需要向用户集群添加更多 IP 地址,请执行以下步骤:

  1. 打开用户集群的 hostconfig 文件以进行修改。

  2. 要查看为用户集群预留的地址,请运行以下命令:

    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 显示用户集群的配置。
  1. 如果为用户集群预留的任何地址包含在 hostconfig 文件中,请基于 netmaskgateway 将地址添加到相应的块中。

  2. 将所需数量的额外静态 IP 地址添加到相应的块中,然后运行 gkectl update cluster

下面是一个示例 hostconfig 文件,其中突出显示了 4 个静态 IP 地址块:

hostconfig:
  dns: 172.16.255.1
  tod: 216.239.35.0
blocks:
- netmask: 255.255.248.0
  gateway: 21.0.135.254
  ips:
    - ip: 21.0.133.41
      hostname: user-node-1
    - ip: 21.0.133.50
      hostname: user-node-2
    - ip: 21.0.133.56
      hostname: user-node-3
    - ip: 21.0.133.47
      hostname: user-node-4

调整用户集群的大小

从 1.5.0 开始,您可以通过以下方式调整集群的大小:更改配置文件的 nodePools 部分中的 replicas 字段,然后使用 gkectl update cluster 命令将这些更改部署到现有集群。

验证调整大小

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

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get nodes
kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] describe machinedeployments [NODE_POOL_NAME] | grep Replicas

其中,[USER_CLUSTER_KUBECONFIG] 是您的用户集群的 kubeconfig 文件。您选择的节点数应反映在这些命令的输出中。

问题排查

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

无法调整用户集群的大小

表现

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

潜在原因

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

解决方法

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

  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 地址未被占用。如果存在冲突,则需要解决您的环境中的冲突。

使用 gkectl 诊断集群问题

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

默认日志记录行为

对于 gkectlgkeadm,使用默认日志记录设置便已足够:

  • 默认情况下,日志条目的保存方式如下:

    • 对于 gkectl,默认日志文件为 /home/ubuntu/.config/gke-on-prem/logs/gkectl-$(date).log,该文件与运行 gkectl 的本地目录中的 logs/gkectl-$(date).log 文件进行符号链接。
    • 对于 gkeadm,默认日志文件是运行 gkeadm 的本地目录中的 logs/gkeadm-$(date).log
  • 所有日志条目都会保存在日志文件中,即使它们不输出到终端(当 --alsologtostderrfalse 时)也是如此。
  • -v5 详细程度(默认)涵盖支持团队所需的所有日志条目。
  • 日志文件还包含已执行的命令和失败消息。

我们建议您在需要帮助时将日志文件发送给支持团队。

为日志文件指定非默认位置

要为 gkectl 日志文件指定非默认位置,请使用 --log_file 标志。您指定的日志文件不会与本地目录进行符号链接。

要为 gkeadm 日志文件指定非默认位置,请使用 --log_file 标志。

在管理员集群中查找 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

更新命令失败

运行 gkectl update 以更新集群时,您可能会看到以下错误消息:
Failed to update the cluster: failed to begin updating user cluster "CLUSTER_NAME": timed out waiting for the condition
如需进一步检查此错误消息,请运行以下命令:
kubectl get --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] onpremusercluster
如果您获得以下输出且更新已生效,则可忽略错误消息:
cluster [CLUSTER_NAME] is READY=true