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


一,容器監控系統介紹

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM