如何重新启动容器?

时间:2017-01-03 21:48:01

标签: prometheus cadvisor

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

3 个答案:

答案 0 :(得分:5)

我使用以下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."}

rate()

  

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

rate(http_requests_total{job="api-server"}[5m])
  

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

     

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

kube_pod_container_status_restarts_total
  

指标类型:计数器

     

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

     

说明:每个吊舱的容器重新启动次数

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我使用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 }}\""

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

  • 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",...}
    
  • 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",...}
    

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

您可能需要将此示例调整为适用于具有多个副本的群集服务,但是您了解了如何计算唯一标签的想法。