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

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=png640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

selenium搜狗搜图简单操作(爬取任意关键字的图片)

Picture preview Steps 这里以搜狗搜图作为一个简单的例子&#xff1a; 第一步就是获取我们的需求了&#xff0c;输入需要下载的图片名字以及需要下载的图片数量。 接下来我们需要在搜狗搜图中输入用户的需求&#xff0c;透过xpathxpathxpath锁定搜索框&#xff0c;然后输入…

Microsoft REST API指南

经过3个月的碎片时间的翻译和校验&#xff0c;由长沙.NET技术社区翻译的英文原文文档《Microsoft REST API指南 》已经翻译完成&#xff0c;现刊载前十一章如下&#xff0c;欢迎大家点击“查看原文”按钮&#xff0c;查看指南的完整内容。PS&#xff1a;内容很长&#xff0c;全…

如何优雅地替换一个实现

前两天&#xff0c;我所在的项目有一个小的技术改动&#xff0c;打算把访问Redis的密码从数据库挪到配置文件里。以前的代码类似下面这样&#xff1a;用户第一次调用GetDatabase时&#xff0c;根据传入的数据库连接字符串访问数据库&#xff0c;从某个表里取出带密码的Redis连接…

莫队——三种题型

普通莫队 P3901 数列找不同 Thinking 一定是用可以用莫队来写题&#xff0c;这点是不用质疑的&#xff0c;所以那就简单了&#xff0c;只需要判断每次询问的区间是否满足r−l1numr - l 1 numr−l1num就行了。 Coding1Coding_1Coding1​ 莫队写法 #include <bits/stdc…

P5357 【模板】AC自动机(二次加强版) fail树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 这个只能搞failfailfail树了&#xff0c;让后跑一遍即可。 重复的字符串记一个&#xff0c;让后其他的都跟他一个答案即可。 // Problem: P3796 【模板】AC自动机&#xff08;加强版&…

10分钟了解一致性hash算法

应用场景当我们的数据表超过500万条或更多时&#xff0c;我们就会考虑到采用分库分表&#xff1b;当我们的系统使用了一台缓存服务器还是不能满足的时候&#xff0c;我们会使用多台缓存服务器&#xff0c;那我们如何去访问背后的库表或缓存服务器呢&#xff0c;我们肯定不会使用…

创业周年记:召唤神龙一周年小记

2018年8月8日&#xff0c;我决定离开腾讯的光环&#xff0c;辞职开始创业。《回顾4180天在腾讯使用C#的历程&#xff0c;开启新的征途》记录了我所说的拥有七龙珠&#xff0c;去召唤神龙&#xff0c;今天正好历时一年时间&#xff0c;非常有必要来回顾过去一年的创业历程。迎接…

「数据ETL」从数据民工到数据白领蜕变之旅(三)-除了Excel催化剂之外PowerQuery新物种同样值得期待...

在自助式BI时代以前&#xff0c;Excel级别的数据ETL工作&#xff0c;非常低效&#xff0c;动不动就要启用VBA来完成一些常见的需求&#xff0c;自带的原生功能&#xff0c;未能满足大量的繁琐数据ETL刚需功能。在Excel2010后&#xff0c;PowerQuery以插件的形式横空出现&#x…

Docker系列之烹饪披萨(二)

上一篇我们讲解了虚拟机和容器的区别&#xff0c;本节我们来讲讲Docker中关于Dockerfile、镜像、容器等基本概念。Docker是一个在容器内开发、部署、运行应用程序的平台&#xff0c;Docker本质上是容器化的代名词&#xff0c;容器对于提高软件开发和数据科学的安全性&#xff0…

史上最能“拜客户教”的公司,是如何做到持续交付的?(第2趴)|DevOps案例研究...

内容来源&#xff1a;DevOps案例深度研究 –Amazon持续交付之道战队&#xff08;本文只展示部分PPT及研究成果&#xff0c;更多细节请关注案例分享会&#xff0c;及本公众号。&#xff09;本案例内容贡献者&#xff1a;单冰 (Topic Leader)、 赵栋、梁兴龙、李杰、毛艳清、牛恒…

