容器服務的監控,註冊與發現

一,容器監控系統介紹

 

1.1 Influxdb

InfluxDB是一個開源的沒有外部依賴的時間序列數據庫。適用於記錄度量,事件及執行分析。css

  • 特性 
    • 內置HTTP API,因此不用再寫服務端代碼來啓動和運行
    • 數據能夠被標記,容許很是靈活的查詢
    • 相似SQL的查詢語句
    • 安裝和管理簡單,數據輸入和輸出速度塊
    • 它旨在實時響應查詢。這意味着point數據寫入即被索引並當即可供響應時間應小於100ms的查詢使用。

image_1ctktsteivch4l01oqbtu680a9.png-29.9kB

 

1.2 cAdvisor

cAdvisor是一款google開源的數據收集工具。可是它默認只顯示實時數據,不儲存歷史數據。所以,爲了存儲和顯示歷史數據,自定義展現圖,能夠將cAdvisor與Influxdb+Grafana集成起來使用。html

image_1ctkttff9g6g1hh1103f1l2i7hm.png-98.4kB

 

1.3 Grafana

  • Grafana是一個開源的度量分析與可視化套件。常常被用做基礎設施的時間序列數據和應用程序分析的可視化,它在其餘領域也被普遍的使用包括工業傳感器,家庭自動化,天氣和過程控制等。node

  • Grafana支持許多不一樣的數據源。每一個數據源都有一個特定的查詢編輯器,該編輯器定製的特性和功能是公開的特定數據來源。linux

  • 官方支持如下數據源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB。nginx

  • 每一個數據源的查詢語言和能力都是不一樣的。你能夠把來自多個數據源的數據組合到一個儀表板,但每個面板被綁定到一個特定的數據源,它就屬於一個特定的組織。c++

image_1ctktuap3sgjd1meg1fjo1orr13.png-94.8kB

 

1.4 Influxdb+cAdvisor+Grafana組合

 

二,構建容器監控系統入門

image_1cuasor0l1ssb3hfd9j1kegn3f13.png-49.9kB

 

首先啓動IPV4轉發

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

sysctl -pgithub

image_1cubgcqjt1st01lp6nu84p1m4830.png-14.4kB

 

2.1 安裝及配置docker-ce

yum -y install yum-utils device-mapper-persistent-data lvm2web

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

相關文章
相關標籤/搜索