监控服务状态

两种Health Check

agent一个很重要的功能是进行系统级别应用级别的健康检查。

上一节中,我们注册了web服务,它的状态在UI中显示为健康

image-20211017175603810

但在client端,根本没有在80端口跑任何应用,应用都不存在,何来健康一说呢?

这是因为consul只进行了系统级别的状态检测,从系统层面上来说,我们的client服务器是活跃的。

需要额外配置应用级别的健康检测。

应用级别的健康检测有以下几种方式:

  • Script + Interval,使用脚本或命令行定时检测应用状态,根据返回的结果进行判断。
  • HTTP + Interval,使用GET方式请求URL,根据返回码做判断
  • TCP + Interval,尝试与对应的IP+port建立TCP连接

我们下面将介绍使用script的方式来进行health check


Script Health Check

Check脚本可以做任何事情来确定服务的状态。唯一的限制是:退出代码必须遵循下面的约定:

  1. 0 – 正常
  2. 1 – 告警
  3. 其他值 - 失败。

脚本其他的输出都保存在notes字段中,可以供人查看。

将上一节client端的web.json文件进行更新,配置健康检测的逻辑:

{
  "service": {
    "name": "web",
    "port": 80,
    "check": {
    "args": [
        "curl",
        "127.0.0.1"
      ],
      "interval": "10s"
    }
  }
}

此时执行consul reload,发现报错如下

image-20211017180308897

这是因为,consul执行bash是危险的操作,默认没有开启脚本检查这种方式。


编辑 /home/ec2-user/consul/config/目录下的hcl文件,加入以下参数:

data_dir =  "/home/ec2-user/consul"
start_join = ["172.31.60.3"]
bind_addr = "172.31.58.144"
enable_script_checks = true  # 增加该行

重新启动consul:sudo systemctl restart consul


由于client的80端口没有运行任何应用,故service check会报错:

image-20211017181716472

此时进行服务查询,由于服务状态异常,故查不到结果:

image-20211017181917986


在client的80上运行nginx应用:

sudo amazon-linux-extras enable nginx1
sudo yum install nginx -y 
sudo systemctl start nginx

image-20211017182139478

由于80 端口已经有应用在运行,通过了script的状态检测:

image-20211017182210070