Kubernetes集群可能存在的问题

  • 基础架构守护程序问题: NTP服务关闭
  • 硬件问题:CPU,内存或磁盘损坏 内核问题:内核死锁,文件系统损坏
  • 容器运行时问题:运行时守护程序无响应

当Kubernetes中节点发生上述问题,在整个集群中,k8s服务组件并不会感知以上问题,就会导致pod仍会调度至问题节点。

Node-problem-detector

为了解决这个问题,社区引入了守护进程node-problem-detector,从各个守护进程收集节点问题,并使它们对上游层可见。

Kubernetes节点诊断的工具,可以将节点的异常,例如:

  • Runtime无响应;
  • Linux kernel无响应;
  • 网络异常 ;
  • 文件描述符异常;
  • 硬件问题如cpu,内存或者磁盘故障。

故障分类

在这里插入图片描述

问题汇报手段

Node-problem-detector通过设置NodeCondition或者创建event对象来汇报问题。

  • NodeCondition: 针对永久性故障,会通过NodeCondition来改变节点状态
  • Event:临时故障通过event来提醒相关对象,比如通过当前节点运行的所有pod。

动手实践

1、下载安装包

helm repo add deliveryhero https://charts.deliveryhero.io/
helm pull deliveryhero/node-problem-detector
tar -zxvf node-problem-detector-2.0.9.tgz

2、修改image

vi node-problem-detector/values.yaml
image:
  repository: cncamp/node-problem-detector
  tag: v0.8.10
  pullPolicy: IfNotPresent

3、安装

helm install npd ./node-problem-detector

在这里插入图片描述

查看状态
在这里插入图片描述

4、制造异常

sudo sh -c "echo 'kernel: BUG: unable to handle kernel NULL pointer dereference at TESTING' >> /dev/kmsg"
#查看节点信息
kubectl  describe nodes ops-node-1

在这里插入图片描述

可以看到通过KernelOops这样的一个event把消息通知到了Kubernetes,只是起到一个通知的作用,还需要集成监控告警系统来完善。

5、使用插件pod启用npd

如果你使用的是自定义集群引导解决方案,不需要覆盖默认配置,可以利用插件Pod进一步自动化部署。
创建node-strick-detector.yaml,并在控制平面节点上保存配置到插件Pod的目录 /etc/kubernetes/addons/node-problem-detector

6、npd的异常处理行为

  • NPD只负责获取异常事件/并修改node condition,不会对节点状态和调度产生影响
 lastHeartbeatTime: "2022-03-02T14:12:01Z"
 lastTransitionTime: "2022-03-02T13:51:57Z"
 message: kernel has no deadlock
 reason: KernelHasNoDeadlock
 status: "False"
 type: KernelDeadlock
  • 需要自定义控制器,监听NPD汇报的condition, taint node,阻止pod调度至故障节点
  • 问题修复后,重启NPDPod来清理错误事件
Logo

开源、云原生的融合云平台

更多推荐