容器服务的监控,注册与发现

一,容器监控系统介绍

 

1.1 Influxdb

InfluxDB是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及执行分析。

  • 特性 
    • 内置HTTP API,所以不用再写服务端代码来启动和运行
    • 数据可以被标记,允许非常灵活的查询
    • 类似SQL的查询语句
    • 安装和管理简单,数据输入和输出速度块
    • 它旨在实时响应查询。这意味着point数据写入即被索引并立即可供响应时间应小于100ms的查询使用。

容器服务的监控,注册与发现_第1张图片

 

1.2 cAdvisor

cAdvisor是一款google开源的数据收集工具。但是它默认只显示实时数据,不储存历史数据。因此,为了存储和显示历史数据,自定义展示图,可以将cAdvisor与Influxdb+Grafana集成起来使用。

容器服务的监控,注册与发现_第2张图片

 

1.3 Grafana

  • Grafana是一个开源的度量分析与可视化套件。经常被用作基础设施的时间序列数据和应用程序分析的可视化,它在其他领域也被广泛的使用包括工业传感器,家庭自动化,天气和过程控制等。

  • Grafana支持许多不同的数据源。每个数据源都有一个特定的查询编辑器,该编辑器定制的特性和功能是公开的特定数据来源。

  • 官方支持以下数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB。

  • 每个数据源的查询语言和能力都是不同的。你可以把来自多个数据源的数据组合到一个仪表板,但每一个面板被绑定到一个特定的数据源,它就属于一个特定的组织。

容器服务的监控,注册与发现_第3张图片

 

1.4 Influxdb+cAdvisor+Grafana组合

 

二,构建容器监控系统入门

容器服务的监控,注册与发现_第4张图片

 

首先启动IPV4转发

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

sysctl -p

容器服务的监控,注册与发现_第5张图片

 

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

 
  1. {
  2. "registry-mirrors":[ "https://registry.docker-cn.com" ]
  3. }

systemctl daemon-reload

systemctl restart docker

容器服务的监控,注册与发现_第6张图片


容器服务的监控,注册与发现_第7张图片

 

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

容器服务的监控,注册与发现_第8张图片

 

通过浏览器访问

http://192.168.200.70:8083 
进入Influxdb的管理界面,如下

容器服务的监控,注册与发现_第9张图片

 

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

容器服务的监控,注册与发现_第10张图片

 

通过浏览器访问

http://192.168.200.70:8081 
进入cAdvisor管理界面,如下

容器服务的监控,注册与发现_第11张图片

 

2.4 下载和启动Grafana

docker pull grafana/grafana

docker images

docker run -d --name grafana --net monitor -p 3000:3000 grafana/grafana

docker ps -a

容器服务的监控,注册与发现_第12张图片

 

通过浏览器访问

http://192.168.200.70:3000 
默认用户:admin 默认密码:admin 
进入Grafana管理界面,如下

容器服务的监控,注册与发现_第13张图片


容器服务的监控,注册与发现_第14张图片

 

三,配置容器监控系统

 

3.1 向Influxdb中创建一个库"cadvisor",用来给cadvisor来存储数据

容器服务的监控,注册与发现_第15张图片


容器服务的监控,注册与发现_第16张图片

 

3.2 向Influxdb中创建一个用户,用来给cadvisor来访问

用户:grafana 
密码:grafana

容器服务的监控,注册与发现_第17张图片

 

3.3 在Grafana中添加数据库源地址

容器服务的监控,注册与发现_第18张图片


容器服务的监控,注册与发现_第19张图片


image_1ctku3kb71r1u1ugl1ejh13e95d95v.png-5.9kB


容器服务的监控,注册与发现_第20张图片

 

3.4 创建一个仪表盘

容器服务的监控,注册与发现_第21张图片


容器服务的监控,注册与发现_第22张图片


容器服务的监控,注册与发现_第23张图片


容器服务的监控,注册与发现_第24张图片


容器服务的监控,注册与发现_第25张图片


容器服务的监控,注册与发现_第26张图片


容器服务的监控,注册与发现_第27张图片

 

四,容器服务的自动注册与发现

 

4.1 什么是微服务

  • 微服务是众多能够独立运行,独立部署,独立提供访问的服务程序。

  • 这些独立的程序可以单独运行提供某方面的服务,也可以通过分布式的方式调用各自提供的API接口进行集群组合式服务。

  • 就如同之前我们安装的容器监控系统,它是通过InfluxDB+cAdvisor+Grafana组合来实现的。这三个软件服务都可以独立部署,独立运行,并都有独立提供外部访问的web界面。可以分拆来使用(搭配别的微服务软件进行组合),也可以通过各自的API接口进行串联集群式访问。

