容器服务的监控,注册与发现
一,容器监控系统介绍
1.1 Influxdb
InfluxDB是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及执行分析。
- 特性
- 内置HTTP API,所以不用再写服务端代码来启动和运行
- 数据可以被标记,允许非常灵活的查询
- 类似SQL的查询语句
- 安装和管理简单,数据输入和输出速度块
- 它旨在实时响应查询。这意味着point数据写入即被索引并立即可供响应时间应小于100ms的查询使用。
1.2 cAdvisor
cAdvisor是一款google开源的数据收集工具。但是它默认只显示实时数据,不储存历史数据。因此,为了存储和显示历史数据,自定义展示图,可以将cAdvisor与Influxdb+Grafana集成起来使用。
1.3 Grafana
Grafana是一个开源的度量分析与可视化套件。经常被用作基础设施的时间序列数据和应用程序分析的可视化,它在其他领域也被广泛的使用包括工业传感器,家庭自动化,天气和过程控制等。
Grafana支持许多不同的数据源。每个数据源都有一个特定的查询编辑器,该编辑器定制的特性和功能是公开的特定数据来源。
官方支持以下数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB。
每个数据源的查询语言和能力都是不同的。你可以把来自多个数据源的数据组合到一个仪表板,但每一个面板被绑定到一个特定的数据源,它就属于一个特定的组织。
1.4 Influxdb+cAdvisor+Grafana组合
二,构建容器监控系统入门
首先启动IPV4转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
2.1 安装及配置docker-ce
yum -y install yum-utils device-mapper-persistent-data lvm2
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl start docker
systemctl enable docker
vim /etc/docker/daemon.json
cat /etc/docker/daemon.json
{
"registry-mirrors":[ "https://registry.docker-cn.com" ]
}
systemctl daemon-reload
systemctl restart docker
2.2 下载和启动Influxdb
docker pull tutum/influxdb
docker network create monitor
docker network ls
docker run -d --name influxdb --net monitor -p 8083:8083 -p 8086:8086 tutum/influxdb
docker ps -a
通过浏览器访问
http://192.168.200.70:8083
进入Influxdb的管理界面,如下
2.3 下载和启动cAdvisor
docker pull google/cadvisor
docker images
docker run -d --name=cadvisor --net monitor -p 8081:8080 --mount type=bind,src=/,dst=/rootfs,ro --mount type=bind,src=/var/run,dst=/var/run --mount type=bind,src=/sys,dst=/sys,ro --mount type=bind,src=/var/lib/docker/,dst=/var/lib/docker,ro google/cadvisor -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxdb:8086
docker ps -a
通过浏览器访问
http://192.168.200.70:8081
进入cAdvisor管理界面,如下
2.4 下载和启动Grafana
docker pull grafana/grafana
docker images
docker run -d --name grafana --net monitor -p 3000:3000 grafana/grafana
docker ps -a
通过浏览器访问
http://192.168.200.70:3000
默认用户:admin 默认密码:admin
进入Grafana管理界面,如下
三,配置容器监控系统
3.1 向Influxdb中创建一个库"cadvisor",用来给cadvisor来存储数据
3.2 向Influxdb中创建一个用户,用来给cadvisor来访问
用户:grafana
密码:grafana
3.3 在Grafana中添加数据库源地址
3.4 创建一个仪表盘
四,容器服务的自动注册与发现
4.1 什么是微服务
微服务是众多能够独立运行,独立部署,独立提供访问的服务程序。
这些独立的程序可以单独运行提供某方面的服务,也可以通过分布式的方式调用各自提供的API接口进行集群组合式服务。
就如同之前我们安装的容器监控系统,它是通过InfluxDB+cAdvisor+Grafana组合来实现的。这三个软件服务都可以独立部署,独立运行,并都有独立提供外部访问的web界面。可以分拆来使用(搭配别的微服务软件进行组合),也可以通过各自的API接口进行串联集群式访问。
4.2 什么是服务发现
微服务的框架体系中,服务发现是不能不提的一个模块。我们来看下图:
- 上图中,左图的客户端的一个借口,需要调用服务A-D。客户端必须要知道所有服务的网络位置的,以往的做法是配置在配置文件中,或者有些配置在数据库中。这里就带出几个问题:
- 需要配置N个服务的网络位置,加大配置的复杂性
- 服务的网络位置变化,都需要改变每个调用者的配置
- 集群的情况下,难以做负载(反向代理的方式除外)
总结起来一句话:服务多了,配置很麻烦,问题多多
- 上图中,右图多加了个服务发现模块。服务A-D把当前自己的网络位置注册到服务发现模块,服务发现就以K-V的方式记录下,K一般是服务名,V就是IP:PORT。服务发现模块定时的轮询查看这些服务能不能访问的了(这就是健康检查)。客户端在调用服务A-D的时候,就跑去服务发现模块问下他们的网络位置,然后再调用他们的服务。这样的方式是不是就可以解决之前的问题了呢?客户端完全不需要记录这些服务网络位置,客户端和服务端完全解耦!
4.3 Consul 是什么?
Consul是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由HashiCorp公司用Go语言开发,基于Mozilla Public License 2.0的协议进行开源。Consul支持健康检查,并允许HTTP和DNS协议调用API存储键值对。
4.4 Consul的使用场景
- docker实例的注册与配置共享
- coreos实例的注册与配置共享
- vitess集群
- SaaS应用的配置共享
- 与confd服务集成,动态生成nginx和haproxy配置文件
4.5 Consul的优势
- 使用Raft算法来保证一致性,比复杂的Paxos算法更直接。相比较而言,zookeeper采用的是Paxos,而etcd使用的则是Raft
- 支持多数据中心,内外网的服务采用不同的端口进行监听。多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟,分片等情况。zookeeper和etcd均不提供多数据中心功能的支持。
- 支持健康检查,etcd不提供此功能。
- 支持http和dns协议接口。zookeeper的集成较为复杂,etcd只支持http协议。
- 官方提供web管理界面,etcd无此功能。
综合比较,Consul作为服务注册和配置管理的新星,比较值得关注和研究。
容器服务的监控,注册与发现所有源码包
链接:https://pan.baidu.com/s/1E7dTmKvbMRtGZ95OtuF2fw
提取码:z8ly
4.6 Consul服务器端的安装和部署(上方有下载链接)
consul下载地址:https://www.consul.io/downloads.html
主机名 IP 用途
registrator-server 192.168.200.70 consul注册服务器
解压安装consul
tar xf consul_1.2.1_linux_amd64.tar.gz
mv consul /usr/bin/
ll /usr/bin/consul
chmod +x /usr/bin/consul
部署并启动consul
consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.200.70 -client=0.0.0.0 -node=server01 &>/var/log/consul.log &
netstat -antup | grep consul
tcp6 0 0 :::8500 :::* LISTEN 18866/consul #这是对外访问端口
浏览器访问
192.168.200.70:8500
4.7 consul的基本使用
(1)通过Linux命令获取信息
查看集群节点信息
consul members
查看集群节点的服务端位置
consul info | grep leader
查看集群注册的服务信息
consul catalog services
(2)本地模拟进行注册
curl -X PUT -d '{"id":"jetty","name":"service_name","adress":"192.168.200.70","port":8080,"tags":["test"],"checks":[{"http":"http://192.168.200.70:8080/","interval":"5s"}]}' http://192.168.200.70:8500/v1/agent/service/register
(3)通过HTTP API获取集群信息
查看集群节点成员
curl 192.168.200.70:8500/v1/status/peers
查看集群服务端位置
curl 192.168.200.70:8500/v1/status/leader
查看注册的所有服务
curl 192.168.200.70:8500/v1/catalog/services
查看nginx服务信息
curl 192.168.200.70:8500/v1/catalog/services/nginx
集群节点详细信息
curl 192.168.200.70:8500/v1/catalog/nodes
五,Docker+Registrator+Consul实现容器服务自动加入Nginx集群
- consul-template:一个守护程序,用于实时查询consul集群数据,并更新文件系统上的任意数量的指定模板,生成配置文件,更新完成后可以选择运行任何Shell命令。
- gliderlabs/registrator:检查容器运行状态自动注册和注销Docker容器的服务到服务配置中心。目前支持Consul,etcd和SkyDNS2。
https://github.com/hashicorp/consul-template
主机名 | IP | 用途 |
---|---|---|
registartor-server | 192.168.200.70 | consul注册服务器 |
nginx-LB | 192.168.200.86 | nginx反向代理服务器 |
docker-client | 192.168.200.87 | nginxWeb节点服务器 |
5.1 nginx-LB服务器安装consul-template(consul客户端)
ls
unzip consul-template_0.19.3_linux_amd64.zip
mv consul-template /usr/bin/
which consul-template
5.2 nginx-LB服务器安装nginx
yum -y install gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel
tar xf nginx-1.10.2.tar.gz -C /usr/src/
cd /usr/src/nginx-1.10.2/
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module && make && make install
5.3 nginx-LB配置consul服务支持的nginx配置文件模板
制作consul支持的nginx配置文件模板
mkdir -p /consul-tml
cd /consul-tml/
vim nginx.ctmpl
cat nginx.ctmpl
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream http_backend {
ip_hash;
{{ range service "nginx" }} #获取服务nginx
server {{ .Address }}:{{ .Port }}; #循环罗列所属服务的IP和端口
{{ end }}
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://http_backend;
}
}
}
启动consul-template
nohup consul-template -consul-addr 192.168.200.70:8500 -template /consul-tml/nginx.ctmpl:/usr/local/nginx/conf/nginx.conf:"/usr/local/nginx/sbin/nginx -s reload" 2>&1 >/consul-tml/consul-template.log &
查看nginx配置文件
cat /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream http_backend { #还没有任何容器节点注册,因此这里没东西
ip_hash;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://http_backend;
}
}
}
netstat -antup | grep nginx #配置文件里没有web节点因此nginx没有启动成功
5.4 在Docker客户端上启动nginxWeb容器作为节点,并启动registrator进行服务注册
开启ipv4网卡转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
下载并启动nginxWeb01容器节点
docker pull nginx
mkdir -p /www/html
echo "
hostname -I
sl.yunjisuan.com" >> /www/html/index.htmldocker run -dit --name nginxWeb01 -p 80:80 --mount type=bind,src=/www/html,dst=/usr/share/nginx/html nginx
模拟web访问
curl localhost
下载并启动registrator容器进行自动注册
docker pull gliderlabs/registrator
docker run -d --name=registrator -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest -ip=192.168.200.87 consul://192.168.200.70:8500
浏览器查看
在nginx-LB上查看nginx反向代理配置文件渲染情况
如果没有启动nginx,需要先启动
/usr/local/nginx/sbin/nginx
cat /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream http_backend {
ip_hash;
server 192.168.200.87:80; #已经有注册的web容器地址了
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://http_backend;
}
}
}
netstat -antup | grep nginx #nginx服务也启动了
5.5 在docker客户端上继续增加nginxWeb容器节点,进行验证
docker run -dit --name nginxWeb02 -p 81:80 --mount type=bind,src=/www/html,dst=/usr/share/nginx/html nginx
docker run -dit --name nginxWeb03 -p 82:80 --mount type=bind,src=/www/html,dst=/usr/share/nginx/html nginx
docker ps -a
查看consul服务器端web界面
查看反向代理配置文件渲染情况
[root@localhost conf]# cat /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream http_backend {
ip_hash;
server 192.168.200.87:80;
server 192.168.200.87:81;
server 192.168.200.87:82;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://http_backend;
}
}
}
netstat -antup | grep nginx
通过浏览器访问nginx-LB的80端口验证反向代理的功能是否正常
5.6 验证consul注册服务的健康检查功能
停止nginxWeb02和nginxWeb03的容器进程
docker stop nginxWeb02
docker stop nginxWeb03
docker ps
查看nginx-LB配置文件渲染情况
cat /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream http_backend {
ip_hash;
server 192.168.200.142:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://http_backend;
}
}
}
netstat -antup | grep nginx