Consul Health Check

4,553 阅读3分钟

Agent的一个重要角色是管理系统级和应用级的健康检查。

健康检查可以通过在配置文件中定义或是通过HTTP接口添加。

Script + Interval

脚本检查机制通过执行程序外的脚本。脚本输出限制为4KB,超过的将被截取。检查脚本会被配置一个超时时间(缺省为30s)。当检查超时后Consul会强制杀掉脚本或是任何子进程。Consul 0.9.0后,script checks不在是缺省的检查机制,可以通过配置enable_local_script_checks或是enable_script_checks启用:

  • enable_local_script_checks: enable script checks defined in local config files. Script checks defined via the HTTP API will not be allowed.
  • enable_script_checks: enable script checks regardless of how they are defined.

检查脚本可以执行任何操作来确定检查的状态,但唯一限制的是退出必须遵守:

  • Exit code 0 - Check is passing
  • Exit code 1 - Check is warning
  • Any other code - Check is failing
{
  "check": {
    "id": "mem-util",
    "name": "Memory utilization",
    "args": ["/usr/local/bin/check_mem.py", "-limit", "256MB"],
    "interval": "10s",
    "timeout": "1s"
  }
}

HTTP + Interval

HTTP检查机制是通过向指定的URL发起GET请求,服务的状态依赖HTTP请求的状态码:

  • 2xx - passing
  • 429 - Too ManyRequests is a warning
  • other - failure

与使用Curl或是外部进程检查的健康检查机制相比,HTTP检查机制应该是首选的。默认检查请求是GET请求,可以通过添加参数到请求头。另外,请求的超时时间为10s,请求的输出大小限制为4KB,超过的同一会被截取。HTTP请求正常TLS。默认需要配置TLS证书,提供通过配置tls_skip_verify为true跳过检查。

{
  "check": {
    "id": "api",
    "name": "HTTP API on port 5000",
    "http": "https://localhost:5000/health",
    "tls_skip_verify": false,
    "method": "POST",
    "header": {"x-foo":["bar", "baz"]},
    "interval": "10s",
    "timeout": "1s"
  }
}

TCP + Interval

TCP检查机制通过与指定的IP/hostname + 端口监理TCP连接,如果hostname没有指定缺省访问"localhost"。服务的状态通过连接是否建立成功来判断。相比外部脚本检查,更建议选择TCP检查机制。可以通过配置timeout配置TCP连接建立超时限制。

{
  "check": {
    "id": "ssh",
    "name": "SSH TCP on port 22",
    "tcp": "localhost:22",
    "interval": "10s",
    "timeout": "1s"
  }
}

Time to Live (TTL)

TTL检查机制保留了给定的TTL(生命周期)的最新的状态,这些状态必须通过HTTP接口定时进行更新。如果外部系统在给定的TTL中更新状态失败,检查检查也表示为失败。这种机制在概念上类似于a dead man's switch,依赖应用主动上报他自己的监控状态。

{
  "check": {
    "id": "web-app",
    "name": "Web App Status",
    "notes": "Web app does a curl internally every 10 seconds",
    "ttl": "30s"
  }
}

Docker + Interval

Docker检查机制(可以理解为容器的监控检查)Docker机制依赖触发一同被打包进容器的外部应用程序。这些应用可以在容器外通过Docker Exec API进行触发。通过配置enable_script_checks使用Docker健康检查机制。

{
  "check": {
    "id": "mem-util",
    "name": "Memory utilization",
    "docker_container_id": "f972c95ebf0e",
    "shell": "/bin/bash",
    "args": ["/usr/local/bin/check_mem.py"],
    "interval": "10s"
  }
}

gRPC + Interval

gRPC检查机制需要应用实现了gRPC的标准。gRPC health checking protocol

{
  "check": {
    "id": "mem-util",
    "name": "Service health status",
    "grpc": "127.0.0.1:12345",
    "grpc_use_tls": true,
    "interval": "10s"
  }
}

Alias

别名检查机制是依赖另一个已注册节点或是服务的运行状态反应自生的状态。

{
  "check": {
    "id": "web-alias",
    "alias_service": "web"
  }
}

所有类型的健康检查必须提供nameidnotes字段可选。每个agent的ID必须是唯一的,consul只会注册具有ID最后定义的检查。