使用Docker Compose创建监控环境
我已经列举过很多监控docker容器的方法,以及可以使用Prometheus监控Rancher的部署情况。然而,到现在为止在众多的主机上启动监控agent,还是以一种人工的方式完成。随着Rancherbeta版本的发布,我们支持了调度(scheduling ),以及对docker容器编排(compose)的支持,我们可以进行许多自动化的监控设置。本文中我将介绍使用Rancher的新工具”Ranc
我已经列举过很多监控docker容器的方法,以及可以使用Prometheus监控Rancher的部署情况。然而,到现在为止在众多的主机上启动监控agent,还是以一种人工的方式完成。随着Rancher
beta版本的发布,我们支持了调度(scheduling ),以及对docker容器编排(compose)的支持,我们可以进行许多自动化的监控设置。本文中我将介绍使用Rancher的新工具”Rancher compose”
实现一键部署,使用Scheduling确保每台主机上的监控agent正常运行,同样使用标签(Labels)分离并展示我们指标。再次启用Prometheus展示容器的指标,Container-Exporter agent收集
各个Docker主机上的指标。如果你还不了解如何配置和使用Prometheus,请参考之前的文章:
http://rancher.com/docker-monitoring-continued-prometheus-and-sysdig/
http://rancher.com/implementing-service-monitoring-in-rancher-with-prometheus/
这篇文章的基础是假定你已经有一套部署好的Rancher环境。
1、安装Rancher Compose
安装Rancher Compose我们只需要从Rancher Server的界面上直接下载二进制安装包即可。在Rancher Server界面上打开Services标签页,点击屏幕右上角Rancher Compose CLI按钮。
然后选择你的操作系统类型下载各自的安装包。下载完成后,将安装包复制到(或者软连接) 你的路径目录。确认正常安装,可以使用如下验证命令:
ln -s /DOWNLOAD_LOCATION/rancher-compose-v0.1.2/rancher-compose /usr/bin
rancher-compose -h
2、创建示例项目模板
Compose安装完成后,为了部署环境我们还需要创建一些compose的模板。需要创建两个模板文件:docker-compose.yml定义启动包含我们services的容器所需的镜像(images)和参数;
rancher-compose.yml我们的容器是如何编排到服务的。
为了验证监控,我将创建一个包含三个服务的示例,分别为Database、Cache(缓存)和Web。我们将使用Mysql 镜像作为数据库服务,Memcahced作为缓存服务和Nginx作为web服务。
在Web服务前,我们将放置一个负载均衡,以分散我们的web容器的负载。这并不是一个功能强大的应用,特殊的镜像并不是我们关注的重点,我们关注的是监控和自动化部署。
2.1、Docker Compose
第一步是定义Compose模板来创建我们的Docker-compose文件,此文件用来定义我们那些Docker容器作为我们的服务。基于这个目的创建一个名为docker-compose.yml,然后以下面的规则
添加一个名称为Database的元素:
Database:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: ****
stdin_open: true
tty: true
根元素的名称将成为项目中服务的名称,我们需要指定:我们希望使用mysql的镜像,并且容器是运行在一个真正交互式的shell中。这些明细配置在docker compose文档中都能找到。最后,
依照Mysql镜像的要求,我们需要设置一个MYSQL_ROOT_PASSWORD的环境变量。
接下来参照下面的配置添加我们的缓存明细。我们指定Memcached容器镜像作为我们的缓存镜像。Memcached 容器不需要过多的配置,只需要配置镜像名称和指定交互模式即可。
cache:
image: memcached
stdin_open: true
tty: true
现在,我们可以把带有ngnix的web容器启动了,并且连接到之前我们启动的database容器和Memcached容器上。注意,我们将用参数foo和值bar来标注我们的web服务。我们可以随意定义这些
标签用于以后逻辑分组中的指标。
Web:
image: nginx
links:
- Database
- cache
labels:
foo: ‘bar’
stdin_open: true
tty: true
Web服务定义完成后,我们就可以创建负载均衡器,向web服务发送请求。我们指定负载均衡器监听公网地址的80端口。同样指定负载均衡器将会连接到名为web的服务上:
WebLB:
image: rancher/load-balancer-service
ports:
- 80:80
links:
- web
tty: true
stdin_open: true
2.2、Rancher Compose
Docker compose模板创建完成后,我们需要创建Rancher compose模板,从而指定我们的服务怎样进行编排。两个最简单的服务,database和caches服务都没有用到rancher的具体特点。创建
一个名为rancher-compose.yml文件,并且添加在文件中添加下面的两行内容。文件中我们定义database和cache服务均有3个容器:
database:
scale: 3
cache:
scale: 3
接下来我们配制web服务,包含与database和cache相同的容器数量参数。当然,我们还需要为web服务定义一套健康机制,以确保我们的web服务能够正确处理http请求。正确的http请求要
求每2000ms发送到80端口和根URI上面。如果有三次失败的请求,那么容器被标记为不可用或者容器已被删除。如果三个请求中有两个成功请求,那么容器又被定义为可用。
web:
scale: 3
health_check:
port: 80
interval: 2000
unhealthy_threshold: 3
request_line: GET / HTTP/1.0
healthy_threshold: 2
response_timeout: 2000
Web服务创建完成后,我们可以创建一个负载均衡器,用于给web服务发送请求。负载均衡器与之前我们定义的容器参数一致。此外,需要配置一个load_balancer_config文件,用来确认
哪一个容器可以提供正常的负载和会话服务。
WebLB:
scale: 3
load_balancer_config:
lb_cookie_stickiness_policy: null
description: null
name: WebLB config
app_cookie_stickiness_policy: null
health_check:
port: null
interval: 2000
unhealthy_threshold: 3
request_line: GET / HTTP/1.0
healthy_threshold: 2
response_timeout: 2000
完整的文件配置请参见:
docker-compose
https://gist.github.com/usmanismail/d313a76426784b07ff67
rancher-compose
https://gist.github.com/usmanismail/03ac5754c4b4ff8b5334
2、创建Rancher Project
到目前为止我们创建了Docker compose模板和Rancher compose模板,接下来我们就可以创建一键创建我们的project。为了达到目的,你首先需要创建一个Access Key和Secret Key,用于调用Racher API。点击屏幕配置菜单,右上角上选择API & Keys。点击后屏幕出现创建一个新Key/Secret密钥对。为了管理多个key文件,可以选择一个逻辑名称作为key的名称,同时你需要
记录秘钥,因为后续这个秘钥就不会再次生成了。
使用上面产生的秘钥对,加上你的Rancher服务器(名称或者IP),组成一个完整的project,同时也要加上我们的4个服务和负载均衡器。注意必须在docker-compose.yml和compose.yml的当
前目录下运行此命令。
rancher-compose \
–url http://RANCHER_SERVER_HOST:8080/v1/
–access-key EF3599AF954334AE18C1
–secret-key GQu2U4oZYfCV1o5jnN93XNuD7KXGAq7H
–project-name PROJECT_NAME create
打开projec的连接地址http://RANCHER_SERVER_HOST:8080/static/services/projects。起初我们没有在主机上运行容器时,所有服务都是停止状态。如果主机开始运行,那么你就可以点
击View Graph选项卡,查看你所有的服务。现在负载均衡器已经连接到Web服务中,而且Web服务是连接到cache和database服务上的。这些连接是不可计数的,在任何一个连接服务上你都可以使用DNS lookup查找链接服务名称,并且可以获取到一个DNS记录,这条DNS记录就是容器中服务的私有IP。
3、创建Monitoring Service模板
现在我们测试app建立好了,接下来为了确保所有的监控agent都已在主机上启动,需要启动一个监控服务。我们将使用Rancher的全局调度功能,以确保有这个容器在每台主机中都运行着
一个实例。为了查看我们的定义的指标,我们需要部署一台运行了Prometheus服务的主机。
docker-compose.yml
配置监控服务,我们将用到我们自行创建的一个出口容器。需要将cgroup和socket文件挂载到容器中。另外,我们需要定义出口容器能够识别的标签。进一步我们需要配置服务用来展示服务
rancher服务名称和rancher工程名称以及用户标签‘foo’。这些标签将针对主机和Docker标签的值,将被添加到Prometheus指标中进行检查。同样添加两个Rancher标签到我们的服务中;
io.rancher.scheduler.global指定一个容器的实例在所有主机上运行。io.rancher.scheduler.affinity:host_label,当monitored=true时限制已被标记的主机。如果你想监控所有的主机,
可以忽略第二个标签。请注意,不久以后,服务必须调用监测服务发现Prometheus服务器。
monitoring:
image: usman/container-exporter:v1
command: “-labels=io.rancher.project.name,io.rancher.project_service.name,io.rancher.container.system,foo”
labels:
io.rancher.scheduler.global: ‘true’
io.rancher.scheduler.affinity:host_label: monitored=true
volumes:
- /sys/fs/cgroup:/cgroup
- /var/run/docker.sock:/var/run/docker.sock
stdin_open: true
tty: true
我们现在可以配置Prometheus服务器从不同的容器出口获取指标。我们这样做是使用我定义的用于此目的的容器镜像。我们链接监控服务到Prometheus服务器,它使我们能够查询嵌入式DNS服务器
监管容器IP地址。使用这些IPs我们将动态生成Prometheus目标配置。此配置每隔30秒加载一次,因此,如果您添加或删除多个主机,他们将被Prometheus监控。
prometheus:
ports:
- 9090:9090/tcp
image: usman/prometheus
links:
Monitoring: monitoring
stdin_open: true
tty: true
Rancher Compose.yml
Rancher compose yaml文件的生成配置是非常简单的,我们只需要一个容器来定义监控服务和Prometheus服务。
monitoring:
scale: 1
prometheus:
scale: 1
完整的文件可在以下链接获取:
docker-compose
https://gist.github.com/usmanismail/db03952d60cd40dec27a
rancher-compose
https://gist.github.com/usmanismail/f72c4bd2e363ed163247
4、创建Monitoring服务
参照前面的项目,我们将使用rancher compose创建监测项目。监测项目与它的两个服务的图形视图如下所示。注意,这个监控服务和相关的compose模板可以与任何项目中使用。不论容器
属于哪个服务,每台监控主机都会运行一个监控容器来监控。
rancher-compose \
–url http://RANCHER_SERVER_HOST:8080/v1/
–access-key EF3599AF954334AE18C1
–secret-key GQu2U4oZYfCV1o5jnN93XNuD7KXGAq7H
–project-name monitoring create
5、启动tagged主机
因为我们的项目和服务定义,我们现在需要登录主机,这样我们就可以启动我们的容器。登录主机浏览基础设施>主机 >主机添加主机并选择一个云提供商或自定义客户端来认证一个新的主机。无论你在哪里登录主机都要确保添加标签监控= true。这将保证一个监控代理登录这个主机。例如运行自定义docker运行命令来启登录主机机如下所示。
sudo docker run -e CATTLE_HOST_LABELS=’monitored=true’ -d –privileged -v /var/run/docker.sock:/var/run/docker.sock rancher/agent:v0.7.9 http://RANCHER_SERVER_HOST:8080/v1/scripts/456FC30268A2806931DA:1434506400000:mg7x0OvhK7wVjUyZ74hZAPcaNIo
当你有几个主机回到服务页面http://RANCHER_SERVER_HOST/static/services/projects,并且所有服务通过点击相应的链接启动。这些服务就会在几分钟内把容器扩展到所需数量。一旦你开始监控服务浏基础设施>主机 注意会让每个主机的监控容器有且只有一个实例的。注意如果您删除任何监控容器Rancher将自动启动一个替换它。
生成Prometheus 图
几分钟后所有的服务都启动了以后您可以点击Prometheus容器展示详细信息页面来查找它的主机IP。在浏览器中浏览到http:/ / PROMETHEUS_HOST_IP:9090 /弹出UI。,单击“图表”选项卡数据生成图表。你现在可以输入查询表达式文本框并点击创建画图。我们可以把结果基于项目、服务系统服务等也可以自定义标签。各种查询的例子如下所示:
将指标分为不同的项目使用io_rancher_project_name标签。例如下面的查询显示所有容器的CPU使用率MyApp1项目。
container_cpu_usage_seconds_total { io_rancher_project_name = ” MyApp1 ” }
同样,为了区分服务器名称可以使用io_rancher_project_service_name这标签l。例如以下查询显示的是3个容器的最大内存使用。
container_memory_max_usage_bytes { io_rancher_project_service_name = ” MyApp1 /Monitoring” }
你也可以用io_rancher_container_system来区分数据和用户的容器,空值在这个标签意味着容器是一个用户。因此我们可以使用下面的命令来查看我们部署的容器总数。
count(container_last_seen{io_rancher_container_system=””})
最后,我们可以和Racher标签一样根据自定义标签区分指标,如果你还记得早些时候我们标记web服务节点与自定义标签goo=bar。们现在可以使用标签来查询指标,例如下面的命令可以展示所有带有foo=bar标签的的错误页。
container_memory_paging_total{foo=”bar”,type=”pgpgout”}
总结
今天,我们定义了一个完整的部署Docker和Rancher compose,这样我们可以用一个命令把整个副本。和之前我们的服务冗余和更新一样,我诞生这个灵感是为了测试。此外作为部署的一部分,我们使用全局调度,确保我们有一个对所有主机的监控代理的实例。最后,使用Rancher的服务发现功能服务器启用动态地发现监控代理并且拉取指标。使用这个我们可以创建仪表板显示重要的信息关于我们的部署或创建警报当容器失败。(注意如何创建仪表板和警报的细节可以在早期文章中找到)。管理micro-service是一项复杂的任务,你必须跟踪许多不同的服务,不同的生命周期,可伸缩性和可用性需求。在这种情况下详细的监测是必要的,基于Docker部署可以更简单的设置自定义这些部署和自动化监测的容器的监控。
更多推荐
所有评论(0)