NRQL:我如何确定一个pod是否在指定的时间内从Kubernetes节点中丢失了



问题:编写一个查询来检查所有Kubernetes节点,以确保coredns正在运行,如果没有-自运行以来已经超过30分钟了吗?-如果是,请发送警报。

警报部分将是我最初的问题的次要部分,不必在这个线程中解决。我只是想弄清楚如何从一开始就得到这些信息。

本质:嗨,node,你有一个名为coredns.*的pod在运行吗?如果没有,那你已经超过3000万了吗?



我的策略:我假设搜索没有coredns.*pod名称的节点是我开始的方式。

FROM K8sPodSample SELECT nodeName WHERE podName != 'coredns.*'

然后,将时间范围设置为31分钟前开始。(不确定这是否显示了31分钟内没有吊舱的节点,或者是否显示了截至31分钟前没有吊舱的所有吊舱,即使只有几分钟(

SINCE 31 minute ago

这是一个将处于集群级别的查询,因此我也将添加它。

WHERE clusterName = '<clusterName>' 

然后,如果工作正常,我将为该列表中显示的任何节点生成警报。


我是否正确地考虑了这一点,或者可以用更好的方式实现这一点?



更新:我的新策略是返回一个nodeName,其中名称中包含coredns的pod数为0……仍在处理这一部分。

这个方法的诀窍是寻找名称中有coredns并且没有运行状态的pod,通过(faceting by(nodeName和namespace进行分组。

SELECT uniqueCount(podName) FROM K8sPodSample WHERE namespace NOT LIKE '%kube-system%' AND namespace NOT LIKE %<ourNS>% AND podName LIKE '%coredns%' AND status != 'Running' FACET nodeName, namespace

我能看到的唯一问题是,是否根本没有这个名字的吊舱。它没有考虑到这种情况。它假设如果吊舱没有处于工作状态,它仍然具有某种状态。

考虑到Kubernetes的性质,我认为这是公平的,因为如果它是replicaset/deamonset等的一部分,它总是会尝试重新启动pod。因此,它总是有状态的。

注意:kube系统和"ourNS"的排除仅包含在该查询中,因为在我们的特定场景中,不需要它们。我们只关注客户NS。

最新更新