集群故障处理之处理思路以及听诊三板斧(三十四)

2023-05-16

640?wx_fmt=gif


前言      

本篇主要分享一些处理故障和问题绝招,比如听诊三板斧:
1)查看日志

2)查看资源详情和事件

3)查看资源配置(YAML)

如果还是不太好分析,那就祭出神器——kubectl-debug。

最后,仅需根据问题对症下药即可。



目录

  • 进一步诊断分析——听诊三板斧

  • 容器调测 

  • 对症下药  



进一步诊断分析——听诊三板斧




在初诊阶段,我们往往只能获得一些表面的信息,比如节点挂了,Pod崩溃了,网络不通等等,这时,我们需要根据我们初诊的方向和范围使用一些工具以及结合日志进行具体的诊断。

这里笔者推崇听诊三板斧:

  • 查看日志

  • 查看资源详情和事件

  • 查看资源配置


查看日志

大部分情况下,想要获得具体的病因,查看日志是最为直接的方式,因此,我们需要学会如何查看日志。


1.使用journalctl查看服务日志


主流的Linux系统基本上都采用Systemd来集中管理和配置系统,如果使用的是Systemd机制,我们可以使用journalctl命令来查看服务日志:

比如docker:


  
journalctl -u docker

640

查看并追踪kubelet的日志:


  
journalctl -u kubelet -f

640


2.使用“kubectl logs”查看容器日志


我们的应用运行在Pod之中,以及k8s的一些组件,例如kube-apiserver、coredns、etcd、kube-controller-manager、kube-proxy、kube-scheduler等,也都运行在Pod之中(静态Pod),那么如何查看这些组件以及应用的日志呢?这里就要用到前面提到的“kubectl logs”命令。

语法如下所示:


  
kubectl logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER] [options]

主要的参数说明如下表所示:

参数

说明

-f, --follow

是否持续追踪日志,默认为false,指定了之后会持续输出日志。

-p, --previous

输出Pod中曾经运行过,但目前已终止的容器的日志。

-c, --container

容器名称。

--since

仅返回相对时间范围(如5s、2m或3h)内的日志。默认返回所有日志。

--since-time

仅返回指定时间之后的日志,默认返回所有。只能同时使用since和since-time中的一种。

--tail

要显示的最新的日志条数,默认为-1,显示所有。

--timestamps

输出的日志中包含时间戳。

-l, --selector

使用Label选择器过滤

了解了主要的参数和说明,我们查看几个示例:

  • 查看Pod“mssql-58b6bff865-xdxx8”的日志


  
kubectl logs mssql-58b6bff865-xdxx8
  • 查看24小时内的日志


  
kubectl logs mssql-58b6bff865-xdxx8 --since 24h
  • 根据Pod标签查看日志


  
kubectl logs -lapp=mssql
  • 查看指定命名空间下的Pod日志(注意系统组件的命名空间为“kube-system”)


  
kubectl logs kube-apiserver-k8s-master -f -n kube-system


查看资源实例详情

除了查看日志之外,有时候我们需要查看资源实例详情以帮助我们解决问题。这就需要用到我们上面提到过的“kubectl describe”命令。

“kubectl describe”命令用于查看一个或多个资源的详细情况,包括相关资源和事件。语法如下所示:


  
kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | -l label] | TYPE/NAME)

主要的参数说明如下表所示:

参数

说明

-A,--all-namespaces

查看所有命名空间下的资源

-f, --filename

根据资源描述文件、目录、Url来查看

-R, --recursive

以递归方式查看-f指定的所有资源

-l, --selector

使用Label选择器过滤

--show-events

显示事件

了解了主要的参数和说明,我们通过示例来进行解说:


1.查看节点


查看指定节点:


  
kubectl describe nodes k8s-node1

查看所有节点:


  
kubectl describe nodes

查看指定节点以及事件:


  
kubectl describe nodes k8s-node1--show-events

注意,如果Node状态为NotReady,通过查看节点事件可以有助于我们排查问题。


2.查看Pod


查看指定Pod:


  
kubectl describe pods gitlab-84754bd77f-7tqcb

查看指定文件描述的所有资源


  
kubectl describe -f teamcity.yaml


查看资源以及配置

很多应用的出错往往都是我们的配置导致的,那么如何查看已部署资源的配置呢?这就需要用到强大的“kubectl get”命令了。

“kubectl get”命令我们经常使用,在这之前我们经常用其来查询资源,那么如何使用它来查看资源配置呢?我们先来看其语法:


  
kubectl get [(-o|--output=)json|yaml|wide|custom-columns=...|custom-columns-file=...|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=...] (TYPE[.VERSION][.GROUP] [NAME | -l label] | TYPE[.VERSION][.GROUP]/NAME ...) [flags] [options]

如上述语法所示,“kubectl get”拥有强大的格式化输出能力,支持“json”、“yaml”等,在上面的kubectl一节中我们已经讲解过了,这里我们就主要用到“-o”来查看资源配置,具体如以下实例所示:

  • 查看指定Pod配置


  
kubectl get pods mssql-58b6bff865-xdxx8 -o yaml

640

  • yaml奴家看不惯,想看JSON版的:

640

  • 想看所有的:


  
kubectl get pods -o json
  • 查看服务配置


  
kubectl get svc mssql -o yaml

640

  • 查看部署(deployment)配置


  
kubectl get deployments mssql -o yaml

640

注意:“-o”用得好,再也不用担心yaml不会写了。



容器调测



有时候光看日志还没发给出具体诊断,可能得动刀子或者进行进一步检查调测才能论证我们的猜想。笔者推荐使用以下方案:



使用“kubectl exec”进入运行中的容器进行调测


我们可以使用“kubectl exec”进入运行中的容器进行调测。这个命令和“docker exec”很类似,具体语法如下所示:


  
kubectl exec (POD | TYPE/NAME) [-c CONTAINER] [flags] -- COMMAND [args...] [options]

主要的参数说明如下表所示:

参数

说明

-c, --container

指定容器名称

-i, --stdin

启用标准输入

--tty , -t

分配伪TTY(终端设备)

接下来我们结合示例说明:

  • 进入容器查看配置


  
kubectl exec mssql-58b6bff865-xdxx8 -- cat /etc/resolv.conf

640

  • 进入容器分配终端并将标准输入流转到bash


  
kubectl exec mssql-58b6bff865-xdxx8 -it bash

640

如上图所示,我们进入MSSQL数据库的容器之后,使用sqlcmd工具执行了一个查询。这块操作如有疑问,请参阅数据库容器化一节。


使用kubectl-debug工具调测容器


kubectl-debug 是一个简单的开源的kubectl 插件, 可以帮助我们便捷地进行 Kubernetes 上的 Pod 排障诊断,背后做的事情很简单: 在运行中的 Pod 上额外起一个新容器, 并将新容器加入到目标容器的 pid, network, user以及 ipc namespace中, 这时我们就可以在新容器中直接用 netstat, tcpdump 这些熟悉的工具来诊断和解决问题了, 而旧容器可以保持最小化, 不需要预装任何额外的排障工具.

GitHub地址:https://github.com/aylei/kubectl-debug

安装脚本如下(CentOS 7):


  
export PLUGIN_VERSION=0.1.1	
# linux x86_64,下载文件	
curl -Lo kubectl-debug.tar.gz https://github.com/aylei/kubectl-debug/releases/download/v${PLUGIN_VERSION}/kubectl-debug_${PLUGIN_VERSION}_linux_amd64.tar.gz	
#解压	
tar -zxvf kubectl-debug.tar.gz kubectl-debug	
#移动到用户的可执行文件目录	
sudo mv kubectl-debug /usr/local/bin/

为了调试更快更方便,我们还需安装debug-agent DaemonSet,安装命令如下:


  
kubectl apply -f https://raw.githubusercontent.com/aylei/kubectl-debug/master/scripts/agent_daemonset.yml

使用起来非常简单,以下是常用的使用示例:


  
# 输出帮助命令	
kubectl debug -h	
# 启动Debug	
kubectl debug (POD | NAME)	
# 假如 Pod 处于 CrashLookBackoff 状态无法连接, 可以复制一个完全相同的 Pod 来进行诊断	
kubectl debug (POD | NAME) --fork	
# 假如 Node 没有公网 IP 或无法直接访问(防火墙等原因), 请使用 port-forward 模式	
kubectl debug  (POD | NAME) --port-forward --daemonset-ns=kube-system --daemonset-name=debug-agent

接下来,我们使用该工具调试一个已有Pod,如下所示:


  
kubectl debug teamcity-5997d4fc7f-ldt8w

执行该命令后,会自动拉取相关镜像并创建容器开启tty并进入容器内部,并且自带一些常用工具。这里我们使用nslookup命令来测试Pod内的外网域名(比如xin-lai.com)解析:

640

如上图所示,这样就不用每次为了调测网络问题、应用问题而且安装各种工具了,费时费力不说,有时候网络不通就比较伤了。



对症下药




根据“听诊”步骤,我们需要获得具体的情报才能对症下药。比如Pod为啥没有调度,是资源(CPU、内存等)不足,还是所有节点均不满足调度要求(比如指定了“nodeName”要求Pod强制调度到某个节点,而该节点宕机)。只有知道了具体原因,我们才能针对情况进行调整和处理,直到解决问题。

一般来说,大家遇到的Pod问题比较多,这里笔者做个经验总结。

  • Pod一直处于Pending状态,经诊断为资源不足

Pending一般情况下表示这个pod没有被调度到一个节点上。通常这是因为资源不足引起的。

解决方案有:

  1. 添加工作节点

  2. 移除部分Pod以释放资源

  3. 降低当前Pod的资源限制


  • Pod一直处于Waiting状态,经诊断为镜像拉取失败

如果一个pod卡在Waiting状态,则表示这个pod已经调试到节点上,但是没有运行起来。

解决方案有:

  1. 检查网络问题,如果是网络问题,则保障网络通畅,可以考虑使用代理或国际网络(部分域名在国内网络无法访问,比如“k8s.gcr.io”)

  2. 如果是拉取超时,可以考虑使用镜像加速器(比如使用阿里云或腾讯云提供的镜像加速地址),也可以考虑适当调整超时时间

  3. 尝试使用docker pull <image>来验证镜像是否可以正常拉取


  • Pod一直处于CrashLoopBackOff状态,经检查为健康检查启动超时而退出

CrashLoopBackOff 状态说明容器曾经启动了,但又异常退出了。通常此Pod的重启次数是大于0的。

解决方案有:

  1. 重试设置合适的健康检查阈值

  2. 优化容器性能,提高启动速度

  3. 关闭健康检查


往期内容

Docker+ Kubernetes已成为云计算的主流(二十六)

容器化之后如何节省云端成本?(二十七)

了解Kubernetes主体架构(二十八)

使用Minikube部署本地Kubernetes集群(二十九)

使用kubectl管理k8s集群(三十)

使用Kubeadm创建k8s集群之部署规划(三十一)

使用Kubeadm创建k8s集群之节点部署(三十二)

集群故障处理之处理思路以及健康状态检查(三十三)




640?wx_fmt=png转载是一种动力 分享是一种美德 640

如果喜欢作者的文章,请关注【麦扣聊技术】订阅号以便第一时间获得最新内容。本文版权归作者和湖南心莱信息科技有限公司共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


文档官网:docs.xin-lai.com


QQ群:

编程交流群<85318032> 

