Kubernetes 彻底改变了容器编排,简化了应用程序的管理和扩展。然而,与任何复杂系统一样,Kubernetes 集群也会遇到问题,需要及时解决才能保持最佳性能和可靠性。在本文中,我们将深入探讨必要的 kubectl 命令,这些命令是诊断和排除 Kubernetes 集群问题不可或缺的工具。无论您是新手还是经验丰富的 Kubernetes 用户,掌握这些命令都将使您有能力驾驭错综复杂的容器编排,确保应用程序的健康。

查看集群记录报告

排除 Kubernetes 集群故障的第一步是检查其中发生的事件。kubectl get events --all-namespaces 命令能全面查看所有命名空间的事件,让您发现与 pod、节点和其他资源相关的错误、警告和问题。

NAMESPACE   LAST SEEN   TYPE      REASON              OBJECT                   MESSAGE
default 5m Normal Scheduled pod/my-pod Successfully assigned default/my-pod to node-1
default 4m Normal Pulling pod/my-pod Pulling image "my-image:latest"
default 4m Normal Pulled pod/my-pod Successfully pulled image "my-image:latest"
default 4m Normal Created pod/my-pod Created container my-container
default 4m Normal Started pod/my-pod Started container my-container
kube-system 15m Normal RegisteredNode node/node-1 Node node-1 event: Registered Node node-1 in Controller
...

下面是输出结果中各列的细目:

  • NAMESPACE:事件发生的命名空间。
  • LAST SEEN:事件最后一次出现的时间。
  • TYPE:类型:事件类型(如 Normal 或 Warning)。
  • REASON:事件发生的原因。
  • OBJECT:与事件相关的 Kubernetes 资源(如 pod、节点)。
  • MESSAGE:与事件相关的描述或消息。

排除 pod 初始化故障

假设您遇到了 pod 无法正确初始化的问题。您可以使用 kubectl get events --all-namespaces 来识别与 pod 初始化失败相关的事件,帮助您找出根本原因。

检查 pod 日志

当出现应用程序级问题时,检查 pod 日志至关重要。使用 kubectl logs <pod-name> -n <namespace> 查看给定命名空间中特定 pod 的日志。该命令对于识别应用程序代码中的错误、异常或问题非常有用。

kubectl logs my-pod -n my-namespace

在这个例子中:

  • my-pod 是要从中获取日志的 pod 的名称。
  • my-namespace 是 pod 所在的命名空间。

调试应用程序错误

想象一下,在 my-namespace 中名为 my-pod 的 pod 中运行着一个应用程序。如果应用程序报错,您可以使用 kubectl logs 检索特定的错误信息,从而帮助调试和解决问题。

描述资源

kubectl describe 命令提供有关各种 Kubernetes 资源(如 pod、节点和部署)的详细信息。通过运行 kubectl describe <resource> <resource-name> -n <namespace>,您可以访问大量数据,包括事件、条件和配置详情,帮助您找出问题的根源。

kubectl describe pod my-pod -n my-namespace

在这个例子中:

  • pod 是资源类型。
  • my-pod 是要描述的特定 pod 的名称。
  • my-namespace是 pod 所在的命名空间。

运行此命令后,将显示指定 pod 的详细信息。输出将包括有关 pod 的元数据、条件、事件等信息的不同部分。下面是输出结果的示例:

Name:         my-pod
Namespace: my-namespace
...
Containers:
my-container:
Container ID: container-id
Image: my-image:latest
...
Conditions:
Type Status
---- ------
Initialized True
Ready True
ContainersReady True
PodScheduled True
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 3m default-scheduler Successfully assigned my-namespace/my-pod to node-1
Normal Pulled 2m kubelet, node-1 Container image "my-image:latest" already present on machine
Normal Created 2m kubelet, node-1 Created container my-container
Normal Started 2m kubelet, node-1 Started container my-container
...

输出将包含指定 pod 的详细信息,包括其元数据、容器信息、条件和事件。这些信息对于排除 pod 的故障会非常有用,比如初始化问题、就绪问题或与其生命周期相关的事件。

获取 pod 信息

命令:

kubectl get pods -n <namespace>

说明

kubectl get pods 命令用于检索 Kubernetes 集群中运行的 pod 的信息。

-n <namespace> 指定要列出 pod 的命名空间。请将 <namespace> 替换为您感兴趣的实际命名空间名称。

示例

假设您有一个包含多个命名空间的 Kubernetes 集群,您想检查 my-namespace 命名空间中 pod 的状态。您可以使用以下命令:

kubectl get pods -n my-namespace

运行该命令时,输出结果可能如下:

