kubernetes 故障排除、处理、预防

kubernetes 故障排除、处理、预防

故障排除顺序和思路

第一步:

我们可以通过查看节点是否正常,一是保证 K8S API Server 是正常的,二是可以查看节点集群网络中是否存在节点异常。如果我们在第一步发现哪个节点挂掉了,这时候我们可以重启节点,对节点上的应用进行恢复。假如我们发现这个节点挂掉是因为集群资源不够,这时候我们要及时增加集群节点,否则哪怕是重启集群,可能还是会挂掉。

第二步:

通过第一步,我们并没有发现集群中的节点有什么问题,我可能需要看到应用本身的部分,我们需要查看应用本身的日志,需要查看涉及的 Pod 日志。执行时可以看到确认两点,一是看 Pod 基础网络是否通畅,通过日志查看这个应用是不是在运行过程中发现一些问题,是不是有一些错误的日志在里面。二是解决在启动时遇到的常见问题。

第三步:

假设我们发现 Pod 没有错误情况发生,这时候我们可能需要看看 K8S 核心组件,包括 kube-apiserver,kube-scheduler,kube-controller-manager 的日志。这时候我们可以查看 K8S 核心组件的配置,看有没有问题。

第四步:

第四步工作是检查 Service 是否可以访问,这时候我们需要查看 DNS 或者 kube-proxy 日志,可以很简单的查看 DNS 或者 kube-proxy 有没有报错。有些人习惯性地在某些 Pod 上抓包或者在节点上进行抓包,这种效率是非常低的。

第五步:

实在没有定位到问题的话,还可以看看每个节点上 Kubelet,如果 Kubelet 上有错误信息发生,可能就是因为这个节点上 Kubelet 发生了一场灾难,需要我们重新做节点。

以上五种情况可以解决集群中大部分的网络、存储和应用本身的异常。核心依赖是本身集群就有监控系统、监控告警系统,通过这种方式直接在我们监控系统中查看集群中是不是有哪个节点异常。假如我们是微服务应用,还可以查看是不是某一个微服务中的某个链路断开了。

常见应用故障

第一种是 Pod 启动后一直处于 Pending 的状态,表示这个 pod 没有被调度到一个节点上。在我们实际场景中,大部分是因为节点上的资源不足引起的。

第二种是使用了 hostPort 导致端口出现冲突,服务无法正常启动。

第三种是如果你的程序在 Waiting 中,则表示这个 pod 已经调试到节点上,但是没有运行起来,通过 kubectl describe 这个命令来查看相关信息。最常见的原因是拉取镜像失败,这个情况在私有云环境中非常常见。

第四种跟我们应用本身使用参数或者应用本身的代码有关系,这里有一个典型的例子——MySQL。我相信有在 K8S 上部署 MySQL 的用户,都可能遇到这个问题。MySQL 在使用时,假如你的磁盘中缓存不足,这时候我们需要查一查 MySQL 的报错,错误信息会很明确地告诉你需要调大参数,这是都是通过 Controller 命令就可以查到的。假如 Pod 一直 restart 的话,我们可能需要查看它之前的日志。

第五种,Service 提供了多个服务和多个 Pod 之间的负载均衡功能。假设你的服务不可访问时,这时候我们需要考量,可以通过 Controller 查看 Service 下有没有挂载具体的 Pod。

常见集群故障

1、节点异常
2、基础网络异常
3、k8s组件异常
4、容器存储和网络

我们的集群有时候会出现状况,比如我们的 CPU 或者内存不足,导致节点异常、宕机,或者整个集群网络中断、闪断。

如果节点异常,这时候需要快速重启节点,资源不足要增加节点。如果节点频繁抖动导致业务出现漂移,这时候我们会检查一下 Controller-Manager 中的参数,配置响应参数,设置它整个节点状态检测周期。

如果我们发现 K8S 中发生异常,比如我们发现 Controller-Manager 挂了,或者 Cloud-Controller-Manager 挂了,最核心的是查看日志,及时把这些节点重启起来。最核心的需求是我们需要保证关键组件高可用,包括我们需要让这些组件一直保持在多个副本中。

存储和网络是 K8S 整个环境中最容易出问题的地方,一般像网络出现问题,定位它会像其他似的,我们需要由上至下一层层地筛选,在哪一层的网络出现问题。

如何避免故障

1、实时监控集群资源

避免资源不足导致的pod漂移,及时添加节点

2、给pod设置合适的资源

k8s提供了limitRange API,可以配置某个namespace默认的limit、request值

同时集群插件(监控,告警,日志收集)等也会占用资源,随集群扩大而增加,所以需要做资源限制。如果不设置资源限制,会导致被不断地杀死(资源不足,k8s驱逐pod有优先级,会优先杀死没有设置资源限制的pod,并且随着监控资源变多,负载变大,占用的资源增加后,没有设置合适的内存限制,会被不断杀死重启)

3、关注社区动态

及时修复集群中组件的bug

4、应用层面优化

尽量使应用无状态化,结合k8s deployment 资源对象,实现多副本,自动伸缩功能。

由于 K8S 整个集群的负载是我们平时无法应付的,所以我们要想办法避免问题,我总结以下四点,帮助我们开发者规避集群中可能遇到的情况。

第一点是我们集群搭建起来,真正落地到生产环境中时,我们非常依赖集群中的监控系统,我们需要 Prometheus,需要 Docker 系统,帮助我们实时监控集群中的资源状况。如果哪个节点发生异常,我们需要及时收到通知。

开发者或者运维人员很容易忽略的一点,假设我们集群中部署了一些 Prometheus 或者日志的组件,我们可能会忽略这些系统组件本身会消耗掉一部分系统资源。

