运行 领事 docker 健康检查的问题
Issues with running a consul docker health check
正在 运行将 progrium/consul 容器与 gliderlabs/registrator 容器连接。我正在尝试创建运行状况检查以监控我的 docker 容器是启动还是关闭。但是我注意到一些非常奇怪的 activity 我能够进行健康检查。这是我用来创建健康检查的命令:
curl -v -X PUT http://$CONSUL_IP_ADDR:8500/v1/agent/check/register -d @/home/myUserName/health.json
这是我的 health.json 文件:
{
"id": "docker_stuff",
"name": "echo test",
"docker_container_id": "4fc5b1296c99",
"shell": "/bin/bash",
"script": "echo hello",
"interval": "2s"
}
首先我注意到这个检查会在容器正确停止时自动删除服务,但当容器不正确停止时(即在节点故障期间)不会执行任何操作。
其次我注意到 docker_container_id
根本无关紧要,此健康检查将自身附加到每个容器 运行ning 它所附加到的 consul 节点上。
我只想为领事节点上的每个 docker 容器 运行 进行一个有效的 tcp 或 http 健康测试 运行(是的,我知道我上面的 json 文件 运行 是一个脚本,我刚刚按照文档示例创建了该脚本)。我只希望 consul 能够判断容器是停止了还是 运行ning。我不希望我的服务在健康检查失败时自行删除。我该怎么做。
注意:我发现 consul documentation 对 Agent Health Checks 非常缺乏、模糊和不准确。所以请不要只是 link 告诉我去读它。我正在寻找关于如何正确设置 docker 健康检查的完整解释。
更新:这里是如何使用最新版本的官方 consul 容器启动 consul 服务器(现在是开发版本,很快我会用生产版本更新它):
#bootstrap server
docker run -d \
-p 8300:8300 \
-p 8301:8301 \
-p 8301:8301/udp \
-p 8302:8302 \
-p 8302:8302/udp \
-p 8400:8400 \
-p 8500:8500 \
-p 53:53/udp \
--name=dev-consul0 consul agent -dev -ui -client 0.0.0.0
#its IP address will then be the IP of the host machine
#lets say its 172.17.0.2
#start the other two consul servers, without web ui
docker run -d --name --name=dev-consul1 \
-p 8300:8300 \
-p 8301:8301 \
-p 8301:8301/udp \
-p 8302:8302 \
-p 8302:8302/udp \
-p 8400:8400 \
-p 8500:8500 \
-p 53:53/udp \
consul agent -dev -join=172.17.0.2
docker run -d --name --name=dev-consul2 \
-p 8300:8300 \
-p 8301:8301 \
-p 8301:8301/udp \
-p 8302:8302 \
-p 8302:8302/udp \
-p 8400:8400 \
-p 8500:8500 \
-p 53:53/udp \
consul agent -dev -join=172.17.0.2
# then heres your clients
docker run -d --net=host --name=client0 \
-e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' \
consul agent -bind=$(hostname -i) -retry-join=172.17.0.2
progrium/consul 图片有旧版本的 consul (https://hub.docker.com/r/progrium/consul/tags/),目前似乎没有维护。
consul请尽量使用当前版本的官方镜像https://hub.docker.com/r/library/consul/tags/
您还可以使用 registrator 在与您的服务相关的 consul 中注册支票。例如
SERVICE_[port_]CHECK_SCRIPT=nc $SERVICE_IP $SERVICE_PORT | grep OK
更多示例:http://gliderlabs.com/registrator/latest/user/backends/#consul
因此,使用任何版本的 consul 容器的解决方案是直接在主机上安装 consul。这可以通过以下步骤完成 https://sonnguyen.ws/install-consul-and-consul-template-in-ubuntu-14-04/:
sudo apt-get update -y
sudo apt-get install -y unzip curl
sudo wget https://releases.hashicorp.com/consul/0.6.4/consul_0.6.4_linux_amd64.zip
sudo unzip consul_0.6.4_linux_amd64.zip
sudo rm consul_0.6.4_linux_amd64.zip
sudo chmod +x consul
sudo mv consul /usr/bin/consul
sudo mkdir -p /opt/consul
cd /opt/consul
sudo wget https://releases.hashicorp.com/consul/0.6.4/consul_0.6.4_web_ui.zip
sudo unzip consul_0.6.4_web_ui.zip
sudo rm consul_0.6.4_web_ui.zip
sudo mkdir -p /etc/consul.d/
sudo wget https://releases.hashicorp.com/consul-template/0.14.0/consul-template_0.14.0_linux_amd64.zip
sudo unzip consul-template_0.14.0_linux_amd64.zip
sudo rm consul-template_0.14.0_linux_amd64.zip
sudo chmod a+x consul-template
sudo mv consul-template /usr/bin/consul-template
sudo nohup consul agent -server -bootstrap-expect 1 \
-data-dir /tmp/consul -node=agent-one \
-bind=$(hostname -i) \
-client=0.0.0.0 \
-config-dir /etc/consul.d \
-ui-dir /opt/consul/ &
echo 'Done with consul install!!!'
然后在你这样做之后创建你的 consul 健康检查 json 文件,可以找到关于如何做的信息 here. 在你创建你的 json 文件后,只需将它们放入/etc/consul.d
目录并使用 consul reload
重新启动 consul。如果在重新加载之后 consul 没有添加你的新健康检查,那么你的 json 文件的语法有问题。返回编辑它们并重试。
正在 运行将 progrium/consul 容器与 gliderlabs/registrator 容器连接。我正在尝试创建运行状况检查以监控我的 docker 容器是启动还是关闭。但是我注意到一些非常奇怪的 activity 我能够进行健康检查。这是我用来创建健康检查的命令:
curl -v -X PUT http://$CONSUL_IP_ADDR:8500/v1/agent/check/register -d @/home/myUserName/health.json
这是我的 health.json 文件:
{
"id": "docker_stuff",
"name": "echo test",
"docker_container_id": "4fc5b1296c99",
"shell": "/bin/bash",
"script": "echo hello",
"interval": "2s"
}
首先我注意到这个检查会在容器正确停止时自动删除服务,但当容器不正确停止时(即在节点故障期间)不会执行任何操作。
其次我注意到 docker_container_id
根本无关紧要,此健康检查将自身附加到每个容器 运行ning 它所附加到的 consul 节点上。
我只想为领事节点上的每个 docker 容器 运行 进行一个有效的 tcp 或 http 健康测试 运行(是的,我知道我上面的 json 文件 运行 是一个脚本,我刚刚按照文档示例创建了该脚本)。我只希望 consul 能够判断容器是停止了还是 运行ning。我不希望我的服务在健康检查失败时自行删除。我该怎么做。
注意:我发现 consul documentation 对 Agent Health Checks 非常缺乏、模糊和不准确。所以请不要只是 link 告诉我去读它。我正在寻找关于如何正确设置 docker 健康检查的完整解释。
更新:这里是如何使用最新版本的官方 consul 容器启动 consul 服务器(现在是开发版本,很快我会用生产版本更新它):
#bootstrap server
docker run -d \
-p 8300:8300 \
-p 8301:8301 \
-p 8301:8301/udp \
-p 8302:8302 \
-p 8302:8302/udp \
-p 8400:8400 \
-p 8500:8500 \
-p 53:53/udp \
--name=dev-consul0 consul agent -dev -ui -client 0.0.0.0
#its IP address will then be the IP of the host machine
#lets say its 172.17.0.2
#start the other two consul servers, without web ui
docker run -d --name --name=dev-consul1 \
-p 8300:8300 \
-p 8301:8301 \
-p 8301:8301/udp \
-p 8302:8302 \
-p 8302:8302/udp \
-p 8400:8400 \
-p 8500:8500 \
-p 53:53/udp \
consul agent -dev -join=172.17.0.2
docker run -d --name --name=dev-consul2 \
-p 8300:8300 \
-p 8301:8301 \
-p 8301:8301/udp \
-p 8302:8302 \
-p 8302:8302/udp \
-p 8400:8400 \
-p 8500:8500 \
-p 53:53/udp \
consul agent -dev -join=172.17.0.2
# then heres your clients
docker run -d --net=host --name=client0 \
-e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' \
consul agent -bind=$(hostname -i) -retry-join=172.17.0.2
progrium/consul 图片有旧版本的 consul (https://hub.docker.com/r/progrium/consul/tags/),目前似乎没有维护。
consul请尽量使用当前版本的官方镜像https://hub.docker.com/r/library/consul/tags/
您还可以使用 registrator 在与您的服务相关的 consul 中注册支票。例如
SERVICE_[port_]CHECK_SCRIPT=nc $SERVICE_IP $SERVICE_PORT | grep OK
更多示例:http://gliderlabs.com/registrator/latest/user/backends/#consul
因此,使用任何版本的 consul 容器的解决方案是直接在主机上安装 consul。这可以通过以下步骤完成 https://sonnguyen.ws/install-consul-and-consul-template-in-ubuntu-14-04/:
sudo apt-get update -y
sudo apt-get install -y unzip curl
sudo wget https://releases.hashicorp.com/consul/0.6.4/consul_0.6.4_linux_amd64.zip
sudo unzip consul_0.6.4_linux_amd64.zip
sudo rm consul_0.6.4_linux_amd64.zip
sudo chmod +x consul
sudo mv consul /usr/bin/consul
sudo mkdir -p /opt/consul
cd /opt/consul
sudo wget https://releases.hashicorp.com/consul/0.6.4/consul_0.6.4_web_ui.zip
sudo unzip consul_0.6.4_web_ui.zip
sudo rm consul_0.6.4_web_ui.zip
sudo mkdir -p /etc/consul.d/
sudo wget https://releases.hashicorp.com/consul-template/0.14.0/consul-template_0.14.0_linux_amd64.zip
sudo unzip consul-template_0.14.0_linux_amd64.zip
sudo rm consul-template_0.14.0_linux_amd64.zip
sudo chmod a+x consul-template
sudo mv consul-template /usr/bin/consul-template
sudo nohup consul agent -server -bootstrap-expect 1 \
-data-dir /tmp/consul -node=agent-one \
-bind=$(hostname -i) \
-client=0.0.0.0 \
-config-dir /etc/consul.d \
-ui-dir /opt/consul/ &
echo 'Done with consul install!!!'
然后在你这样做之后创建你的 consul 健康检查 json 文件,可以找到关于如何做的信息 here. 在你创建你的 json 文件后,只需将它们放入/etc/consul.d
目录并使用 consul reload
重新启动 consul。如果在重新加载之后 consul 没有添加你的新健康检查,那么你的 json 文件的语法有问题。返回编辑它们并重试。