产品交流群<897857351>


640?wx_fmt=png 640?wx_fmt=jpeg


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

集群故障处理之处理思路以及听诊三板斧(三十四) 的相关文章

  • vnc客户端无法登陆提示Too many security failures

    vncviewer客户端提示 xff1a Too many security failures mac下的 屏幕共享 提示 xff1a 远程电脑上的软件似乎与此 屏幕共享 版本不兼容 查看服务端端口监听正常 解决方法 xff1a 重置黑名单
  • 如何使用WINSCP连接windows服务器

    非常有用 xff01 xff01 xff01 xff01 xff01 xff01 前沿 winscp是一款非常好用的文件传输工具 xff0c 但往往在windows系统上 xff0c 使用是SFTP模式会出现无法连接的情况其最主要的原因 x
  • 树莓派安装Pandas

    使用pip安装 xff0c 网络问题失败 root 64 raspberrypi span class token operator span usr span class token operator span lib span clas
  • seurat自学笔记1.0 单细胞数据导入

    Python读取 h5ad文件 import anndata import pandas as pd adata 61 anndata read 34 home R R data Seurat PBMC10 output adata h5a
  • 实验室工作站配置多用户远程连接教程(亲测有效版)

    系统版本 xff1a win10 Step1 用户配置 1 1 新建用户 右键此电脑 rightarrow 管理 rightarrow 本地用户和组 右键
  • linux下ftp用wput上传目录

    ftp的put貌似不支持put目录 xff08 谁知道怎么put目录 xff1f xff09 wput可以put目录 xff0c 使用也简单 wput home test ftp ftpusername password 64 ip tes
  • bash中!和#的问题

    size 61 medium 今天执行一条shell命令 xff0c 其中包含了 64 总之是有一段以 开始 xff0c 结果报错event not found 不解 xff0c 查了shell相关资料了解到bash Shell脚本 xff
  • Windows蓝屏代码详解

    size 61 medium Windows蓝屏密码 xff01 补全版 ZT 格式是 xff1a xff08 0x0000 操作已成功完成 0x0001 错误的函数 xff09 1 停止错误编号 0x0000000A 说明文字RQL NO
  • 制作启动U盘加载阵列卡驱动

    size 61 medium 安装服务器时碰到没有阵列卡驱动无法安装的问题大家应该都碰到过 之前一次安装2003碰到没阵列卡驱动 xff0c 解决的办法比较土 xff0c 上网下了张别人做好的集成了raid驱动的2003 这次不行了 xff
  • xfs文件系统优化

    size 61 medium 网上搜集的xfs文件系统优化方案 xff0c 自己做个小结 b 先贴出优化前后的对比 xff0c 只是简单的用dd命令测试了一下而已 xff0c 不怎么专业 写和读的文件为内存2倍 b size code 61
  • Fusion-io的吸引力:高读写能力与低延迟

    fusion io ssd硬盘的性能 url http sapling me hardware fusion io html url
  • 转:python的socket编程

    python socket编程简介 xff1a python 编写server的步骤 xff1a 1 第一步是创建socket对象 调用socket构造函数 如 xff1a socket 61 socket socket family ty
  • TIME_WAIT连接过多的解决

    netstat n awk 39 tcp 43 43 S NF END for a in S print a S a 39 LAST ACK 1 SYN RECV 164 CLOSE WAIT 3 ESTABLISHED 655 FIN W
  • MySQL更改root密码

    情况一 记得root密码 用SET PASSWORD命令 1 打开终端win 43 r输入cmd回车即可打开 xff1b 2 通过mysql u用户名 p指定root用户登录MySQL xff0c 输入后回车会提示输入密码 3 修改MySQ
  • mac下控制台可以搜索到命令但是vscode显示zsh: command not found:

    记录下吧 困扰几天了 xff0c mac怎么这么难安这些环境变量什么的啊哈哈哈 node npm都是能搜到的 在控制台全局安装了yarn xff0c 控制台可以yarn v命令 xff0c 但是vscode报错zsh command not
  • 1.机器学习sklearn-------聚类

    1 sklearn简介 Scikit learn 也简称 s klearn 是机器学习领域当中最知名的 python 模块之一 sklearn库共分为6大部分 xff0c 分别用于完成分类任务 回归任务 聚类任务 降维任务 模型选择以及数据
  • KEIL编译报错,解决方法汇总

    目录 背景 最近在跟着野火码uCosiii的代码时 xff0c 感觉非常完美 xff0c 结果一编译 xff0c 报了120个莫名其妙的问题 xff0c 下面是踩过的坑 xff0c 一起记录下 xff0c 免得下次又掉进去了 1 编译汇编文
  • “从0开始的FreeRTOS”系列教程第一讲

    大家好 xff0c 这次给大家带来了Freertos的教程 xff0c 这次打算一口气做完一整个系列的教程 xff0c 大概更新频率会是月更 这个系列的教程的主要目的是带大家了解实时系统 real time operating system
  • 我的2013奋发突进

    先简单介绍自己 男 大专学历2012年6月毕业 期间2011 6月 2012 6 算是实习期 正式实习了一年 从2012 6月实习结束后 没打算在原来实习的单位呆着 换了一家公司 一直到2013年的7月末 考虑到种种原因 回归家乡了 技术篇