NAME        READY   STATUS      RESTARTS   AGE
app-pod-1 1/1 Running 0 2d
app-pod-2 1/1 Running 0 1d
app-pod-3 0/1 Pending 0 1h
app-pod-4 1/1 Running 0 30m

检查节点状态

节点是 Kubernetes 集群的支柱。为确保一切运行顺利,可执行 kubectl get nodes 查看所有节点的状态。

kubectl get nodes

运行此命令后,您将看到集群中所有节点的列表及其当前状态。状态可以是以下其中之一:

  • Ready:这是理想状态。这意味着节点是健康的,可以接受和运行容器。
  • NotReady:这种状态表示节点无法正常运行,或者遇到了妨碍其运行容器的问题。处于这种状态的节点可能存在资源限制、网络问题或其他问题。
  • SchedulingDisabled:这种状态意味着节点被明确标记为不可调度,从而无法在其上调度新容器。这对于维护或故障排除很有用。
  • Unknown:在某些情况下,由于与 Kubernetes 控制平面的通信问题,节点的状态可能是未知的。

理想情况下,在一个健康的 Kubernetes 集群中,所有节点都应处于 "Ready"状态

示例

假设您运行 kubectl get nodes 并看到以下输出:

NAME       STATUS     ROLES    AGE   VERSION
node-1 Ready <none> 30d v1.21.3
node-2 Ready <none> 30d v1.21.3
node-3 NotReady <none> 5m v1.21.3

在容器中执行

有时,调试需要亲自动手。通过 kubectl exec,您可以使用 /bin/bash 以交互方式进入容器。当您需要在容器内调查问题时,这一点尤其有用。

示例

假设在命名空间 my-namespace 中有一个名为 my-pod 的 Kubernetes pod。在这个 pod 中,有一个名为 my-container 的容器。您怀疑这个容器中存在问题,并想进行交互式调查。

下面是使用 kubectl exec 的方法:

kubectl exec -it my-pod -n my-namespace -- /bin/bash

在该命令中:

  • -it 用于指定交互式终端,允许您与容器内的 shell 进行交互。
  • my-pod 是要访问的 pod 的名称。
  • -n my-namespace 指定 pod 所在的命名空间。
  • -- /bin/bash 指定要在容器内运行的命令。在本例中,它是 /bin/bash,用于启动 Bash shell。

运行命令后,您将进入容器的 shell。现在,您可以像登录到容器的操作系统一样,交互式地运行命令、检查文件、查看日志和排除故障。

下面是一个会话的案例:

root@my-pod:/app# ls
file1.txt file2.txt file3.txt
root@my-pod:/app# cat file1.txt
Contents of file1.txt
root@my-pod:/app# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 1234 567 ? Ss Sep01 0:01 /my-app
...
root@my-pod:/app# exit

完成调试或故障排除任务后,可以键入 exit 退出容器的 shell。这将返回本地终端。

使用 kubectl exec/bin/bash 是诊断和解决容器内问题的有力工具,在传统调试方法不充分的情况下尤为重要。

用于服务调试的端口转发

要调试 pod 内运行的服务,可以使用 kubectl port-forward 将本地端口转发到 pod 上的端口。这样就能像访问本地运行的服务一样访问这些服务,从而方便调试和测试。

示例

假设您在命名空间 my-namespace 中有一个名为 my-app-pod 的 Kubernetes pod,它在 8080 端口上托管了一个服务,您想访问该服务进行调试。

下面是使用 kubectl port-forward 将本地端口转发到 pod 端口的方法:

kubectl port-forward my-app-pod -n my-namespace 8080:8080

在该命令中:

  • my-app-pod 是要将流量转发到的 pod 的名称。
  • -n my-namespace 指定 pod 所在的名称空间。
  • 8080:8080 表示要将流量从本地计算机的 8080 端口转发到 pod 的 8080 端口。

建立端口转发后,您就可以通过连接本地计算机上的

http://localhost:8080 访问 pod 内运行的服务。向本地 8080 端口发出的任何请求都将被转发到 pod 上的相应端口。下面是一个案例:

Forwarding from 127.0.0.1:8080 -> 8080
Handling connection for 8080

现在,您可以打开网络浏览器,或使用 curlwget 等工具访问 pod 中的服务,就像它在本地运行一样:

curl http://localhost:8080

这样,您就可以直接检查服务并与之交互、测试 API 端点或调试问题,而无需将服务暴露在更广泛的网络中。完成端口转发后,可以在终端按下 Ctrl+C 停止端口转发。

使用 kubectl port-forward 是调试和测试 Kubernetes pod 中运行的服务的便捷方法,无需复杂的网络配置或将服务暴露在外部。

