1. 开启docker metrics API特性
注意使用的docker版本必须为1.13
# 编辑docker daemon启动选项
vim /etc/docker/daemon.json
该文件修改内容如下:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"insecure-registries":["10.45.10.31:5000"],
"experimental": true,
"metrics-addr": "0.0.0.0:4999"
}
解释:
- 第一行指明了第三方docker hub mirror,加速访问。这里采用中国科学技术大学mirror
- 第二行指明注册的私人registry
- 第三第指明开启试验性特性
- 第四行指明docker metrics的访问端口
2 创建服务(会自动下载镜像)
在swarm manager node上创建如下服务:
#1. 设定overlay网络,用于跨节点的容器网络访问
docker \
network create --driver overlay monitoring
#2. cadvisor服务,用于提供容器的资源使用率、性能等监控指标
docker \
service create --name cadvisor \
--mode global \
--network monitoring \
--label com.docker.stack.namespace=monitoring \
--container-label com.docker.stack.namespace=monitoring \
--mount type=bind,src=/,dst=/rootfs:ro \
--mount type=bind,src=/var/run,dst=/var/run:rw \
--mount type=bind,src=/sys,dst=/sys:ro \
--mount type=bind,src=/var/lib/docker/,dst=/var/lib/docker:ro \
google/cadvisor:v0.24.1
#3. node-exporter服务,暴露节点相关的内容给prometheus,用于监控
docker \
service create --name node-exporter \
--mode global \
--network monitoring \
--label com.docker.stack.namespace=monitoring \
--container-label com.docker.stack.namespace=monitoring \
--mount type=bind,source=/proc,target=/host/proc \
--mount type=bind,source=/sys,target=/host/sys \
--mount type=bind,source=/,target=/rootfs \
--mount type=bind,source=/etc/hostname,target=/etc/host_hostname \
-e HOST_HOSTNAME=/etc/host_hostname \
basi/node-exporter \
-collector.procfs /host/proc \
-collector.sysfs /host/sys \
-collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)" \
--collector.textfile.directory /etc/node-exporter/ \
--collectors.enabled="conntrack,diskstats,entropy,filefd,filesystem,loadavg,mdadm,meminfo,netdev,netstat,stat,textfile,time,vmstat,ipvs"
#4. docker-exporter服务,用于将docker metrics API得到的监控指标暴露给prometheus。注意下面的172.18.0.1是桥接容器的网关地址。默认一般都是这个。
docker \
service create \
--mode global \
--name docker-exporter \
--network monitoring \
--publish 4999 \
-e IN=172.18.0.1:4999 \
basi/socat:v0.1.0
#5. alertmanager用于对监控指标进行告警
docker \
service create --name alertmanager \
--network monitoring \
--label com.docker.stack.namespace=monitoring \
--container-label com.docker.stack.namespace=monitoring \
--publish 9093:9093 \
-e "SLACK_API=https://hooks.slack.com/services/TOKEN-HERE" \
-e "LOGSTASH_URL=http://logstash:8080/" \
basi/alertmanager \
-config.file=/etc/alertmanager/config.yml
#6. prometheus是监控系统,内含时序数据库,能接入各种metrics,用图形展示。
docker \
service create \
--name prometheus \
--network monitoring \
--label com.docker.stack.namespace=monitoring \
--container-label com.docker.stack.namespace=monitoring \
--publish 9090:9090 \
basi/prometheus-swarm \
-config.file=/etc/prometheus/prometheus.yml \
-storage.local.path=/prometheus \
-web.console.libraries=/etc/prometheus/console_libraries \
-web.console.templates=/etc/prometheus/consoles \
-alertmanager.url=http://alertmanager:9093
#7. prometheus的图形展示比较渣,用grafana整合下,更加美观
docker \
service create \
--name grafana \
--network monitoring \
--label com.docker.stack.namespace=monitoring \
--container-label com.docker.stack.namespace=monitoring \
--publish 3000:3000 \
-e "GF_SERVER_ROOT_URL=http://grafana.${CLUSTER_DOMAIN}" \
-e "GF_SECURITY_ADMIN_PASSWORD=yourPassword" \
-e "PROMETHEUS_ENDPOINT=http://prometheus:9090" \
-e "ELASTICSEARCH_ENDPOINT=$ES_ADDRESS" \
-e "ELASTICSEARCH_USER=$ES_USERNAME" \
-e "ELASTICSEARCH_PASSWORD=$ES_PASSWORD" \
basi/grafana
我这里五台机器,创建成功在swarm manager查看服务如下:
3. 查看prometheus
发现需要监控的目标都已经被prometheus管理即可:
点击graph按照如下操作
4. grafana
默认的管理员账号为admin,密码由GF_SECURITY_ADMIN_PASSWORD环境变量指定。
4.1 增加promethus数据源
填写具体内容,注意这里url不要填写IP,填写容器的名字。毕竟IP是可以变动的,灵活性差。
好了之后点击上面的Dashborads,并且点击蓝色的import,就导入了promethus的仪表盘了。仪表盘的内容是prometheus程序本身的一些监控指标。
4.2 增加docker metrics仪表盘
非常幸运的,basi/prometheus-swarm的作者提供了grafana的配置模板,直接导入即可用。下载地址:Docker Engine Metrics
在grafana里面选择导入新的仪表盘:
直接导入刚才下载的文件即可:
接下来就看到prometheus的一些监控指标就在grafana里面呈现了。自己可以增加其他ROW。
参考资料:
您好,我于2018.10.13使用您的配置配置普罗米修斯,用的是18.06.1-ce版的docker,结果在第二步cadvisor服务就创建失败 Error response from daemon: rpc error: code = InvalidArgument desc = ContainerSpec: " " is not a valid repository。