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)