资源指标

kubectl top nodeskubectl top pods -n <namespace> 可实时了解 CPU 和内存的使用情况,帮助优化资源。

示例

假设您想监控 Kubernetes 集群中节点和 pod 的 CPU 和内存使用情况。

节点指标

要查看节点的资源使用指标,可以使用以下命令:

kubectl top nodes

下面是输出结果的例子:

NAME       CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
node-1 100m 5% 1234Mi 40%
node-2 80m 4% 987Mi 32%

在该输出中:

  • CPU(cores) 显示以毫核为单位的 CPU 使用率。
  • CPU% 表示 CPU 使用率的百分比。
  • MEMORY(bytes) 以兆字节为单位显示内存使用情况。
  • MEMORY% 表示内存使用百分比。

您可以快速识别 CPU 或内存负载较高的节点,并采取相应措施,如缩放或调整资源分配。

Pod 指标

要查看特定命名空间中 pod 的资源使用指标,请使用以下命令:

kubectl top pods -n my-namespace

my-namespace替换为运行 pod 的实际名称空间。下面是 pod 指标输出的示例:

NAME          CPU(cores)   MEMORY(bytes)
my-pod-1 50m 128Mi
my-pod-2 30m 64Mi
my-pod-3 70m 256Mi

在该输出中:

  • CPU(cores) 显示 pod 的 CPU 使用情况,单位为毫核。
  • MEMORY(bytes) 以字节为单位显示 pod 的内存使用情况。

通过监控 pod 指标,您可以识别资源密集型 pod,优化资源分配,并就 pod 的扩展或资源请求和限制做出明智的决策。

kubectl top 命令提供的资源使用指标对于确保 Kubernetes 集群中资源的有效使用、识别性能瓶颈以及优化应用程序的资源分配都很有价值。

检查 API 服务器健康状况

Kubernetes API 服务器对集群运行至关重要。使用 kubectl get --raw=/healthz 查询其健康状况端点,可以快速评估其健康状况。

在该输出中:

 kubectl get --raw=/healthz
ok

响应 “ok” 表示 API 服务器正常运行。

如果 API 服务器不健康或出现问题,您可能会收到错误信息或非 “ok” 响应,这可能表明存在需要调查和解决的问题。

验证版本

最后,确保 Kubernetes 客户端和服务器版本之间的兼容性至关重要。使用 kubectl version 获取两个版本的信息。

示例

要检查客户端和服务器版本,只需运行:

kubectl version

输出结果:

Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.3", ...
Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.3", ...

在该输出中:

  • Client Version 提供了本地 kubectl 客户端的相关信息。其中包括主版本、次版本和 GitVersion,后者指定了客户端的确切版本。
  • Server Version 提供 kubectl 客户端所连接的 Kubernetes API 服务器的信息。它包括服务器的主版本、次版本和 GitVersion。

确保客户端版本与服务器版本匹配或兼容。主要版本差异可能表示不兼容,应加以解决。一般建议客户端和服务器版本尽量保持一致,以避免出现兼容性问题。

检查版本与 kubectl version 的兼容性是确保 Kubernetes 环境稳定、运行良好的必要步骤。

结论

掌握 Kubernetes 故障排除是任何 Kubernetes 管理员或开发人员的一项重要技能。本文概述的 kubectl 命令是您诊断和解决集群问题的盟友。请记住,有效的故障排除通常需要结合使用这些命令以及对应用程序和基础架构的深入了解。此外,考虑实施 Prometheus 和 Grafana 等监控和可观察性解决方案,以主动发现和解决问题,确保 Kubernetes 集群的稳定性和性能。通过利用这些工具和技术,您可以自信地驾驭复杂的 Kubernetes 世界,并保持应用程序的平稳运行。

