如果您在安装或升级 GKE on Bare Metal 时遇到问题,可以查看本页面提供的问题排查信息。
引导集群问题
当 GKE on Bare Metal 创建或升级集群时,它会部署 Kubernetes in Docker (kind) 集群,以临时托管创建或升级集群所需的 Kubernetes 控制器。此暂时性集群称为引导集群。
如果 kind 集群在您尝试安装时已经存在于您的部署中,则 GKE on Bare Metal 会删除现有的 kind 集群。只有在安装或升级成功后,系统才会执行删除操作。如需在成功后保留现有的 kind 集群,请使用 bmctl
的 --keep-bootstrap-cluster
标志。
GKE on Bare Metal 在 WORKSPACE_DIR/.kindkubeconfig
下为引导集群创建配置文件。您只能在集群创建和升级期间连接到引导集群。
引导集群需要访问 Docker 代码库以拉取映像。除非您使用私有注册表,否则注册表默认为 Container Registry。在集群创建期间,bmctl
会创建以下文件:
bmctl-workspace/config.json
:包含注册表访问权限的 Google Cloud 服务账号凭据。凭据是从集群配置文件中的gcrKeyPath
字段获取的。bmctl-workspace/config.toml
:包含 kind 集群中的 containerd 配置。
调试引导集群
如需调试引导集群,您可以执行以下步骤:
- 在集群创建和升级期间连接到引导集群。
- 获取引导集群的日志。
您可以在用于运行 bmctl
的机器的以下文件夹中找到日志:
bmctl-workspace/CLUSTER_NAME/log/create-cluster-TIMESTAMP/bootstrap-cluster/
bmctl-workspace/CLUSTER_NAME/log/upgrade-cluster-TIMESTAMP/bootstrap-cluster/
将 CLUSTER_NAME
和 TIMESTAMP
替换为您的集群名称和相应系统的时间。
如需直接获取引导集群的日志,您可以在集群创建和升级期间运行以下命令:
docker exec -it bmctl-control-plane bash
该命令会在引导集群中运行的 bmctl 控制层面容器内打开一个终端。
要检查 kubelet
和 containerd
日志,请使用以下命令并查找输出中的错误或警告:
journalctl -u kubelet
journalctl -u containerd
集群升级问题
升级 GKE on Bare Metal 时,您可以监控进度并检查集群和节点的状态。以下指南可帮助您确定升级是继续正常进行还是出现问题。
监控升级进度
使用 kubectl describe cluster
命令查看集群在升级过程中的状态:
kubectl describe cluster CLUSTER_NAME \
--namespace CLUSTER_NAMESPACE \
--kubeconfig ADMIN_KUBECONFIG
替换以下值:
CLUSTER_NAME
:集群的名称。CLUSTER_NAMESPACE
:集群的命名空间。ADMIN_KUBECONFIG
:管理员 kubeconfig 文件。- 默认情况下,引导集群用于管理员、混合和独立集群升级。如需在使用引导集群时监控升级进度,请指定引导集群 kubeconfig 文件
.kindkubeconfig
的路径。此文件位于工作区目录中。
- 默认情况下,引导集群用于管理员、混合和独立集群升级。如需在使用引导集群时监控升级进度,请指定引导集群 kubeconfig 文件
查看输出的 Status
部分,该部分显示集群升级状态的汇总。如果集群报告错误,请使用以下部分进行问题排查。
检查节点是否已准备就绪
在升级过程中,使用 kubectl get nodes
命令查看集群中节点的状态:
kubectl get nodes --kubeconfig KUBECONFIG
如需检查节点是否成功完成升级,请查看命令响应中的 VERSION
和 AGE
列。VERSION
是集群的 Kubernetes 版本。如需查看给定 GKE on Bare Metal 版本的 Kubernetes 版本,请参阅版本支持政策中的表。
如果节点显示 NOT READY
,请尝试连接节点并检查 kubelet 状态:
systemctl status kubelet
您还可以查看 kubelet 日志:
journalctl -u kubelet
查看 kubelet 状态的输出和日志消息(指示节点出现问题的原因)。
检查当前正在升级的节点
如需检查集群中哪个节点当前正在升级,请使用 kubectl get baremetalmachines
命令:
kubectl get baremetalmachines --namespace CLUSTER_NAMESPACE \
--kubeconfig ADMIN_KUBECONFIG
替换以下值:
CLUSTER_NAMESPACE
:集群的命名空间。ADMIN_KUBECONFIG
:管理员 kubeconfig 文件。- 如果引导集群用于管理员、混合或独立升级,请指定引导集群 kubeconfig 文件 (
bmctl-workspace/.kindkubeconfig
)。
- 如果引导集群用于管理员、混合或独立升级,请指定引导集群 kubeconfig 文件 (
以下示例输出显示当前正在升级的节点的 ABM VERSION
与 DESIRED ABM VERSION
不同:
NAME CLUSTER READY INSTANCEID MACHINE ABM VERSION DESIRED ABM VERSION
10.200.0.2 cluster1 true baremetal://10.200.0.2 10.200.0.2 1.13.0 1.14.0
10.200.0.3 cluster1 true baremetal://10.200.0.3 10.200.0.3 1.13.0 1.13.0
检查当前正在排空的节点
在升级过程中,节点会排空 Pod,并且调度会停用,直到节点成功升级。如需查看哪些节点当前正在排空 Pod,请使用 kubectl get nodes
命令:
kubectl get nodes --kubeconfig USER_CLUSTER_KUBECONFIG | grep "SchedulingDisabled"
将 USER_CLUSTER_KUBECONFIG
替换为用户集群 kubeconfig 文件的路径。
使用 grep
过滤 STATUS
列,以仅显示报告 SchedulingDisabled
的节点。此状态表示节点正在排空。
您还可以检查管理员集群中的节点状态:
kubectl get baremetalmachines -n CLUSTER_NAMESPACE \
--kubeconfig ADMIN_KUBECONFIG
替换以下值:
CLUSTER_NAMESPACE
:集群的命名空间。ADMIN_KUBECONFIG
:管理员 kubeconfig 文件。- 如果引导集群用于管理员、混合或独立升级,请指定引导集群 kubeconfig 文件 (
bmctl-workspace/.kindkubeconfig
)。
- 如果引导集群用于管理员、混合或独立升级,请指定引导集群 kubeconfig 文件 (
排空的节点显示 MAINTENANCE
列下的状态。
检查节点长时间处于排空状态的原因
通过上一部分中的其中一种方法,使用 kubectl get nodes
命令识别正在排空的节点。使用 kubectl get
pods
命令并依据此节点名称进行过滤以查看其他详细信息:
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=NODE_NAME
将 NODE_NAME
替换为正在排空的节点的名称。输出会返回当前卡住或排空速度缓慢的 Pod 列表。如果节点上的排空过程时间超过 20 分钟,则即使 Pod 卡住,升级也会继续。