排查 Huawei Cloud Stack 业务集群

本指南介绍通过 Cluster API 管理的 Huawei Cloud Stack(HCS)业务集群所特有的排查模式。

如果你的集群已达到 Cluster.status.phase = Provisioned,但导入流程未完成,并且由于缺少 CNI,业务节点一直处于 NotReady,请先参阅与提供程序无关的指南 排查卡在 Provisioned 的业务集群。该指南涵盖了适用于所有 Immutable Infrastructure provider 的通用诊断流程(global cluster import controller、sentry ServiceAccount、clusters.platform.tkestack.io 不变量)。

如果你已经完成了通用流程,并且还出现了下面的症状,请查看本页中 HCS 特有的模式。

模式:由于主机名错误,kubeadm init 一直未完成

同时满足以下所有症状:

  • Cluster.status.phase=ProvisionedHCSCluster.status.ready=true,ELB 已启动。
  • HCSMachine.status.instanceState=ACTIVE 且已填充 InternalIP,但 Machine.status.nodeRef 始终不会设置。
  • 超过通常约 5 到 10 分钟的初始化窗口后,KubeadmControlPlane.status.initialized 仍为空,并且 status.readyReplicas=0
  • cpaas-system 中的 cluster-api-provider-hcs 控制器日志会反复打印针对控制平面 ELB VIP 6443 端口的 connect: connection refused
  • 为该节点选择的 HCSMachineConfigPool.spec.configs[].hostname 值包含一个点(FQDN 风格,例如 master-1.example.org)。

cluster-api-provider-hcs 早于 v1.0.1 的版本中,带点的 HCSMachineConfigPool.spec.configs[].hostname 会在 cloud-init 中被渲染为 hostname 字段里的完整 FQDN 字符串,并设置 prefer_fqdn_over_hostname: true。最终生成的节点具有一个包含点的 POSIX 主机名,而 kubeadm init 无法处理这种主机名,因此 kube-apiserver 始终不会启动。

诊断

如果你可以访问该节点(通过 HCS 控制台、跳板机或集群内调试 Pod):

# On the affected node
hostname
hostname -f
cat /etc/hosts
sudo cat /var/lib/cloud/instance/user-data.txt | head -40
sudo journalctl -u cloud-init -b 0 | grep -E "hostname|fqdn|update_etc_hosts"

表明你遇到此模式的指标:

  • hostname 返回的是完整的带点字符串,而不是短名称。
  • hostname -f 返回 Name or service not knownTemporary failure in name resolution
  • /etc/hosts 包含形如 <node-ip> <fqdn> <short> 的行。
  • 节点上的 cloud-init user-data 显示 prefer_fqdn_over_hostname: true,并且未设置 manage_etc_hosts

缓解

cluster-api-provider-hcs 插件升级到 v1.0.1 或更高版本,然后对受影响的控制平面和工作节点执行滚动替换,以便新的 cloud-init 在新启动的 VM 上运行。具体步骤已记录在 在现有 HCS 集群上配置 FQDN 主机名 中。

对现有不可变 OS 节点手动修改 /etc/hostname/etc/hosts 不会持久生效:cloud-init 会在每次启动时重新生成这些文件,包括由 transactional-update、OS 补丁更新或 systemctl reboot 触发的重启。滚动替换是支持的迁移路径。

预防

如果在已安装 cluster-api-provider-hcs v1.0.1 或更高版本的情况下重新执行集群创建,就可以完全避免该模式。针对 HCS 的新 manifest 在 HCSMachineConfigPool 中选择带点主机名或短主机名时,应遵循集群创建页中的 节点上的主机名行为

相关内容