ASP.NET Core on K8S深入学习(3)Deployment

上一篇《部署过程解析与安装Dashboard》中我们了解K8S的部署过程&#xff0c;这一篇我们来了解一下K8S为我们提供的几种应用运行方式&#xff1a;Deployment、DaemonSet与Job&#xff0c;它们是Kubernetes最重要的核心功能提供者。考虑到篇幅和更新速度&#xff0c;我将其分为两…

8月语言排行:C#继续呈现增长态势

TIOBE 编程语言排行榜 8 月更新已公布&#xff0c;排名前十的分别是&#xff1a;Java, C, Python, C, C#, Visual Basic .NET, JavaScript, PHP, Objective-C 和 SQL。和上个月唯一的不同之处在于 Objective-C 和 SQL 的排名发生了交换。事实上&#xff0c;上周 Dice Insights …

面试必谈的哈希,.Net 程序员温故而知新

引言&#xff1a;作为资深老鸟&#xff0c;有事没事&#xff0c;出去面试&#xff1b;找准差距、定位价值。面试必谈哈希&#xff0c;Q1&#xff1a;什么是哈希?Q2&#xff1a;哈希为什么快?Q3&#xff1a;你是怎么理解哈希算法利用空间换取时间的&#xff1f;Q4&#xff1a;…

Grpc Proto To Nuget Package 插件使用说明

Grpc Proto To Nuget Package 是一个 VS 插件&#xff08;支持 VS2019&#xff09;&#xff0c;目的是将基于 gRPC 的接口定义 .proto 文件一键转成 Nuget Package&#xff0c;然后发布到私有仓库上。下载最新 GrpcProtoToNugetPackageTemplate.zip ASP.NET 的项目模板&#xf…

.NET Core 3.0预览版7中的ASP.NET Core和Blazor更新

.NET Core 3.0 Preview 7现已推出&#xff0c;它包含一系列ASP.NET Core和Blazor的新更新。以下是此预览中的新功能列表&#xff1a;最新的Visual Studio预览包括.NET Core 3.0作为默认运行时Visual Studio中的顶级ASP.NET核心模板简化的网页模板组件的属性splattingTypeConver…

你必须知道的Docker数据卷

本篇已加入《.NET Core on K8S学习实践系列文章索引》&#xff08;微信上暂无法访问&#xff0c;可以通过cnblogs博客园访问&#xff09;&#xff0c;可以点击查看更多容器化技术相关系列文章。本篇预计阅读时间为5分钟。01—Docker数据挂载到容器在Docker中&#xff0c;要想实…

牛客小白月赛11:Rinne Loves Data Structure

Rinne Loves Data Structure 思路 我们插入的位置大概分了四种&#xff1a; 第一种 显然我们找到比当前插入的值的pre&#xff0c;也就是比当前节点大的最小值。 第二种 我们只要找到当前节点的suc&#xff0c;也就是比当前节点小的&#xff0c;最大值。 第三种 我们只…

VS Code 1.37 发布!多达数十个图标迎来全新设计

今天&#xff08;北京时间 2019 年 8 月 9 日&#xff09;&#xff0c;微软发布了 Visual Studio Code 1.37 版本。此版本主要更新的内容包括&#xff1a;Full product icon refresh - 多达数十个图标迎来全新的现代化设计Edit string arrays in the Settings UI - 在配置编辑器…

Serilog 自定义 Enricher 来增加记录的信息

Serilog 自定义 Enricher 来增加记录的信息IntroSerilog 是 .net 里面非常不错的记录日志的库&#xff0c;结构化日志记录&#xff0c;而且配置起来很方便&#xff0c;自定义扩展也很方便Serilog is a diagnostic logging library for .NET applications. It is easy to set up…

基于@media (prefers-color-scheme: [dark|light])的暗黑与亮色主题切换

今天有人反馈使用pdf.js的时候&#xff0c;发现pdf.js阅读器在自己的Mac Book电脑上显示的背景是暗黑色&#xff0c;而别人的电脑上却是白色&#xff1a; 根据这个问题&#xff0c;找到了pdf.js使用的view.css有段代码&#xff0c;类似这样&#xff1a; media (prefers-color-…