跳至内容

故障排除 kOps 集群

调试 kOps 集群的第一步是运行 kops validate cluster --name <clustername> --wait 10m。如果集群在此期间没有验证,则说明出现问题。

控制平面

如果上述命令抱怨 API 服务器不可用,则表示控制平面工作不正常。为了进一步诊断,您需要登录到控制平面节点之一。

运行 kops get instances (1.19+) 或查看 AWS 控制台以识别具有主角色的节点。然后 ssh 到列出的 IP 地址。

控制平面上的日志位于 /var/log。假设日志位于那里,除非另有说明。

Nodeup

Nodeup 是负责节点初始配置的过程。这是一个一次性 systemd 服务,称为 kops-configuration.service。您可以通过运行 journalctl -u kops-configuration.service 查看此服务的日志。

如果成功,您应该能够看到以下日志条目

nodeup[X]: success
systemd[1]: kops-configuration.service: Succeeded.
systemd[1]: Finished Run kops bootstrap (nodeup).

请注意,如果节点在一段时间前启动,则此单元的日志可能为空。

如果 nodeup 退出时出现错误或一直循环执行无法继续的任务,则集群很可能配置错误。希望错误消息能提供足够的线索进行进一步调查。

无论如何,我们希望您能提交一个 GitHub 问题,因为我们努力避免集群在 nodeup 过程中出现问题。

API 服务器

如果 nodeup 成功,核心 kube 容器应该已经启动。在 kube-apiserver.log 中查找 API 服务器日志。

通常问题很明显,例如传递了不正确的 CLI 标志。

etcd 恢复后 API 服务器挂起

调整 etcd 集群大小或恢复备份后,kubernetes API 可能包含太多端点。您可以通过运行 kubectl get endpoints -n default kubernetes 来确认这一点。此命令应该列出与控制平面节点数量完全相同的 IP 地址。

有关此问题的更多详细信息,请查看备份和恢复文档

etcd

API 服务器使用两个 etcd 服务器,主服务器和事件服务器。

API 服务器无法正常工作的一个更常见的原因是 etcd 不可用。如果您看到到端口 4001 或 4002 的连接错误,则表示主服务器和/或事件服务器分别不可用。

etcd 集群由 etcd-manager 管理,最有可能的是 etcd-manager 出现了问题,而不是 etcd 本身。etcd 的日志通过 etcd-manager 传递,因此您可以在 etcd.logetcd-events.log 中找到两个日志。由于 etcd-manager 和 etcd 都是基于仲裁的集群,因此这些文件中可能存在一些误导性的错误,这些错误可能表明 etcd 已损坏,而实际上是 etcd-manager 出现了问题。

DNS

故障排除 Kubernetes DNS 可能需要一整本书。Kubernetes 文档中有一篇关于如何调试 DNS 的相当不错的文章

值得一提的是,DNS 故障通常是 Pod 网络故障的症状。因此,您可能需要确保两个 Pod 可以使用 IP 地址相互通信,然后再开始调试 DNS。

CNI

/opt/cni/bin 中缺少文件

空目录

如果 CNI bin 目录完全为空,则可能是 nodeup 工作不正常的症状。有关 nodeup 故障排除的更多信息,请参见上面的内容。在大多数情况下,nodeup 会将最常见的 CNI 插件写入该目录,因此它应该很少完全为空。

缺少 CNI 插件文件

如果目录存在,但缺少 CNI 插件和配置,则表示负责写入这些文件的进程工作不正常。在大多数情况下,这是一个在 kube-system 中运行的 DaemonSet

在此,值得重复的是,控制平面将在没有 CNI 的情况下工作。大多数控制平面节点不使用 Pod 网络,而是使用主机的网络进行通信。如果您无法与 API 服务器通话,例如运行 kubectl get nodes,则问题不在于 CNI。

如果 API 正在工作,并且 CNI 是通过 DaemonSet 安装的,请检查 Pod 是否正在运行。如果预期存在 Pod,但不存在,则可能是安装 CNI 附加组件时出现了问题。kOps 会定期尝试安装附加组件,因此在控制平面节点上运行 journalctl -f 以发现任何错误。