容器服务的监控,注册与发现_第28张图片

 

4.2 什么是服务发现

微服务的框架体系中,服务发现是不能不提的一个模块。我们来看下图:

容器服务的监控,注册与发现_第29张图片

  • 上图中,左图的客户端的一个借口,需要调用服务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

 
  1. 主机名 IP 用途
  2. 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

容器服务的监控,注册与发现_第30张图片

 

部署并启动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

 
  1. tcp6 0 0 :::8500 :::* LISTEN 18866/consul #这是对外访问端口

容器服务的监控,注册与发现_第31张图片

 

浏览器访问

192.168.200.70:8500

容器服务的监控,注册与发现_第32张图片

 

4.7 consul的基本使用

 

(1)通过Linux命令获取信息

 

查看集群节点信息

consul members

容器服务的监控,注册与发现_第33张图片

 

查看集群节点的服务端位置

consul info | grep leader

容器服务的监控,注册与发现_第34张图片

 

查看集群注册的服务信息

consul catalog services

容器服务的监控,注册与发现_第35张图片

 

(2)本地模拟进行注册

 
  1. 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

image_1cubj3h8kk0j18g41itu1sl3kk54n.png-21.3kB


容器服务的监控,注册与发现_第36张图片

 

(3)通过HTTP API获取集群信息

 

查看集群节点成员

curl 192.168.200.70:8500/v1/status/peers

容器服务的监控,注册与发现_第37张图片

 

查看集群服务端位置

curl 192.168.200.70:8500/v1/status/leader

容器服务的监控,注册与发现_第38张图片

 

查看注册的所有服务

curl 192.168.200.70:8500/v1/catalog/services

容器服务的监控,注册与发现_第39张图片

 

查看nginx服务信息

curl 192.168.200.70:8500/v1/catalog/services/nginx

image_1cubje2bi102b1kf17j7t001o2sd7.png-10.4kB

 

集群节点详细信息

curl 192.168.200.70:8500/v1/catalog/nodes

image_1cubj85e663kfrc5cg1daj18cn78.png-24.8kB

 

五,Docker+Registrator+Consul实现容器服务自动加入Nginx集群

  • consul-template:一个守护程序,用于实时查询consul集群数据,并更新文件系统上的任意数量的指定模板,生成配置文件,更新完成后可以选择运行任何Shell命令。
  • gliderlabs/registrator:检查容器运行状态自动注册和注销Docker容器的服务到服务配置中心。目前支持Consul,etcd和SkyDNS2。 
    https://github.com/hashicorp/consul-template

容器服务的监控,注册与发现_第40张图片

主机名 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

容器服务的监控,注册与发现_第41张图片

 

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

容器服务的监控,注册与发现_第42张图片

 

5.3 nginx-LB配置consul服务支持的nginx配置文件模板

 

制作consul支持的nginx配置文件模板

mkdir -p /consul-tml

cd /consul-tml/

vim nginx.ctmpl

cat nginx.ctmpl

 
  1. worker_processes 1;
  2. events {
  3. worker_connections 1024;
  4. }
  5. http {
  6. include mime.types;
  7. default_type application/octet-stream;
  8. sendfile on;
  9. keepalive_timeout 65;
  10. upstream http_backend {
  11. ip_hash;
  12. {{ range service "nginx" }} #获取服务nginx
  13. server {{ .Address }}:{{ .Port }}; #循环罗列所属服务的IP和端口
  14. {{ end }}
  15. }
  16. server {
  17. listen 80;
  18. server_name localhost;
  19. location / {
  20. proxy_pass http://http_backend;
  21. }
  22. }
  23. }

容器服务的监控,注册与发现_第43张图片

 

启动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 &

image_1cubksl4h1q5qfkma3r60ijmv9g.png-28.2kB

 

查看nginx配置文件

cat /usr/local/nginx/conf/nginx.conf

 
  1. worker_processes 1;
  2. events {
  3. worker_connections 1024;
  4. }
  5. http {
  6. include mime.types;
  7. default_type application/octet-stream;
  8. sendfile on;
  9. keepalive_timeout 65;
  10. upstream http_backend { #还没有任何容器节点注册,因此这里没东西
  11. ip_hash;
  12. }
  13. server {
  14. listen 80;
  15. server_name localhost;
  16. location / {
  17. proxy_pass http://http_backend;
  18. }
  19. }
  20. }

容器服务的监控,注册与发现_第44张图片

