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

一,容器监控系统介绍

 

1.1 Influxdb

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

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

image_1ctktsteivch4l01oqbtu680a9.png-29.9kB

 

1.2 cAdvisor

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

image_1ctkttff9g6g1hh1103f1l2i7hm.png-98.4kB

 

1.3 Grafana

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

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

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

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

image_1ctktuap3sgjd1meg1fjo1orr13.png-94.8kB

 

1.4 Influxdb+cAdvisor+Grafana组合

 

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

image_1cuasor0l1ssb3hfd9j1kegn3f13.png-49.9kB

 

首先启动IPV4转发

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

sysctl -p

image_1cubgcqjt1st01lp6nu84p1m4830.png-14.4kB

 

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

image_1cuascasiq7k8qa10lbdss1tr89.png-133.7kB


image_1cuasie1tq6212nm5k6tuf6p3m.png-151.6kB

 

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

image_1cuau9qka1bok1ub5ffumu1gvs1g.png-113.1kB

 

通过浏览器访问

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

image_1cuaubllr6301ntg12m21q757802t.png-81.9kB

 

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

image_1cuaugt623dj1m811jkv1h3j5227a.png-94.2kB

 

通过浏览器访问

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

image_1cuauif4f1r7suc1kgu1opc9948a.png-122.3kB

 

2.4 下载和启动Grafana

docker pull grafana/grafana

docker images

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

docker ps -a

image_1cuaur2971eef13fp14491virl6td7.png-100.9kB

 

通过浏览器访问

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

image_1cuaus5t91ovt164d17tsupe1bdle4.png-72.1kB


image_1cuauthobt267g61akg1u4fn6bfk.png-125.5kB

 

三,配置容器监控系统

 

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

image_1cuav2ksn1kgu1eq672gff5114tgk.png-89.2kB


image_1cub0i8hl11uo1qfnvfe1dogas52f.png-103.6kB

 

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

用户:grafana 
密码:grafana

image_1cub0ln0nifq117r852thivjm3f.png-139.8kB

 

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

image_1ctku3dj716srn0b0481pukp55.png-57.6kB


image_1cubeq3groa010jk1o4out1ono9.png-410.9kB


image_1ctku3kb71r1u1ugl1ejh13e95d95v.png-5.9kB


image_1ctku3nhsc1n1jkt2971kcqblg6c.png-84.8kB

 

3.4 创建一个仪表盘

image_1ctku3ue71g6i18pbmfk12tr12s66p.png-44.3kB


image_1cubes52e1h6lbtj19ogv3dsmcm.png-540.2kB


image_1cubf06881g0kj1715sql8vdo75i.png-167.8kB


image_1ctku49i2h9vjurh97tlq1snh80.png-92.4kB


image_1ctku4jgf1v7fu5p1eok1uud1efq8d.png-138kB


image_1ctku4n50ogt8cd4sk1qmi17gb8q.png-139.6kB


image_1ctku4qh218tbia89k128kptq97.png-72.3kB

 

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

 

4.1 什么是微服务

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

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

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

image_1dadlpe5uck73mj7kh1j3119k4p.png-611.1kB

 

4.2 什么是服务发现

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

image_1dadlr8oqmgb1gdg2r1k9h189f16.png-614.6kB

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

image_1cubiprseorjc34fik1jb71guk9.png-61.8kB

 

部署并启动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 #这是对外访问端口

image_1cubis15815j197l2551nog10ddm.png-60.9kB

 

浏览器访问

192.168.200.70:8500

image_1cubit0rm13opnt61qov1ogf1gse1j.png-95.8kB

 

4.7 consul的基本使用

 

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

 

查看集群节点信息

consul members

image_1cubiuokgiuv1l4t1962m281j232g.png-15.6kB

 

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

consul info | grep leader

image_1cubiveidpilknnj281l1h1a093t.png-12.5kB

 

查看集群注册的服务信息

consul catalog services

image_1cubivse01vnn118u1srmiu015f84a.png-8.6kB

 

(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


image_1cubj3vqtah61fh9fd412681jai54.png-79.5kB

 

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

 

查看集群节点成员

curl 192.168.200.70:8500/v1/status/peers

image_1cubj5cg01ftu1dukaenfb3vgd5h.png-12.5kB

 

查看集群服务端位置

curl 192.168.200.70:8500/v1/status/leader

image_1cubj65c51kieavg1ensj2u1duk5u.png-12.2kB

 

查看注册的所有服务

curl 192.168.200.70:8500/v1/catalog/services

image_1cubj6oovi17dr630s1qq5fr86r.png-11.5kB

 

查看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

image_1ctkubqf2fgi1ej2ect1olsaofc2.png-153.8kB

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

image_1cubjupfn17it1ii7100jseg1qkr3e.png-42.4kB

 

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

image_1cubk6vtf158bh2a1f6cg6v3e33r.png-142kB

 

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

image_1cubkd26o1t9tp97p1q260ngi7e.png-51.2kB

 

启动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. }

image_1cubkvm4qkeq1n20103i16ck167efv.png-38.8kB

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

image_1cubl30kg1usajjg16aj1rtbbgmh8.png-16.5kB

 

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

image_1cubpdcb31aak11q1ms11no4rk8hl.png-79.8kB

 

模拟web访问

curl localhost

image_1cubpe5nv1cuv19j61mtt13bbgjei2.png-12.3kB

 

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

image_1cubphgc677l161qj73hbbap0iv.png-54.8kB

 

浏览器查看

http://192.168.200.70:8500

image_1cubpibca1rr81j91r0b19p89qnjc.png-83kB


image_1cubpiuun1mhr6gf123r153io7ljp.png-79.7kB

 

在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. }

image_1cubpn6ki1s621iv31ru5opb183gks.png-45kB

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

image_1cubprp32qga11g5lu0mavu7mpb.png-63.8kB

 

查看consul服务器端web界面

http://192.168.200.70:8500

image_1cubpssre1d18qig1fvfdiv12svq8.png-88.9kB

 

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

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

image_1cubq6g551irmavl6a0pcofi2rl.png-46.7kB

netstat -antup | grep nginx

image_1cubq7rrl14vh1p7488pjdnttss2.png-15.2kB

 

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

http://192.168.200.86

image_1cubq8qquopl9cp689ghlfgmsf.png-15.7kB

 

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

 

停止nginxWeb02和nginxWeb03的容器进程

docker stop nginxWeb02

docker stop nginxWeb03

docker ps

image_1cubqbv7u4gm1kugbm71fe7i6ess.png-52.3kB

 

查看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. }

image_1cubqcfgn12escl1kt218a8vcnt9.png-41.3kB

netstat -antup | grep nginx

image_1cubqdi9o1m57bof13gc19472c4ve.png-18.1kB

 

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

http://192.168.200.70:8500

image_1cubqeualr1hcj71s051l3gs4mvr.png-86.3kB

posted @ 2019-07-24 15:39  L1n  阅读(1073)  评论(1编辑  收藏  举报