k8s故障检测与自愈(一)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: k8s故障检测与自愈(一)

组件故障


组件故障可以认为是节点故障的子类,只是故障来源是K8S基础组件的一部分。


DNS故障:6个DNS Pod中的2个出现无法解析外部DNS名称的情况。后果是大量线上业务因域名解析失败。


CNI故障:少数几个节点的容器网络和外部断开,节点访问自身的Pod IP没有问题,但是其它节点无法访问故障节点的Pod IP。这种情况下,Pod本机的健康检查无效,导致故障实例持续存在,一定比例的业务请求失败。


kubenurse会对ingress、dns、apiserver、kube-proxy进行网络探测。


可以参考:


使用KubeNurse进行集群网络监控


乔克,公众号:运维开发故事使用KubeNurse进行集群网络监控


节点故障


  • 硬件错误: CPU/Memory/磁盘故障
  • kernel问题: kernel deadlock/corrupted file systems
  • 容器运行时错误: Docker假死
  • 基础设施服务故障: NTP故障

node-problem-detector


  • 根源: 在kubernetes集群上,通常我们只是管制集群本身以及容器的稳定运行。但是这些稳定性都是强依赖节点node的稳定的。可是node的管理,在kubernetes是比较弱的,因为可能对于kubernetes的初始设计来说,这些应该是IaaS的事。但是随着kubernetes的发展,它越来变成了一个操作系统,它管理的内容将越来越多,所以对于node的管理也将纳入kuberntes里管理。所以延伸出了node problem detector这个项目。


  • Kubernetes支持两种上报机制:


1、NodeCondition(节点状况): 这是指永久性的错误,它将造成pod无法在这个节点运行。这个节点状况只有在节点重启后才会被重置

2、Event(事件): 影响节点的临时性问题,但是它是对于系统诊断是有意义的。NPD就是利用kubernetes的上报机制,通过检测系统的日志(例如centos中journal),把错误的信息上报到kuberntes的node上。


640.png


故障节点上的事件,会记录在宿主机的某些日志中。这些日志(例如内核日志)中噪音信息太多,NPD会提取其中有价值的信息,可以将这些信息报送给Prometheus,也会生成离线事件。这些信息可以推送到企业微信,人工处理。也可以对应到自愈系统的方法库,自动恢复。在裸金属K8S集群中,由于缺乏基础设施的支撑,自动扩充节点可能无法实现,只能通过更加精细的自动化运维,治愈节点的异常状态。


640.png


以CNI故障为例,可能的治愈流程如下:


  1. 查询运维方法库,如果找到匹配项,执行对应的运维动作
  2. 如果上述步骤无效,尝试删除节点上负责CNI的Pod,以重置节点的路由、Iptables配置
  3. 如果上述步骤无效,尝试重启容器运行时
  4. 告警,要求运维人员介入


部署NPD实践你需要有一个k8s集群,必须有1个以上的worker节点。大家可以参考https://github.com/kubernetes/node-problem-detector


主要参数:
--prometheus-address: 默认绑定地址127.0.0.1,如果需要推送给promethues,需要修改。
--config.system-log-monitor: 节点问题检测器将为每个配置启动一个单独的日志监视器.案例: config/kernel-monitor.json。
--config.custom-plugin-monito: 节点问题检测器将为每个配置启动一个单独的自定义插件监视器。案例: config/custom-plugin-monitor.json


将代码克隆到本地,按照自己的需求更改deployment文件中的DaemonSet,执行以下内容:


创建ConfigMap:
kubectl create -f node-problem-detector-config.yaml
创建DaemonSet:
kubectl create -f node-problem-detector.yaml


如何验证NPD捕获信息这部分,可以在测试集群的node几点上做。


sudo sh -c "echo 'kernel: BUG: unable to handle kernel NULL pointer dereference at TESTING' >> /dev/kmsg"
可以在kubectl describe nodes x.x.x.x 中看到KernelOops事件的告警。
sudo sh -c "echo 'kernel: INFO: task docker:20744 blocked for more than 120 seconds.' >> /dev/kmsg"
可以在kubectl describe nodes x.x.x.x 中看到DockerHung事件的告警。


如果事件告警接到了promethues,可以配置策略,发送到微信。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
7月前
|
存储 Kubernetes API
K8S上生产环境后,90%都会遇到这个故障
K8S上生产环境后,90%都会遇到这个故障
375 0
|
7月前
|
Kubernetes 应用服务中间件 nginx
提升K8S故障排除效率:详解Pod内抓包的高效策略!
提升K8S故障排除效率:详解Pod内抓包的高效策略!
331 0
|
Kubernetes 监控 Java
【JVM故障问题排查心得】「内存诊断系列」Docker容器经常被kill掉,k8s中该节点的pod也被驱赶,怎么分析?
【JVM故障问题排查心得】「内存诊断系列」Docker容器经常被kill掉,k8s中该节点的pod也被驱赶,怎么分析?
808 0
【JVM故障问题排查心得】「内存诊断系列」Docker容器经常被kill掉,k8s中该节点的pod也被驱赶,怎么分析?
|
4月前
|
Kubernetes 调度 Perl
在K8S中,节点故障驱逐pod过程时间怎么定义?
在K8S中,节点故障驱逐pod过程时间怎么定义?
|
2月前
|
Kubernetes Docker Perl
k8s常见故障--yaml文件检查没有问题 pod起不来(一直处于创建中)
k8s常见故障--yaml文件检查没有问题 pod起不来(一直处于创建中)
126 1
|
4月前
|
运维 Kubernetes Perl
在K8S中,节点故障pod驱逐pod过程,时间怎么定义的?
在K8S中,节点故障pod驱逐pod过程,时间怎么定义的?
|
4月前
|
Kubernetes 网络协议 网络架构
在K8S中,keepalived是如何检测工作节点是否存活的?
在K8S中,keepalived是如何检测工作节点是否存活的?
|
4月前
|
Kubernetes 监控 Shell
掌握Kubernetes故障排除技巧:kubectl命令的基本指南
以上是使用 `kubectl` 进行故障排除的一些基本指南。熟悉这些命令能够帮助您快速定位和解决在Kubernetes集群中遇到的问题。在实际使用中,您可能还需要结合其他工具和资源,如官方文档、社区论坛以及第三方监控和日志服务来进行更深入的故障诊断和排除。
111 0
|
6月前
|
Kubernetes 网络协议 Docker
k8s 开船记-故障公告:自建 k8s 集群在阿里云上大翻船
k8s 开船记-故障公告:自建 k8s 集群在阿里云上大翻船
|
7月前
|
Kubernetes 监控 容器
K8S故障注入混沌工程开源平台ChaosMesh
总之,ChaosMesh作为一个Kubernetes混沌工程平台,为用户提供了测试和验证Kubernetes集群的可靠性的工具和框架,有助于提高系统的稳定性和性能。
257 0

热门文章

最新文章

推荐镜像

更多