Docker自帶的監(jiān)控命令?
docker top ? #容器的動態(tài)進程
docker stats #列出每個容器的cpu、內(nèi)存、io ?
docker logs ?#查看容器日志 ?emerg ?alert ? crit ?error ?warning ?notice ?info ?debug
一、sysdig? 輕量級的系統(tǒng)監(jiān)控程序
docker run -it --rm --name sysdig --privileged=true \
--volume=/var/run/docker.sock:/host/var/run/docker.sock \
--volume=/dev:/host/dev --volume=/proc:/host/proc:ro \
--volume=/boot:/host/boot:ro --volume=/lib/modules:/host/lib/modules:ro \
--volume=/usr:/host/usr:ro sysdig/sysdig
//如果下載插件失敗,可以運行下邊的命令,重新下載
sysdig-probe-loader
//下載成功之后,可以運行sysdig命令,查看監(jiān)控項
csysdig
sysdig容器是以privileged方式運行,而且會讀取操作系統(tǒng) /dev,/proc等數(shù)據(jù),這是為了獲取足夠的系統(tǒng)信息。
csysdig?
view
Containers
選擇對應容器
?
sysdig的特點:
(1)監(jiān)控信息全,包括Linux操作系統(tǒng)和容器
(2)界面交互性強
(3)缺點是sysdig顯示的是實時數(shù)據(jù),看不到變化和趨勢。而且是命令行操作方式,需要ssh到host上執(zhí)行,不是太方便
二.Weave scope?
圖形化的顯示,能夠直觀的看到容器資源使用情況,便于理解,監(jiān)控和控制容器
官方安裝命令:
sudo curl -L git.io/scope -o /usr/local/bin/scope?
sudo chmod a+x /usr/local/bin/scope?
scope launch
推薦安裝命令,提供基本身份驗證功能:
sudo curl -L https://github.com/weaveworks/scope/releases/download/latest_release/scope -o /usr/local/bin/scope
sudo chmod a+x /usr/local/bin/scope
? ??
scope launch -app.basicAuth -app.basicAuth.password 123456 -app.basicAuth.username user -probe.basicAuth -probe.basicAuth.password 123456 -probe.basicAuth.username user
使用 Scope:
成功啟動scope后,可以在瀏覽器中方法http://ip:4040,如果端口沒有修改默認是4040。之后輸入用戶名和密碼進入監(jiān)控首頁
一般我們可以點擊Container查看容器的情況,這里一般會列出你自己的容器和weave自帶的容器,通過名字可以區(qū)別。點擊相應容器可以對它進行在線bash操作,或者重啟,暫停,關閉容器
點擊Hosts按鈕,可以對自己的主機進行監(jiān)控和操作,當然也可以在線bash
點擊by image可以看到自己現(xiàn)在docker中所有的鏡像
PS: scope可以監(jiān)控單臺dockerhost,也可以監(jiān)控多臺的dockerhost,監(jiān)控 效果只需在運行scope launch ?本機IP地址 ? 其他IP地址,不過需要注意的是如果是多臺的dockerhost,在運行前,保證主機名不能沖突,區(qū)別主機名。
若要監(jiān)控多臺dockerhost ?以docker01和docker02舉例,需要分別運行scope launch 本地ip 另外一臺主機ip來實現(xiàn)
[root@docker01 ~]# scope launch 192.168.8.10 192.168.8.20
1c4f97ee6dc2543e32961bd7be155fda256797532a6787807c28c666f9612ab7
Scope probe started
Weave Scope is listening at the following URL(s):
? * http://172.19.0.1:4040/
? * http://172.20.0.1:4040/
? * http://192.168.10.100:4040/
? * http://172.22.16.1:4040/
? * http://192.168.122.1:4040/
root@docker02 ~]# scope launch 192.168.8.20 192.168.8.10
3d1f206dda3f5a0aa476b646eccb86814bb48611b11aac771ba60b7e5476875c
Scope probe started
Weave Scope is listening at the following URL(s):
? * http://192.168.10.101:4040/
? * http://192.168.122.1:4040/
prometheus
prometheus官方網(wǎng)站:https://prometheus.io/
Prometheus是由SoundCloud開發(fā)的開源監(jiān)控系統(tǒng)的開源版本。2016年,由Google發(fā)起的Linux基金會(Cloud Native Computing Foundation,CNCF)將Prometheus納入其第二大開源項目。Prometheus在開源社區(qū)也十分活躍
易管理性:
Prometheus: Prometheus核心部分只有一個單獨的二進制文件,可直接在本地工作,不依賴于分布式存儲。
Nagios: 需要有專業(yè)的人員進行安裝,配置和管理,并且過程很復雜。
業(yè)務數(shù)據(jù)相關性:
Prometheus:監(jiān)控服務的運行狀態(tài),基于Prometheus豐富的Client庫,用戶可以輕松的在應用程序中添加對Prometheus的支持,從而讓用戶可以獲取服務和應用內(nèi)部真正的運行狀態(tài)。
Nagios:大部分的監(jiān)控能力都是圍繞系統(tǒng)的一些邊緣性的問題,主要針對系統(tǒng)服務和資源的狀態(tài)以及應用程序的可用性。
另外Prometheus還存在以下優(yōu)點:
高效:單一Prometheus可以處理數(shù)以百萬的監(jiān)控指標;每秒處理數(shù)十萬的數(shù)據(jù)點。
易于伸縮:通過使用功能分區(qū)(sharing)+聯(lián)邦集群(federation)可以對Prometheus進行擴展,形成一個邏輯集群;Prometheus提供多種語言的客戶端SDK,這些SDK可以快速讓應用程序納入到Prometheus的監(jiān)控當中。
良好的可視化:Prometheus除了自帶有Prometheus UI,Prometheus還提供了一個獨立的基于Ruby On Rails的Dashboard解決方案Promdash。另外最新的Grafana可視化工具也提供了完整的Proetheus支持,基于Prometheus提供的API還可以實現(xiàn)自己的監(jiān)控可視化UI。
實驗環(huán)境
| 主機名稱 | IP地址 ? ? ? ? | 安裝組件 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
| -------- | ------------- | -------------------------------------------------- |
| docker1 ?| 192.168.8.10 | NodeEXporter、cAdvisor、Prometheus Server、Grafana |
| docker2 ?| 192.168.8.20 | NodeEXporter、cAdvisor ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| docker3 ?| 192.168.8.30 | NodeEXporter、cAdvisor ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
全部關閉防火墻,禁用selinux。
需要部署的組件:
Prometheus Server: 普羅米修斯的主服務器。
NodeEXporter: 負責收集Host硬件信息和操作系統(tǒng)信息。
cAdvisor: 負責收集Host上運行的容器信息。
Grafana: 負責展示普羅米修斯監(jiān)控界面。
##### 1)3個節(jié)點,全部部署node-EXporter,和cAdvisor.
//部署node-EXporter,收集硬件和系統(tǒng)信息。
docker run -d -p 9100:9100 --name exporter -v /proc:/host/proc -v /sys:/host/sys -v /:/rootfs --net=host prom/node-exporter --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
PS: 注意,這里使用了--net=host,這樣Prometheus Server可以直接與Node-EXporter通信。
驗證:打開瀏覽器驗證結果。
http://192.168.8.10:9100
//部署安裝cAdvisor,收集節(jié)點容器信息。
docker run -v /:/rootfs:ro -v /var/run:/var/run/:rw -v /sys:/sys:ro -v /var/lib/docker:/var/lib/docker:ro -p 8080:8080 --detach=true --name=cadvisor --net=host google/cadvisor
部署完成之后,打開瀏覽器驗證。
http://192.168.8.10:8080
##### 2)在docker01上部署Prometheus Server服務。
在部署prometheus之前,我們需要對它的配置文件進行修改,所以我們先運行一個容器,先將其配置文件拷貝出來。
docker run -d -p 9090:9090 --name prometheus --net=host prom/prometheus
docker cp prometheus:/etc/prometheus/prometheus.yml /root
vim prometheus.yml
? ? ?- targets:['localhost:9090','localhost:8080','localhost:9100','192.168.8.20:8080','192.168.8.20:9100','192.168.8.30:8080','192.168.8.30:9100']
PS: 這里指定了prometheus的監(jiān)控項,包括它也會監(jiān)控自己收集到的數(shù)據(jù)。
修改配置文件后刪除掉前面開啟的prometheus容器,因為我們已經(jīng)得到配置文件并按照實際修改了,后面需要重新開啟新的容器
docker rm -f prometheus ?容器名
//重新運行prometheus容器。
docker run -d -p 9090:9090 --name prometheus --net=host -v /root/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
瀏覽器訪問驗證。
http://192.168.8.10:9090/targets
PS: 這里能夠查看到我們各個監(jiān)控項。
##### 3)在docker01上,部署grafana服務,用來展示prometheus收集到的數(shù)據(jù)。
mkdir /grafana-storage?
chmod 777 -R /grafana-storage/
docker run -d -p 3000:3000 --name grafana -v /grafana-storage:/var/lib/grafana -e "GF_SECURITY_ADMIN_PASSWORD=123.com" grafana/grafana
瀏覽器訪問驗證:
http://192.168.8.10:3000/login
用戶名:admin
密碼:123.com
設置Grafana,添加數(shù)據(jù)來源(prometheus)
點擊“DATA SOURCES”
選擇“Prometheus”
Name 選擇Prometheus ??
URL ?填寫http://192.168.8.10:9090
點擊 ?Save & Test
PS: 看到這個提示,說明prometheus和grafana服務的是正常連接的。
此時,雖然grafana收集到了數(shù)據(jù),但怎么顯示它,仍然是個問題,grafana支持自定義顯示信息,不過要自定義起來非常麻煩,不過好在,grafana官方為我們提供了一些模板,來供我們使用。
grafana官網(wǎng): https://grafana.com/?
Grafana
Dashboards
Prometheus
Node Exporter for full
Download JSON
選中一款模板,然后,我們有2種方式可以套用這個模板。
?**第一種方式:通過JSON文件使用模板。**
下載完成之后,來到grafana控制臺
http://192.168.8.10:3000/datasources
點擊左側“+”,import ,upload JSON file
**第二種導入模板的方式**:
?可以直接通過模板的ID 號。
10619 ?? ?#監(jiān)控docker容器
======================
grafana常用監(jiān)控模板
1、監(jiān)控物理機/虛擬機ID(Linux)
8919
9276
1860
2、監(jiān)控物理機/虛擬機ID(windows)
10467
10171
2129
3、監(jiān)控容器ID
3146
8685
10000
8588
315
4、監(jiān)控數(shù)據(jù)庫ID
7362
10101
5、監(jiān)控網(wǎng)站或者協(xié)議端口ID
http監(jiān)控某個網(wǎng)站
icmp監(jiān)控某臺機器
tcp監(jiān)控某個端口
dns監(jiān)控dns
9965
Nginx
9614
2949
======================
--------------------------------------
配置AlertManager
接下來,我們需要啟動 AlertManager 來接受 Prometheus 發(fā)送過來的報警信息,并執(zhí)行各
種方式的告警。同樣以 Docker 方式啟動 AlertManager,最簡單的啟動命令如下
docker run --name alertmanager -d -p 9093:9093 prom/alertmanager:latest
docker cp alertmanager:/etc/alertmanager/alertmanager.yml /root
這里 AlertManager 默認啟動的端口為 9093,啟動完成后,瀏覽器訪問 http://<IP>:9093 可以看到默認提供的 UI 頁面,不過現(xiàn)在是沒有任何告警信息的,因為我們還沒有配置報警規(guī)則來觸發(fā)報警。
URL:http://192.168.8.10:9093
AlertManager 配置郵件告警
AlertManager 默認配置文件為 alertmanager.yml,在容器內(nèi)路為/etc/alertmanager/alertmanager.yml
簡單介紹一下主要配置的作用:
- ? ? ?global: 全局配置,包括報警解決后的超時時間、SMTP 相關配置、各種渠道通知的 API 地址等等。
- ? ? ?route: 用來設置報警的分發(fā)策略,它是一個樹狀結構,按照深度優(yōu)先從左向右的順序進行匹配。
- ? ? ?receivers: 配置告警消息接受者信息,例如常用的 email、wechat、slack、webhook 等消息通知方式。
- ? ? ?inhibit_rules: 抑制規(guī)則配置,當存在與另一組匹配的警報(源)時,抑制規(guī)則將禁用與一組匹配的警報(目標)。
那么,我們就來配置一下使用 Email 方式通知報警信息,這里以 QQ 郵箱為例,
當然在配置QQ郵箱之前,需要我們登錄QQ郵箱,打開SMTP服務,并獲取授權碼。
配置如下:
[root@docker1 ~]# vim alertmanager.yml
global:
? resolve_timeout: 5m
? smtp_from: '1793594335@qq.com'
? smtp_smarthost: 'smtp.qq.com:465'
? smtp_auth_username: '1793594335@qq.com'
? smtp_auth_password: 'yuemqwmhdizdbjeg'
? smtp_require_tls: false
? smtp_hello: 'qq.com'
route:
? group_by: ['alertname']
? group_wait: 5s
? group_interval: 5s
? repeat_interval: 5m
? receiver: 'email'
receivers:
- name: 'email'
? email_configs:
? - to: '1793594335@qq.com'
? ? send_resolved: true
inhibit_rules:
? - source_match:
? ? ? severity: 'critical'
? ? target_match:
? ? ? severity: 'warning'
? ? equal: ['alertname', 'dev', 'instance']
PS: 以上模板中涉及的QQ郵箱換成自己的即可,授權碼也一樣。
修改 AlertManager 啟動命令,將本地 alertmanager.yml 文件掛載到容器內(nèi)指定位置
[root@docker1 ~]# docker rm -f alertmanager?
[root@docker01 ~]# docker run -d --name alertmanager -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager
### Prometheus 配置 AlertManager 告警規(guī)則
接下來,我們需要在 Prometheus 配置 AlertManager 服務地址以及告警規(guī)則,新建報警規(guī)則文件 node-up.rules 如下
mkdir ?-p /root/prometheus/rules
cd /root/prometheus/rules/
[root@docker1 rules]# vim node-up.rules?
groups:
- name: node-up
? rules:
? - alert: node-up
? ? expr: up{job="prometheus"} == 0
? ? for: 15s
? ? labels:
? ? ? severity: 1
? ? ? team: node
? ? annotations:
? ? ? summary: "{{ $labels.instance }} 已停止運行超過 15s!"
PS:該 rules 目的是監(jiān)測 node 是否存活,expr 為 PromQL 表達式驗證特定節(jié)點 job="node-exporter" 是否活著,
for 表示報警狀態(tài)為 Pending 后等待 15s 變成 Firing 狀態(tài),一旦變成 Firing 狀態(tài)則將報警發(fā)送到 AlertManager,
labels 和 annotations 對該 alert 添加更多的標識說明信息,所有添加的標簽注解信息,以及 prometheus.yml 中
該 job 已添加 label 都會自動添加到郵件內(nèi)容中,更多關于 rule 詳細配置可以參考?
https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/#rule
然后,修改 prometheus.yml 配置文件,添加 rules 規(guī)則文件
# vim /root/prometheus.yml
alerting:
? alertmanagers:
? ? - static_configs:
? ? ? ? - targets:
? ? ? ? ? - 192.168.8.10:9093
rule_files:
? - "/usr/local/prometheus/rules/*.rules"
PS:這里 rule_files 為容器內(nèi)路徑,需要將本地 node-up.rules 文件掛載到容器內(nèi)指定路徑,修改 Prometheus 啟動命令如下,并重啟服務。
[root@docker1 ~]# docker rm -f prometheus?
[root@docker1 ~]# docker run -d -p 9090:9090 -v /root/prometheus.yml:/etc/prometheus/prometheus.yml -v /root/prometheus/rules:/usr/local/prometheus/rules --name prometheus --net=host prom/prometheus
此時在prometheus主頁上可以看到相應規(guī)則
http://192.168.8.10:9090/targets
Status
Rules
關閉某個node觸發(fā)報警發(fā)送 Email
=============================
擴展報警規(guī)則:
vim node_alerts.yml
groups:
- name: 主機狀態(tài)-監(jiān)控告警
? rules:
? - alert: 主機狀態(tài)
? ? expr: up {job="kubernetes-nodes"} == 0
? ? for: 15s
? ? labels:
? ? ? status: 非常嚴重
? ? annotations:
? ? ? summary: "{{.instance}}:服務器宕機"
? ? ? description: "{{.instance}}:服務器延時超過15s"
? - alert: CPU使用情況
? ? expr: 100-(avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)* 100) > 60
? ? for: 1m
? ? labels:
? ? ? status: warning
? ? annotations:
? ? ? summary: "{{$labels.instance}}: High CPU Usage Detected"
? ? ? description: "{{$labels.instance}}: CPU usage is {{$value}}, above 60%"
? - alert: NodeFilesystemUsage
? ? expr: 100 - (node_filesystem_free_bytes{fstype=~"ext4|xfs"} / node_filesystem_size_bytes{fstype=~"ext4|xfs"} * 100) > 80
? ? for: 1m
? ? labels:
? ? ? severity: warning
? ? annotations:
? ? ? summary: "Instance {{ $labels.instance }} : {{ $labels.mountpoint }} 分區(qū)使用率過高"
? ? ? description: "{{ $labels.instance }}: {{ $labels.mountpoint }} 分區(qū)使用大于80% (當前值: {{ $value }})"
? - alert: 內(nèi)存使用
? ? expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 80
? ? for: 1m
? ? labels:
? ? ? status: 嚴重告警
? ? annotations:
? ? ? summary: "{{ $labels.instance}} 內(nèi)存使用率過高!"
? ? ? description: "{{ $labels.instance }} 內(nèi)存使用大于80%(目前使用:{{ $value}}%)"
? - alert: IO性能
? ? expr: (avg(irate(node_disk_io_time_seconds_total[1m])) by(instance)* 100) > 60
? ? for: 1m
? ? labels:
? ? ? status: 嚴重告警
? ? annotations:
? ? ? summary: "{{$labels.instance}} 流入磁盤IO使用率過高!"
? ? ? description: "{{ $labels.instance }} 流入磁盤IO大于60%(目前使用:{{ $value }})"
? - alert: 網(wǎng)絡
? ? expr: ((sum(rate (node_network_receive_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance)) / 100) > 102400
? ? for: 1m
? ? labels:
? ? ? status: 嚴重告警
? ? annotations:
? ? ? summary: "{{ $labels.instance}} 流入網(wǎng)絡帶寬過高!"
? ? ? description: "{{ $labels.instance }}流入網(wǎng)絡帶寬持續(xù)2分鐘高于100M. RX帶寬使用率{{ $value }}"
? - alert: TCP會話
? ? expr: node_netstat_Tcp_CurrEstab > 1000
? ? for: 1m
? ? labels:
? ? ? status: 嚴重告警
? ? annotations:
? ? ? summary: "{{ $labels.instance }} TCP_ESTABLISHED過高!"
? ? ? description: "{{ $labels.instance }} TCP_ESTABLISHED大于1000%(目前使用:{{ $value }}%)"
vim pod_rules.yml
groups:
- name: k8s_pod.rules
? rules:
? - alert: pod-status
? ? expr: kube_pod_container_status_running != 1
? ? for: 5s
? ? labels:
? ? ? severity: warning
? ? annotations:
? ? ? description : pod-{{ $labels.pod }}故障
? ? ? summary: pod重啟告警
? - alert: Pod_all_cpu_usage
? ? expr: (sum by(name)(rate(container_cpu_usage_seconds_total{image!=""}[5m]))*100) > 10
? ? for: 5m
? ? labels:
? ? ? severity: critical
? ? ? service: pods
? ? annotations:
? ? ? description: 容器 {{ $labels.name }} CPU 資源利用率大于 75% , (current value is {{ $value }})
? ? ? summary: Dev CPU 負載告警
? - alert: Pod_all_memory_usage
? ? expr: sort_desc(avg by(name)(irate(container_memory_usage_bytes{name!=""}[5m]))*100) > 1024*10^3*2
? ? for: 10m
? ? labels:
? ? ? severity: critical
? ? annotations:
? ? ? description: 容器 {{ $labels.name }} Memory 資源利用率大于 2G , (current value is {{ $value }})
? ? ? summary: Dev Memory 負載告警
? - alert: Pod_all_network_receive_usage
? ? expr: sum by (name)(irate(container_network_receive_bytes_total{container_name="POD"}[1m])) > 1024*1024*50
? ? for: 10m
? ? labels:
? ? ? severity: critical
? ? annotations:
? ? ? description: 容器 {{ $labels.name }} network_receive 資源利用率大于 50M , (current value is {{ $value }})
? ? ? summary: network_receive 負載告警文章來源:http://www.zghlxwxcb.cn/news/detail-741447.html
微信報警:
https://blog.csdn.net/m0_37680131/article/details/120090880文章來源地址http://www.zghlxwxcb.cn/news/detail-741447.html
到了這里,關于Docker的監(jiān)控-Prometheus(普羅米修斯)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!