随机推荐

  • VR 杂想

    什么是VR VR xff08 科学技术 xff09 即VR xff08 Virtual Reality xff0c 即虚拟现实 xff0c 简称VR xff09 xff0c 是由美国VPL公司创建人拉尼尔 xff08 Jaron Lanie
  • 解决rosdep init错误和rosdep update错误以及ros密钥错误

    解决rosdep init错误和rosdep update错误以及ros密钥错误 如果仍无法解决下面所述问题 xff0c 欢迎留言 对于rosdep init错误有以下几种方法 1 更换软件源并更新软件包 sudo apt get upda
  • vscode使用技巧——webpack项目的断点调试

    为了方便调试 xff0c 我研究了一下如何使用vscode进行断点调试 本次尝试已在html template项目中测试通过 安装插件 在vscode的插件商店安装必要的插件 Debugger for Chrome 调整webpack配置
  • apt-get 源和常识

    本文内容 xff1a 1 apt get的源换成阿里或163的 2 atp get的源的常识 一 概述 安装好Ubuntu它自带源是国外的 xff0c 访问较慢 xff0c 经常会出现连接失败的情况 所以建议将它替换为国内的 xff08 如
  • 树莓派、百度DuerOS等RAW格式的镜像浏览、提取文件的方法

    前言 树莓派上装了docker等一堆东西 xff0c 要跑DuerOS的 DuerOS开发套件个人版 http open duer baidu com openduer product idk id 61 personal xff0c 有好
  • 解决Ubuntu可以ping通ip地址,不能ping通域名和浏览器无法上网的问题

    Ubuntu版本18 04 4 主要原因 原本的dns解析不行 要修改为谷歌的域名解析服务器8 8 8 8才行 并且每次关机后就会恢复默认 要添加到开机自启 1 修改配置文件 vim etc NetworkManager NetworkMa
  • Java核心技术卷1读书笔记

    Java核心技术卷1读书笔记 前言Math floorMod 前言 本笔记主要记录学习 JAVA核心技术 卷1 时遇到的问题或者心得 xff0c 若有朋友有更好的学习资源推荐请留言或联系我VX 18439428204 QQ 75107651
  • [前端基础] 浏览器篇

    提供基础用法 xff0c 基础概念引用 MDN W3C xff0c 基础内容做扩展知识 xff0c 可应对面试 xff0c 详细原理及应用需要去官网 GitHub 深入学习 1 常用 BOM 方法 BOM xff08 browser obj
  • STM32 keil5 报错:flash download failed-cortex M3解决方法

    起因 因为之前自己使用的STM32都是使用的F4 xff0c 自己打了一块STM32F1C8T6板子 xff0c 焊好之后 xff0c 打开以前正点原子的例程的时候 xff0c 出现无法烧录的情况 xff0c 总是报这样的错误 xff0c
  • Hadoop实战学习(3)-读取数据库内容

    要读取数据库中的数据 xff0c 首先需要实现一个实体类 xff0c 这个实体类部分映射数据库中要查询的表的字段 且该实体类需要实 现Writable与DBWritable两个接口 xff0c DBWritable的实现类负责查询与写入 x
  • 消失点(灭点、Vanishing Point)

    目录 定义 xff1a 性质 xff1a 消失点分为3种 一条直线的消失点是过摄影中心且平行于该直线的直线与像平面的交点 地面物体的两个消失点的连线为水平线 xff0c 提供地平线的信息 应用 xff1a 计算焦距和图像中心 求像心 求焦距
  • window.performance.timing 字段说明和主要性能指标

    window performance是W3C性能小组引入的新的API xff0c 目前IE9以上的浏览器都支持 字段说明 xff1a connectStart 和 connectEnd 分别代表TCP建立连接和连接成功的时间节点 domCo
  • C++中的private, public, protected

    0 概述 数据隐藏是C 43 43 面向对象编程的重要特征之一 xff0c 它允许我们隐藏对象内部细节即数据成员 xff0c 防止程序的函数直接访问一个类对象的内部表示 数据成员和成员函数 对类成员函数的访问限制由访问修饰符指定 访问修饰符
  • 数据链路层设计要点

    数据链路层保证数据在两台机器间进行可靠 有效的通信 需要考虑传输错误 xff08 检错 纠错等 xff09 延迟等问题 因此 xff0c 其功能可概括为 xff1a 1 向网络层提供一个定义良好的服务接口 xff1b 2 处理传输错误 xf
  • 由NT Service中调用SendInput模拟键盘鼠标事件了解到的

    TODO
  • 远程连接之ssh的使用(日志监控)

    ssh的简介 ssh服务 Secure Shell xff1a SSH 为建立在应用层基础上的安全协议 SSH 是较可靠 xff0c 专为远程登录提供服务 解决的问题 xff1a 对服务器的远程控制 xff0c 远程操作 ssh服务是安全的
  • 基于润和hi3516 dv300开发板,体验鸿蒙3.0 L1小型系统拍照Sample

    背景 xff1a 希望能在润和hi3516 dv300开发板上 xff0c 体验拍照功能 前段时间花了一段精力 xff0c 好不容易在润和hi3516 dv300上烧录了L2系统 xff0c 并跑成功了ArkUI应用 xff0c 详见 xf
  • 集群故障处理之处理思路以及健康状态检查(三十三)

    前言 按照笔者的教程 xff0c 大家应该都能够比较顺畅的完成k8s集群的部署 xff0c 不过由于环境 配置以及对Linux k8s的不了解会导致很多问题 异常和故障 xff0c 这里笔者分享一些处理技巧和思路 xff0c 以及部分常见的
  • ElasticSearch集群日志限制问题

    本文是基于CentOS7的环境下使用rpm包安装进行说明 ELK的默认日志记录会增长很多 xff0c 除ElasticSearch外 xff0c 都会无限增长 xff0c 长时间运行可能带来灾难性的后果 xff08 如 xff1a 节点宕机
  • 集群故障处理之处理思路以及听诊三板斧(三十四)

    前言 本篇主要分享一些处理故障和问题绝招 xff0c 比如听诊三板斧 xff1a 1 xff09 查看日志 2 xff09 查看资源详情和事件 3 xff09 查看资源配置 xff08 YAML xff09 如果还是不太好分析 xff0c