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 集群中的应用出现问题。

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

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

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

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

  2. Kubernetes中Deployment部署故障排除

    Kubernetes中Deployment部署故障排除 字符型思维导图 排查pod状态(带标签):kubectl get pods,是否有等待处理的pod? 是?kubectl describe po ...

  3. 图解Kubernetes——故障排查指南

    针对越来多的Kubernetes容器云,对Kubernetes集群的故障排查却成了一个棘手问题.本文虫虫给大家以直观图示方式介绍如何排查Kubernetes的故障.该篇是系列文章续——故障排查篇. 概 ...

  4. Longhorn 云原生容器分布式存储 - 故障排除指南

    内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 云原生容器分布式存储 - 设计架构和概念 Longhorn 云原生容器分布式存储 - ...

  5. Sentry 监控 - 私有 Docker Compose 部署与故障排除详解

    内容整理自官方开发文档 系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Map ...

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

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

  7. 理解 OpenStack + Ceph (7): Ceph 的基本操作和常见故障排除方法

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  8. 细化如何安装LNMP + Zabbix 监控安装文档以及故障排除

    1.LNMP所需安装包: 上传如下软件包到/soft目录中 mysql- (centos6. 64位自带)也可根据版本自行挑选,前提你了解这个版本 pcre-8.36.tar.gz nginx-.ta ...

  9. 第十篇 Replication:故障排除

    本篇文章是SQL Server Replication系列的第十篇,详细内容请参考原文. 复制故障排除是一项艰巨的任务.在任何复制设置中,都涉及到很多移动部件,而可用的工具并不总是很容易识别问题.Th ...

随机推荐

  1. VBA 宏文件源代码密码解除

    VBA Project密码解除第一种方法详细步骤参考:以下VBA代码是第二种方法 '使用本代码之前需要将需要解除密码保护的含有宏的Excel文件(如果是xlsm文件,需要先另存为97-03版的xls文 ...

  2. BUG处理流程图

    流程描述: 1. 测试人员发现bug提交给开发. 2. 开发人员判断是否是bug. 3. 如果是bug,进行修改,修改完成后更改bug状态为已解决. 4. 如果不是bug,退回给测试人员并描述退回原因 ...

  3. LODOP中的RightMargin右边距和BottomMargin下边距

    LODOP中的打印项,例如ADD_PRINT_HTM,参数分别为顶边距,左边距,宽,高,打印项内容.第三四参数宽高,除了可以用值和百分比,还可以用RightMargin和BottomMargin变相控 ...

  4. [LeetCode] 556. Next Greater Element III 下一个较大的元素 III

    Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly th ...

  5. Activiti数据库表结构(23张表5.*版本)

    1  Activiti数据库表结构 1.1      数据库表名说明 Activiti工作流总共包含23张数据表,所有的表名默认以“ACT_”开头. 并且表名的第二部分用两个字母表明表的用例,而这个用 ...

  6. mongoDB主从和集群

    主从(windows下的配置) 主服务器设置 mongod --dbpath=F:\mongoDB\db --master \\dbpath是设定数据存放路径 --master是指定为主库 从服务器设 ...

  7. (转)面试前必知Redis面试题—缓存雪崩+穿透+缓存与数据库双写一致问题

    背景:redis问题在面试过程中经常被问到,对于常见问题一定不能放过. 面试前必知Redis面试题—缓存雪崩+穿透+缓存与数据库双写一致问题 一.缓存雪崩 1.1什么是缓存雪崩? 如果缓存数据设置的过 ...

  8. php_mvc实现步骤五

    5.match_controller 控制器层典型实现 控制器类 依据功能的相关性,将一系列相关的功能,使用一个控制器类来处理,而该控制器的每个方法,就对因某个功能. 注意:控制器是按照功能划分的.( ...

  9. PHP设计模式 - 抽象工厂模式

    有些情况下我们需要根据不同的选择逻辑提供不同的构造工厂,而对于多个工厂而言需要一个统一的抽象工厂: <?php class System{} class Soft{} class MacSyst ...

  10. [转帖]Merkle树

    Merkle树 https://www.jianshu.com/p/fc439a8fd0de 所谓比特币交易就是从一个比特币钱包向另一个中转账,每笔交易都有数字签名来保证安全.一个交易一旦发生那么就是 ...