一,容器監控系統介紹
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