排查集群创建和升级问题

本页面介绍了如何调查 Anthos clusters on VMware (GKE On-Prem) 中与集群创建、升级和调整大小有关的问题。

gkectlgkeadm 的默认日志记录行为

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

  • 对于 gkectl,默认日志文件为 /home/ubuntu/.config/gke-on-prem/logs/gkectl-$(date).log,该文件会与运行 gkectl 的本地目录中的 logs/gkectl-$(date).log 文件进行符号链接。

  • 对于 gkeadm,默认日志文件是运行 gkeadm 的本地目录中的 logs/gkeadm-$(date).log

  • 默认 -v5 详细程度涵盖支持团队所需的所有日志条目。

  • 日志文件会包含已执行的命令和失败消息。

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

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

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

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

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

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

  1. 找到 Cluster API 控制器 Pod 的名称:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG --namespace kube-system \
        get pods | grep clusterapi-controllers
    
  2. 查看 vsphere-controller-manager 的日志。首先指定 Pod,但不指定容器:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG --namespace kube-system \
        logs POD_NAME
    

    输出结果表明您必须指定容器,并且为您提供了 Pod 中的容器的名称。例如:

    ... a container name must be specified ...,
    choose one of: [clusterapi-controller-manager vsphere-controller-manager rbac-proxy]
    

    选择一个容器并查看其日志:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG --namespace kube-system \
        logs POD_NAME --container CONTAINER_NAME
    

使用 govc 解决与 vSphere 相关的问题

您可以使用 govc 调查与 vSphere 相关的问题。例如,您可以确认 vCenter 用户帐号的权限和访问权限,并且可以收集 vSphere 日志。

使用引导集群的日志进行调试

在安装期间,Anthos clusters on VMware 会创建临时引导集群。成功安装后,Anthos clusters on VMware 会删除引导集群,保留您的管理员集群和用户集群。通常情况下,您应该无需与引导集群进行交互。

如果将 --cleanup-external-cliuster=false 传递给 gkectl create cluster,则引导集集群群不会被删除,您可以使用引导集群日志来调试安装问题。

  1. 找到在 kube-system 命名空间中运行的 Pod 的名称:

    kubectl --kubeconfig /home/ubuntu/.kube/kind-config-gkectl get pods -n kube-system
    
  2. 查看 Pod 的日志:

    kubectl --kubeconfig /home/ubuntu/.kube/kind-config-gkectl -n kube-system get logs POD_NAME
    

使用内部 kubeconfig 文件调试 F5 BIG-IP 问题

安装完成后,Anthos clusters on VMware 会在管理员工作站的主目录中生成一个名为 internal-cluster-kubeconfig-debug 的 kubeconfig 文件。此 kubeconfig 文件与管理员集群的 kubeconfig 文件完全相同,只是它直接指向管理员集群的控制层面节点(Kubernetes API 服务器在该节点上运行)。您可以使用 internal-cluster-kubeconfig-debug 文件调试 F5 BIG-IP 问题。

无法调整用户集群的大小

如果调整用户集群的大小失败,请执行以下操作:

  1. 找到 MachineDeployments 和 Machines 的名称:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get machinedeployments --all-namespaces
    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get machines --all-namespaces
    
  2. 描述 MachineDeployment 以查看其日志:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG describe machinedeployment MACHINE_DEPLOYMENT_NAME
  3. 检查新创建的机器中是否存在错误:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG describe machine MACHINE_NAME

无法为调整集群大小分配地址

如果没有足够可用的 IP 地址来调整用户集群大小,则会出现此问题。

kubectl describe machine 会显示以下错误:

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

如需解决此问题,请为集群分配更多 IP 地址。然后,删除受影响的 Machine:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete machine MACHINE_NAME

Anthos clusters on VMware 会创建一个新机器,并为其分配一个新的可用 IP 地址。

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

如果存在 IP 地址冲突,就可能会发生此问题。例如,您为机器指定的 IP 地址被用于负载平衡器。

如需解决此问题,请更新您的集群 IP 地址块文件,这样,机器地址就不会与集群配置文件Seesaw IP 地址块文件中指定的地址冲突。

快照会在管理员集群创建或升级失败时自动创建

如果您尝试创建或升级管理员集群,并且该操作失败,则 Anthos Clusters on VMware 会获取引导集群的外部快照,而引导集群是一个用于创建或升级管理员集群的暂时性集群。虽然引导集群的此快照与在管理员集群上运行 gkectl diagnose snapshot 命令截取的快照类似,但它会自动触发。该引导集群的快照包含对管理员集群创建和升级过程的重要调试信息。如果需要,您可以向 Google Cloud 支持团队提供此快照

健康检查会在集群升级失败时自动运行

如果您尝试升级管理员集群或用户集群,并且此操作失败,则 Anthos clusters on VMware 会自动在该集群上运行 gkectl diagnose cluster 命令

如需跳过自动诊断,请将 --skip-diagnose-cluster 标志传递给 gkectl upgrade

升级过程卡住

Anthos Clusters on VMware 在升级期间在后台使用 Kubernetes drain 命令。此 drain 过程可能会被一项部署阻止,该部署只有一个副本,且副本中包含通过 minAvailable: 1 为其创建的 PodDisruptionBudget (PDB)。

在这种情况下,请保存 PDB 并从集群中移除,然后再尝试升级。在升级完成后,您可以重新加回此 PDB。

重新创建缺失的用户集群 kubeconfig 文件

在以下情况下,您可能需要重新创建用户集群 kubeconfig 文件:

  • 您尝试创建用户集群但创建操作失败,而您希望拥有其用户集群 kubeconfig 文件。
  • 用户集群 kubeconfig 文件缺失,例如在删除后。

请运行以下命令以重新创建用户集群 kubeconfig 文件:

KUBECONFIG_SECRET_NAME=$(kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get secrets -n USER_CLUSTER_NAME | grep admin-kubeconfig | cut -d' ' -f1)

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get secrets -n USER_CLUSTER_NAME $KUBECONFIG_SECRET_NAME \
  -o jsonpath='{.data.kubeconfig\.conf}' | base64 -d | sed -r "s/kube-apiserver.*local\./USER_CLUSTER_VIP/" > new_user_kubeconfig

替换以下内容:

  • USER_CLUSTER_VIP:用户主 VIP 值。
  • USER_CLUSTER_NAME:用户集群名称。
  • ADMIN_CLUSTER_KUBECONFIG:管理员集群的 kubeconfig 文件的路径。