k8s故障检测与自愈之一

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

[[395197]]

组件故障

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

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

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

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

使用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上。

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

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

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

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

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

主要参数:

--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,执行以下内容:

  1. 创建ConfigMap: 
  2. kubectl create -f node-problem-detector-config.yaml 
  3. 创建DaemonSet: 
  4. kubectl create -f node-problem-detector.yaml 

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

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

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

 

责任编辑:武晓燕 来源: 运维开发故事
相关推荐

2023-04-30 00:02:40

K8Skubelet数据

2022-04-22 13:32:01

K8s容器引擎架构

2024-02-20 16:55:14

K8S云计算

2024-03-18 15:44:48

K8S故障运维

2023-12-05 08:33:44

滴滴故障k8s

2023-11-06 07:16:22

WasmK8s模块

2022-10-10 12:54:00

Flink运维

2021-08-20 11:35:04

服务运维 故障

2023-09-06 08:12:04

k8s云原生

2024-03-12 15:47:12

Kubernetes容器K8S

2024-03-27 14:54:21

KubernetesK8S集群

2024-05-27 00:00:10

KubernetesK8s云原生

2024-03-01 19:59:17

2022-02-25 11:16:51

故障运维Nginx

2020-05-12 10:20:39

K8s kubernetes中间件

2022-09-05 08:26:29

Kubernetes标签

2024-01-07 19:43:50

K8S节点

2023-12-01 15:58:00

Kubernetes集群DevOps

2023-08-03 08:36:30

Service服务架构

2023-08-04 08:19:02

点赞
收藏

51CTO技术栈公众号