如何重新启动容器?

qin*_*ong 12 prometheus cadvisor

我喜欢使用Prometheus和cAdvisor监视容器,这样当容器重启时,我会收到警报.我想知道是否有人为此提供样本普罗米修斯警报.

val*_*ala 12

以下 PromQL 查询返回在过去 10 分钟内重新启动的容器。它还显示每个返回容器在过去 10 分钟内的重新启动次数:

(sum(increase(kube_pod_container_status_restarts_total[10m])) by (container)) > 0
Run Code Online (Sandbox Code Playgroud)

方括号中的后视窗口(10m在上面的查询中)可以根据特定需求进行调整。有关lookbehind 窗口接受的可能值,请参阅这些文档。

该查询按以下方式工作:

  • 该指标由kube-state-metricskube_pod_container_status_restarts_total公开,默认情况下包含在 Kubernetes 中。有关公开的 Pod 级别指标,请参阅这些文档。
  • 内部increase(kube_pod_container_status_restarts_total[10m])计算最近10分钟内容器重启的次数。有关increase()函数,请参阅文档。
  • 外部sum(...) by (container)仅用于去除container结果中除标签之外的所有标签。请参阅sum()文档。
  • 然后将结果与 0 进行比较> 0。这会过滤掉过去 10 分钟内零重启的容器。请参阅比较运算符的文档


che*_*tts 9

如果您在 Kubernetes 中运行,您可以部署kube-state-metrics发布 pod 重启指标的容器:https : //github.com/kubernetes/kube-state-metrics

  • kube_pod_container_status_restarts_total 应监视重新启动。请参阅 https://github.com/kubernetes/kube-state-metrics/blob/master/docs/pod-metrics.md 以供参考。 (2认同)

小智 8

我使用以下Prometheus警报规则来查找一个小时内可以重启的容器(可以修改为最大时间),这可能对您有所帮助。

普罗米修斯警报规则样本

ALERT ContainerRestart/PodRestart
IF rate(kube_pod_container_status_restarts[1h]) * 3600 > 1
FOR 5s
LABELS {action_required = "true", severity="critical/warning/info"}
ANNOTATIONS {DESCRIPTION="Pod {{$labels.namespace}}/{{$labels.pod}} restarting more than once during last one hours.",
SUMMARY="Container {{ $labels.container }} in Pod {{$labels.namespace}}/{{$labels.pod}} restarting more than once times during last one hours."}
Run Code Online (Sandbox Code Playgroud)

率()

rate(v range-vector)计算范围向量中时间序列的每秒平均增长率。单调性中断(例如由于目标重启而导致的计数器重置)会自动调整。同样,计算会外推到时间范围的末尾,从而允许遗漏刮擦或刮擦周期与该范围的时间段不完全对齐。以下示例表达式返回范围向量中每个时间序列最近5分钟内测得的HTTP请求的每秒速率:

rate(http_requests_total{job="api-server"}[5m])
Run Code Online (Sandbox Code Playgroud)

费率只能与计数器一起使用。它最适合于警报以及慢速计数器的图形显示。

请注意,在将rate()与聚合运算符(例如sum())或随时间推移聚合的函数(任何以_over_time结尾的函数)组合在一起时,请始终先获取rate(),然后再进行聚合。否则,当目标重新启动时,rate()无法检测到计数器重置。

kube_pod_container_status_restarts_total
Run Code Online (Sandbox Code Playgroud)

公制类型:计数器

标签/标签: container =容器名称,namespace = pod名称空间,pod = pod名称

描述:每个容器的容器重新启动次数

  • 仅供参考,如果您要执行 `rate(...[1h]) * 3600`,则可以对相同的数字执行 `delta(...[1h])`。 (4认同)

小智 8

我使用 Compose 和 Swarm 部署,因此 Kubernetes 答案不是一个选项。所以我就制定了这个规则。

- alert: Container (Compose) Too Many Restarts
  expr: count by (instance, name) (count_over_time(container_last_seen{name!="", container_label_restartcount!=""}[15m])) - 1 >= 5
  for: 5m
  annotations:
    summary: "Too many restarts ({{ $value }}) for container \"{{ $labels.name }}\""

- alert: Container (Swarm) Too Many Restarts
  expr: count by (instance, container_label_com_docker_swarm_service_name) (count_over_time(container_last_seen{container_label_com_docker_swarm_service_name!=""}[15m])) - 1 >= 5
  for: 5m
  annotations:
    summary: "Too many restarts ({{ $value }}) for container \"{{ $labels.container_label_com_docker_swarm_service_name }}\""
Run Code Online (Sandbox Code Playgroud)

基本上,两者的工作方式相同。每个服务有多个记录,但具有不同的标签。

  • 撰写除了container_label_restartcount标签之外都是相同的
{instance="instance1",name="service1",container_label_restartcount="1",...}
{instance="instance1",name="service1",container_label_restartcount="2",...}
{instance="instance1",name="service1",container_label_restartcount="3",...}
Run Code Online (Sandbox Code Playgroud)
  • Swarm 看起来有点不同,因为重新启动服务时会创建新容器(例如,运行状况检查失败)。name标签已更改,container_label_com_docker_swarm_service_name充当服务名称。
{instance="instance1",name="service1.1.<hash1>",container_label_com_docker_swarm_service_name="service1",...}
{instance="instance1",name="service1.1.<hash2>",container_label_com_docker_swarm_service_name="service1",...}
{instance="instance1",name="service1.1.<hash3>",container_label_com_docker_swarm_service_name="service1",...}
Run Code Online (Sandbox Code Playgroud)

因此,我们的想法只是计算每个实例和名称的唯一记录。我个人认为为每次重启发送警报是错误的并且没有用。5我选择在一段时间内重新启动多次时发出警报15m。在我的规则中,我container_last_seen随机使用了度量,这实际上并不重要,因为计数是通过标签的差异来完成的。我们只需要一个持久的指标。另外,请注意- 1表达式末尾的 。我们必须对 进行 substruct 1,因为我们正在计算唯一记录,因此如果您的容器正在运行,则始终至少有一个记录。

您可能需要针对具有多个副本的集群服务调整此示例,但您知道如何计算唯一标签。