当前位置: 首页 > 科技观察

k8s故障检测与自愈之一

时间:2023-03-13 06:29:47 科技观察

组件故障,k8s故障检测和自愈之一,组件故障可以认为是节点故障的一个子类,只不过故障源是K8S基础组件的一部分。DNS故障:6个DNSPod中有2个无法解析外部DNS名称。造成的后果就是大量的网上业务都是因为域名解析。CNI故障:少数节点的容器网络与外部断开,该节点访问自己的PodIP没有问题,但其他节点无法访问故障节点的PodIP。这种情况下,Pod自身的健康检查失效,导致故障实例持续存在,一定比例的业务请求失败。kubenurse将对ingress、dns、apiserver和kube-proxy进行网络检测。使用KubeNurse进行集群网络监控节点故障硬件错误:CPU/内存/磁盘故障内核问题:内核死锁/文件系统损坏容器运行时错误:Docker假死基础设施服务故障:NTP故障node-problem-detector根本原因:在kubernetes集群中一般来说,我们通常只控制集群本身和容器的稳定运行。但是这些稳定性都强烈依赖于node节点的稳定性。但是节点管理在kubernetes中比较薄弱,因为也许对于kubernetes的最初设计来说,这些应该是IaaS的事情。但是随着kubernetes的发展,它越来越成为一个操作系统,它管理的内容也会越来越多,所以对node的管理也会包含在kuberntes的管理中。因此扩展了节点问题检测器项目。Kubernetes支持两种上报机制:1.NodeCondition(节点条件):这里指的是一个永久性的错误,会导致pod无法在这个节点上运行。该节点的状态只有在节点重启后才会重置。2.事件(Event):影响节点的暂时性问题,但对系统诊断有意义。NPD利用kubernetes的上报机制,通过检测系统日志(如centos中的journal),将错误信息上报给kuberntes的节点。镜像故障节点上的事件会记录在主机的一些日志中。这些日志(比如内核日志)中噪声信息太多,NPD会提取有价值的信息,可以上报给Prometheus,也会产生离线事件。这些信息可以推送到企业微信进行人工处理。也可以对应自愈系统的方法库进行自动恢复。在裸机K8S集群中,由于缺乏基础设施支持,可能无法实现节点的自动扩容。只有通过更精细的自动化运维,才能治愈节点的异常状态。以CNI故障为例,可能的修复过程如下:查询运维方法库,如果匹配到,则执行相应的运维动作。如果以上步骤无效,尝试删除节点上负责CNI的Pod,重置节点的路由,Iptables配置如果以上步骤无效,尝试重启容器,并在运行时报警,要求操作和维护人员介入部署NPD实践。你需要有一个k8s集群,而且必须有多个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主要参数:--prometheus-address:默认绑定地址为127.0.0.1,如果需要推送到promethues,需要修改。--config.system-log-monitor:节点问题检测器将为每个配置启动一个单独的日志监视器。示例:config/kernel-monitor.json。--config.custom-plugin-monito:节点问题检测器将为每个配置启动一个单独的自定义插件监视器。案例:config/custom-plugin-monitor.json将代码克隆到本地,根据自己的需要更改部署文件中的DaemonSet,执行如下:创建ConfigMap:kubectlcreate-fnode-problem-detector-config.yaml创建aDaemonSet:kubectlcreate-fnode-problem-detector.yaml如何验证NPD捕获信息可以在测试集群的节点上完成。sudosh-c"echo'kernel:BUG:unabletohandlekernelNULLpointerdereferenceatTESTING'>>/dev/kmsg"可以在kubectldescribenodesx.x.x.x中看到KernelOops事件的告警。sudosh-c"echo'kernel:INFO:taskdocker:20744blockedformorethan120seconds.'>>/dev/kmsg"可以在kubectldescribenodesx.x.x.x中看到DockerHung事件的告警。如果promethues收到事件告警,可以配置策略发送到微信。