netstat -antup | grep nginx #配置文件里没有web节点因此nginx没有启动成功

image_1cubl0u6uh0r1uah17vn1k961d64gr.png-10kB

 

5.4 在Docker客户端上启动nginxWeb容器作为节点,并启动registrator进行服务注册

 

开启ipv4网卡转发

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

sysctl -p

容器服务的监控,注册与发现_第45张图片

 

下载并启动nginxWeb01容器节点

docker pull nginx

mkdir -p /www/html

echo "hostname -I sl.yunjisuan.com" >> /www/html/index.html

docker run -dit --name nginxWeb01 -p 80:80 --mount type=bind,src=/www/html,dst=/usr/share/nginx/html nginx

容器服务的监控,注册与发现_第46张图片

 

模拟web访问

curl localhost

容器服务的监控,注册与发现_第47张图片

 

下载并启动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

容器服务的监控,注册与发现_第48张图片

 

浏览器查看

http://192.168.200.70:8500

容器服务的监控,注册与发现_第49张图片


容器服务的监控,注册与发现_第50张图片

 

在nginx-LB上查看nginx反向代理配置文件渲染情况

 

如果没有启动nginx,需要先启动

/usr/local/nginx/sbin/nginx

cat /usr/local/nginx/conf/nginx.conf

 
  1. worker_processes 1;
  2. events {
  3. worker_connections 1024;
  4. }
  5. http {
  6. include mime.types;
  7. default_type application/octet-stream;
  8. sendfile on;
  9. keepalive_timeout 65;
  10. upstream http_backend {
  11. ip_hash;
  12. server 192.168.200.87:80; #已经有注册的web容器地址了
  13. }
  14. server {
  15. listen 80;
  16. server_name localhost;
  17. location / {
  18. proxy_pass http://http_backend;
  19. }
  20. }
  21. }

容器服务的监控,注册与发现_第51张图片

netstat -antup | grep nginx #nginx服务也启动了

image_1cubpnpbh5q719bgnls691cssl9.png-17.1kB

 

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

容器服务的监控,注册与发现_第52张图片

 

查看consul服务器端web界面

http://192.168.200.70:8500

容器服务的监控,注册与发现_第53张图片

 

查看反向代理配置文件渲染情况

 
  1. [root@localhost conf]# cat /usr/local/nginx/conf/nginx.conf
  2. worker_processes 1;
  3. events {
  4. worker_connections 1024;
  5. }
  6. http {
  7. include mime.types;
  8. default_type application/octet-stream;
  9. sendfile on;
  10. keepalive_timeout 65;
  11. upstream http_backend {
  12. ip_hash;
  13. server 192.168.200.87:80;
  14. server 192.168.200.87:81;
  15. server 192.168.200.87:82;
  16. }
  17. server {
  18. listen 80;
  19. server_name localhost;
  20. location / {
  21. proxy_pass http://http_backend;
  22. }
  23. }
  24. }

容器服务的监控,注册与发现_第54张图片

netstat -antup | grep nginx

image_1cubq7rrl14vh1p7488pjdnttss2.png-15.2kB

 

通过浏览器访问nginx-LB的80端口验证反向代理的功能是否正常

http://192.168.200.86

容器服务的监控,注册与发现_第55张图片

 

5.6 验证consul注册服务的健康检查功能

 

停止nginxWeb02和nginxWeb03的容器进程

docker stop nginxWeb02

docker stop nginxWeb03

docker ps

容器服务的监控,注册与发现_第56张图片

 

查看nginx-LB配置文件渲染情况

cat /usr/local/nginx/conf/nginx.conf

 
  1. worker_processes 1;
  2. events {
  3. worker_connections 1024;
  4. }
  5. http {
  6. include mime.types;
  7. default_type application/octet-stream;
  8. sendfile on;
  9. keepalive_timeout 65;
  10. upstream http_backend {
  11. ip_hash;
  12. server 192.168.200.142:80;
  13. }
  14. server {
  15. listen 80;
  16. server_name localhost;
  17. location / {
  18. proxy_pass http://http_backend;
  19. }
  20. }
  21. }

容器服务的监控,注册与发现_第57张图片

netstat -antup | grep nginx

image_1cubqdi9o1m57bof13gc19472c4ve.png-18.1kB

 

浏览器查看consul注册服务的web界面

http://192.168.200.70:8500

容器服务的监控,注册与发现_第58张图片

转载于:https://www.cnblogs.com/linyaonie/p/11238408.html

你可能感兴趣的:(容器服务的监控,注册与发现)