如何使用K8S node_problem_detector?

时间:2018-01-07 06:22:19

标签: kubernetes monitoring

问题

如果K8S,node-problem-detector文档中提到了{p> Monitor Node Health。如果它不在GCE中,我们如何使用它?它是否向信息中心提供信息或提供API指标?

3 个答案:

答案 0 :(得分:1)

“该工具旨在使群集管理堆栈中的上游层可以看到各种节点问题。它是一个守护程序,它在每个节点上运行,检测节点问题并将其报告给apiserver。” < / p>

好的,但是...这实际上是什么意思?我如何知道它是否进入了api服务器?
前后的样子如何?知道这一点将有助于我了解它在做什么。

在安装Node Problem Detector之前,我会看到:

Bash# kubectl describe node ip-10-40-22-166.ec2.internal | grep -i condition -A 20 | grep Ready -B 20
Conditions:
  Type                 Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----                 ------  -----------------                 ------------------                ------                       -------
  NetworkUnavailable   False   Thu, 20 Jun 2019 12:30:05 -0400   Thu, 20 Jun 2019 12:30:05 -0400   WeaveIsUp                    Weave pod has set this
  OutOfDisk            False   Thu, 20 Jun 2019 18:27:39 -0400   Thu, 20 Jun 2019 12:29:44 -0400   KubeletHasSufficientDisk     kubelet has sufficient disk space available
  MemoryPressure       False   Thu, 20 Jun 2019 18:27:39 -0400   Thu, 20 Jun 2019 12:29:44 -0400   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure         False   Thu, 20 Jun 2019 18:27:39 -0400   Thu, 20 Jun 2019 12:29:44 -0400   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure          False   Thu, 20 Jun 2019 18:27:39 -0400   Thu, 20 Jun 2019 12:29:44 -0400   KubeletHasSufficientPID      kubelet has sufficient PID available
  Ready                True    Thu, 20 Jun 2019 18:27:39 -0400   Thu, 20 Jun 2019 12:30:14 -0400   KubeletReady                 kubelet is posting ready status

安装节点问题检测器后,我看到:

Bash# helm upgrade --install npd stable/node-problem-detector -f node-problem-detector.values.yaml 
Bash# kubectl rollout status daemonset npd-node-problem-detector #(wait for up) 
Bash# kubectl describe node ip-10-40-22-166.ec2.internal | grep -i condition -A 20 | grep Ready -B 20 
Conditions:
  Type                 Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----                 ------  -----------------                 ------------------                ------                       -------
  DockerDaemon         False   Thu, 20 Jun 2019 22:06:17 -0400   Thu, 20 Jun 2019 22:04:14 -0400   DockerDaemonHealthy          Docker daemon is healthy
  EBSHealth            False   Thu, 20 Jun 2019 22:06:17 -0400   Thu, 20 Jun 2019 22:04:14 -0400   NoVolumeErrors               Volumes are attaching successfully
  KernelDeadlock       False   Thu, 20 Jun 2019 22:06:17 -0400   Thu, 20 Jun 2019 22:04:14 -0400   KernelHasNoDeadlock          kernel has no deadlock
  ReadonlyFilesystem   False   Thu, 20 Jun 2019 22:06:17 -0400   Thu, 20 Jun 2019 22:04:14 -0400   FilesystemIsNotReadOnly      Filesystem is not read-only
  NetworkUnavailable   False   Thu, 20 Jun 2019 12:30:05 -0400   Thu, 20 Jun 2019 12:30:05 -0400   WeaveIsUp                    Weave pod has set this
  OutOfDisk            False   Thu, 20 Jun 2019 22:07:10 -0400   Thu, 20 Jun 2019 12:29:44 -0400   KubeletHasSufficientDisk     kubelet has sufficient disk space available
  MemoryPressure       False   Thu, 20 Jun 2019 22:07:10 -0400   Thu, 20 Jun 2019 12:29:44 -0400   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure         False   Thu, 20 Jun 2019 22:07:10 -0400   Thu, 20 Jun 2019 12:29:44 -0400   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure          False   Thu, 20 Jun 2019 22:07:10 -0400   Thu, 20 Jun 2019 12:29:44 -0400   KubeletHasSufficientPID      kubelet has sufficient PID available
  Ready                True    Thu, 20 Jun 2019 22:07:10 -0400   Thu, 20 Jun 2019 12:30:14 -0400   KubeletReady                 kubelet is posting ready status

请注意,我寻求帮助,提出了一种在所有节点上都可以看到的方法,Kenna Ofoegbu提出了这个超级有用且易读的宝石:

zsh# nodes=$(kubectl get nodes | sed '1d' | awk '{print $1}') && for node in $nodes; do;  kubectl describe node | sed -n '/Conditions/,/Ready/p' ; done
Bash# (same command, gives errors)


好的,现在我知道节点问题检测器的作用,但是...向节点添加条件有什么好处,我如何使用该条件做有用的事情?

问题:如何使用Kubernetes节点问题检测器?
用例#1:自动修复异常节点
步骤1.)安装节点问题检测器,以便它可以将新的条件元数据附加到节点。
第2步。)利用Planetlabs / draino束缚和排空条件不好的节点。
第3步。)利用https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler自动修复。 (当节点被封锁并耗尽后,将被标记为不可调度,这将触发新节点的供应,然后坏节点的资源利用率将非常低,这将导致坏节点被取消配置)

来源:https://github.com/kubernetes/node-problem-detector#remedy-systems


用例#2:公开不健康的节点事件,以便Kubernetes可以检测到该事件,然后将其注入到您的监视堆栈中,以便您具有事件发生的时间和时间的可审核历史记录。
这些不健康的节点事件记录在主机节点上的某个位置,但是通常,主机节点会生成大量的嘈杂/无用的日志数据,因此默认情况下通常不会收集这些事件。
节点问题检测器知道在主机节点上查找这些事件的位置,并在看到负面结果的信号时将其过滤到其日志中,从而滤除噪声,这不会产生干扰。
Pod日志很可能会被提取到ELK和Prometheus Operator堆栈中,在其中可以对其进行检测,发出警报,进行存储和绘制图形。

此外,请注意,没有什么可以阻止您实现两个用例。

答案 1 :(得分:0)

考虑到node-problem-detectorKubernetes addon,您需要在自己的Kubernetes服务器上install that addon

Kubernetes CLuster有addon-manager将使用它。

答案 2 :(得分:0)

你的意思是:如何安装它?

kubectl create -f https://github.com/kubernetes/node-problem-detector.yaml