掌握 Kubernetes 故障排除技巧:kubectl命令的基本指南的更多相关文章

  1. kubernetes 故障排除、处理、预防

    kubernetes 故障排除.处理.预防 故障排除顺序和思路 第一步: 我们可以通过查看节点是否正常,一是保证 K8S API Server 是正常的,二是可以查看节点集群网络中是否存在节点异常.如 ...

  2. JVMTI 中间JNI系列功能,线程安全和故障排除技巧

    JVMTI 中间JNI系列功能,线程安全和故障排除技巧 jni functions 在使用 JVMTI 的过程中,有一大系列的函数是在 JVMTI 的文档中 没有提及的,但在实际使用却是很实用的. 这 ...

  3. kubernetes 实践二:kubectl命令使用

    这里记录kubernetes学习和使用过程中的内容. CentOS7 k8s-1.13 flanneld-0.10 docker-18.06 etcd-3.3 kubectl用法概述 kubectl是 ...

  4. K8S从入门到放弃系列-(4)kubernetes集群之kubectl命令行工具部署

    摘要:随着版本的不断迭代,k8s为了集群安全,集群中趋向采用TLS+RBAC的安全配置方式,所以我们在部署过程中,所有组件都需要证书,并启用RBAC认证. 我们这里采用二进制安装,下载解压后,把对应组 ...

  5. Kubernetes Deployment故障排除图解指南

     个人K8s还在学习中,相关博客还没有写,准备学第二遍再开始学,发现这篇文章挺好,先转载一下. 原创: 白明的赞赏账户 下面是一个示意图,可帮助你调试Kubernetes Deployment(你可以 ...

  6. 分步骤讲解Deployment故障排除

    背景假设 当你希望在Kubernetes中部署应用程序时,你通常会定义三个组件: 一个Deployment - 这是一份用于创建你的应用程序的Pod副本的"食谱": 一个Servi ...

  7. kubectl 命令详解

    使用kubectl来管理Kubernetes集群. kubectl命令的选项: 选项 作用 --alsologtostderr[=false] 同时输出日志到标准错误控制台和文件 --api-vers ...

  8. Kubernetes集群管理工具kubectl命令技巧大全

    一. kubectl概述 Kubectl是用于控制Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署. kubectl命令的语法如下 ...

  9. Kubernetes管理员手边必备的9个kubectl命令

    导语:将这9个关键的kubectl命令放在手边,它们可以帮您快速排除故障并管理Kubernetes集群. Kubernetes是当今基础架构的主导技术,这意味着系统管理员需要熟悉其管理.多年来,笔者一 ...

  10. [转帖] k8s kubectl 命令行技巧

    https://jimmysong.io/posts/kubectl-cheatsheet/ Kubectl Cheatsheet kubectl命令技巧大全Posted on November 3, ...

随机推荐

  1. 手撕Udp套接字|实现群聊通信|实现Windows & Linux通信交互

    ​ 专栏和Git地址 操作系统https://blog.csdn.net/yu_cblog/category_12165502.html?spm=1001.2014.3001.5482UdpSocke ...

  2. CentOS7环境下MySQL的主从配置

    CentOS7环境下MySQL的主从配置 一.什么叫主从复制 通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间.通俗点说就是select查询发送到从服务器,修改数据的语句 ...

  3. MySQL-分区表和分区介绍

    一.MySQL分区简介 1.数据库分区 MySQL是一种常用的关系型数据库管理系统,分区表是一种在MySQL数据库中处理大规模数据的最佳方案之一,其主要目的是为了在特定的SQL操作中减少数据读写的总量 ...

  4. 《Boosting Document-Level Relation Extraction by Mining and Injecting Logical Rules》论文阅读笔记

    代码 原文地址 摘要 文档级关系抽取(DocRE)旨在从文档中抽取出所有实体对的关系.DocRE 面临的一个主要难题是实体对关系之间的复杂依赖性.与大部分隐式地学习强大表示的现有方法不同,最新的 Lo ...

  5. 提高Java开发生产力,我选Stream API,真香啊

    Java 8 引入的Stream API提供了一种新的数据处理方式,它以声明式.函数式的编程模型,极大地简化了对集合.数组或其他支持数据源的操作.Stream可以被看作是一系列元素的流水线.允许你高效 ...

  6. NC16645 [NOIP2007]矩阵取数游戏

    题目链接 题目 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵 ...

  7. JLink OB相关的一些记录

    使用 STM32F103 Bluepill 制作 JLink OB https://github.com/GCY/JLINK-ARM-OB https://stm32duinoforum.com/fo ...

  8. STC89C52控制74HC595,74HC138双色16x16点阵屏循环显示汉字

    简介 常见的LED点阵除了使用MAX7219, 还有一部分是使用74HC595, 前者能主动刷新, 后者需要上位机主动扫描刷新. 手里这块是德飞莱的16x16LED点阵模块, 板上印的型号LY-LED ...

  9. Shiro实战2-Springboot集成Shiro实战

    说明 最近打算打造一个简易的权限管理系统,打算用shiro做认证和授权.本篇作为springboot集成shiro的入门实战案例记录下来,希望也可以帮到大家,代码整理自网络. 技术栈 springbo ...

  10. Java集合框架学习(一)介绍

    介绍 Java集合框架是一组接口和类的集合,它使得存储和处理数据更加有效率. 该框架有一些类,有很多函数使得程序员更加容易的处理集合类型数据. 后面的教程就是针对这些常用类展开,配合例子代码来给大家一 ...