当我们节点不断增加,这些系统组件上面会有 overhead ,它还是会消耗资源。如果应用越来越多、Pod 越来越多,这些系统组件也会有更多的资源消耗,如果没有给系统组件足够的资源会导致这些关键系统组件崩溃,我们需要给他们设置合适的资源限制,需要根据集群规模不断地调整。至少保证我们的监控告警系统正常运行。

第二点是很多时候 K8S 往往会暴露出非常多的安全问题,我们要实时关注,及时修复集群中可能出现的问题。

第三点是应用层的优化,当我们应用出现问题时,如果我们想要快速恢复它,一个大前提是我们要保证应用是无状态的,不依赖于任何存储。有状态应用的恢复比无状态应用的恢复起来麻烦得多。无状态应用,我们可以让应用恢复副本数,充分利用 K8S 调度编排的优势,这是和普通传统应用有区别的地方。我们可以通过这种方式避免我们在 K8S 集群中的应用出现问题。

最重要一点,我们需要及时备份集群中的数据,之前我们发生了一场线上灾难,通过备份数据得以进行恢复,没有影响到业务。

原文地址:https://www.cnblogs.com/h-gallop/p/11682098.html

时间: 2024-10-08 13:31:59

kubernetes 故障排除、处理、预防的相关文章

Linux下的系统启动原理及故障排除

Linux下的系统启动原理及故障排除 一:实验环境 1):虚拟机 2):linux系统环境 二:实验目标 1):理解Linux启动过程详解 2):理解影响启动的配置文件 3):常见的启动故障排除 4):救援模式的使用 三:实验步骤 第一块 Linux启动过程详解 1. 加载 BIOS 的硬件信息,跟据设定取得第一个可开机引导设置,如:光驱,硬盘,网络,USB: 如果是硬盘为第一引导. 2. 读取硬盘中 MBR 的 bootLoader (亦即是 grub,Lilo 等程序): 硬盘的0柱面.0磁

系统启动过程以及故障排除

系统的启动过程 1.加电----CMOS----post(上电自测试程序)----- grub(早期的时候使用的是lilo) Grub的第一阶段主要起到一个引导MBR中的446B.第二阶段在硬盘上,主要是一个配置. 对于任何一种操作系统,任何一台机器,刚开始的时候,肯定是要进行加电的,加完电之后在主板上有一个叫CMOS的芯片,CMOS里面有一个程序,这个程序叫post上电自测试程序.它能够对硬件来完成一些自检,比如,在机器里面内存有多大,CPU是哪一种型号的,声卡.显卡,所以这个叫上电自测试.

Atitit.故障排除系列-----apache 不能启动的排除

Atitit.故障排除系列-----apache 不能启动的排除 能直接使用cli启动httpd   ,,详细打印出信息.. C:\Users\ASIMO>"C:\wamp\apache2\bin\httpd.exe" httpd.exe: Syntax error on line 42 of C:/wamp/Apache2/conf/httpd.conf: ServerRoo t must be a valid directory 作者:: 老哇的爪子 Attilax 艾龙, 

Atitit.故障排除系列---NoClassDefFoundError NoClassDefFoundError

Atitit.故障排除系列---NoClassDefFoundError  NoClassDefFoundError java.lang.ClassNotFoundException找不到类异常.当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常. 还有个NoClassDefFoundError,,是classload 新不上class加载.. 查看class是存在的... 作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:[

Atitit.故障排除系列---php 程序网站数据库错误排除流程

Atitit.故障排除系列---php 程序网站数据库错误排除流程 Php页面报告的错误不能定位到myusql的db配置上...字说是db conn err Mysql 接入错误...大概查看哈能不能行上配置文件..三,心不死,子能trace兰... 作者::老哇的爪子Attilax艾龙,EMAIL:[email protected] 转载请注明来源: http://blog.csdn.net/attilax Index.php error_reporting(E_ALL  ); 中间,走不个c

在制品和成本故障排除常用脚本

1. 待定在制品物料事务处理? 这些脚本只是Oracle支持服务提供以故障排除为目的.  这些脚本已经过测试且照预计方式运作.然而,在依靠任何脚本之前,你应该始终先进行测试. 请运行这些脚本之前之前先进行校对! 由于不同方式的文件编辑器,电子邮件软件包和操作系统处理文本格式(空格,制表符和回车符),当你第一次收到他们时,这些脚本可能在一个无法执行状态. 检查一下这个脚本,以确保这种类型的错误得到纠正. 首先检查库存事务处理管理器是否运行,如果有任何待定或错误记录在列表中的事务处理界面.  这些都

HCNP学习笔记之OSPF协议原理及配置9-OSPF故障排除

如何去定位故障的原因以及准确的排除故障,都需要建立在对协议运作非常了解的基础上. 本文就是介绍OSPF故障排除的思路和操作. 用到的命令: display ip routing-table //先看路由,确定故障位置 display ospf peer      // 根据邻居关系,进一步确定故障点 display ospf error     // 华为,华3路由器专有,思科不支持,很强大 display current-configuration   //不推荐用,现网中配置数据量很大 di

android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V

今天在看布局文件的时候出现 android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V 提醒,google后在网上说是因为sdk版本的问题. 解决方法: 修改选择不同的API就好了,降低版本即可

Centos之故障排除

一.忘记root密码 进入单用户模式清除root密码,重新设置密码 二.MBR错误 先制造错误 输入dd  if=/dev/zero  of=/fev/sda ds=446 count=1清除MBR,输入init 6 重启 这时你会发现已经进不去系统了 进入救援模式(必须拥有系统光盘) 或者进入boot输入linux rescue进入救援模式 三. stage2失效 插入CentOS-livecd光盘 进入BIOS设置选择光盘启动按F10保存退出 选择boot 在桌面打开终端进入超级管理员模式