kubectl 问题排查

本文档旨在调查和诊断与 kubectl 相关的问题。如果你在使用 kubectl 或连接到集群时遇到问题,本文档概述了各种常见场景和潜在解决方案,以帮助确定并解决可能的原因。

开始之前

  • 你需要有一个 Kubernetes 集群。
  • 你还需要安装 kubectl - 参阅安装工具

验证 kubectl 设置

确保你已在本地机器上正确安装和配置了 kubectl。检查 kubectl 版本,确保它是最新的并且与你的集群兼容。

检查 kubectl 版本

kubectl version

你将看到类似如下的输出

Client Version: version.Info{Major:"1", Minor:"27", GitVersion:"v1.27.4",GitCommit:"fa3d7990104d7c1f16943a67f11b154b71f6a132", GitTreeState:"clean",BuildDate:"2023-07-19T12:20:54Z", GoVersion:"go1.20.6", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v5.0.1
Server Version: version.Info{Major:"1", Minor:"27", GitVersion:"v1.27.3",GitCommit:"25b4e43193bcda6c7328a6d147b1fb73a33f1598", GitTreeState:"clean",BuildDate:"2023-06-14T09:47:40Z", GoVersion:"go1.20.5", Compiler:"gc", Platform:"linux/amd64"}

如果你看到 Unable to connect to the server: dial tcp <server-ip>:8443: i/o timeout 而不是 Server Version,则需要排查 kubectl 与集群的连接问题。

请确保你已按照安装 kubectl 的官方文档安装了 kubectl,并正确配置了 $PATH 环境变量。

检查 kubeconfig

kubectl 需要 kubeconfig 文件来连接到 Kubernetes 集群。kubeconfig 文件通常位于 ~/.kube/config 目录下。请确保你拥有一个有效的 kubeconfig 文件。如果你没有 kubeconfig 文件,可以从你的 Kubernetes 管理员那里获取,或者从你的 Kubernetes 控制平面的 /etc/kubernetes/admin.conf 目录中复制。如果你的 Kubernetes 集群部署在云平台上并且丢失了 kubeconfig 文件,你可以使用云提供商的工具重新生成。有关重新生成 kubeconfig 文件的信息,请参考云提供商的文档。

检查 $KUBECONFIG 环境变量是否配置正确。你可以设置 $KUBECONFIG 环境变量或使用 kubectl 命令的 --kubeconfig 参数来指定 kubeconfig 文件所在的目录。

检查 VPN 连接

如果你使用虚拟专用网络 (VPN) 访问 Kubernetes 集群,请确保你的 VPN 连接处于活动且稳定状态。有时,VPN 断开连接可能导致与集群的连接问题。重新连接 VPN 并再次尝试访问集群。

身份认证与授权

如果你使用基于令牌的身份认证,并且 kubectl 返回关于认证令牌或认证服务器地址的错误,请验证 Kubernetes 认证令牌和认证服务器地址是否配置正确。

如果 kubectl 返回关于授权的错误,请确保你使用的是有效的用户凭据。并且你拥有访问所请求资源的权限。

验证上下文

Kubernetes 支持多个集群和上下文。确保你正在使用正确的上下文与你的集群交互。

列出可用上下文

kubectl config get-contexts

切换到适当的上下文

kubectl config use-context <context-name>

API 服务器与负载均衡器

kube-apiserver 服务器是 Kubernetes 集群的核心组件。如果 API 服务器或位于 API 服务器之前的负载均衡器无法访问或没有响应,你将无法与集群交互。

使用 ping 命令检查 API 服务器的主机是否可达。检查集群的网络连接和防火墙设置。如果你使用云提供商部署集群,请检查云提供商提供的集群 API 服务器健康检查状态。

检查负载均衡器(如果使用)的状态,确保其健康并正在将流量转发到 API 服务器。

TLS 问题

  • 需要额外工具 - base64openssl 3.0 版本或更高版本。

Kubernetes API 服务器默认只处理 HTTPS 请求。在这种情况下,TLS 问题可能由于各种原因发生,例如证书过期或信任链无效。

你可以在位于 ~/.kube/config 目录下的 kubeconfig 文件中找到 TLS 证书。certificate-authority 属性包含 CA 证书,client-certificate 属性包含客户端证书。

验证这些证书的有效期

kubectl config view --flatten --output 'jsonpath={.clusters[0].cluster.certificate-authority-data}' | base64 -d | openssl x509 -noout -dates

输出

notBefore=Feb 13 05:57:47 2024 GMT
notAfter=Feb 10 06:02:47 2034 GMT
kubectl config view --flatten --output 'jsonpath={.users[0].user.client-certificate-data}'| base64 -d | openssl x509 -noout -dates

输出

notBefore=Feb 13 05:57:47 2024 GMT
notAfter=Feb 12 06:02:50 2025 GMT

验证 kubectl 助手工具

一些 kubectl 认证助手工具提供了对 Kubernetes 集群的便捷访问。如果你使用过此类助手工具并面临连接问题,请确保必要的配置仍然存在。

检查 kubectl 配置中的认证详情

kubectl config view

如果你之前使用过助手工具(例如 kubectl-oidc-login),请确保它仍然正确安装和配置。

最后修改于 太平洋标准时间 2024 年 4 月 21 日下午 2:37:更新 troubleshoot-kubectl.md (6ea106744e)