Prometheus-自动发现服务(Consul实现100台主机自动监控+k8s)

基于文件的服务发现

prometheus配置

  - job_name: 'file_sd'
    file_sd_configs:
    - files: ['/opt/monitor/prometheus/sd_config/*.yml']

文件配置

[root@prometheus sd_config]# vi test.yml
- targets: ['192.168.153.17:8080','192.168.153.20:8080']
1635493099463.png

基于Consul的服务发现

架构图

1635893206315.png

启动consul服务

[root@prometheus ~]# docker run --name consul -d -p 8500:8500 consul

http://192.168.153.20:8500

在consul中注册服务

curl -X PUT -d '{"id": "Linux-1","name": "Linux","address": "192.168.153.20","port":
9100,"tags": ["service"],"checks": [{"http": "http://192.168.153.20:9100","interval":
"5s"}]}' http://192.168.153.20:8500/v1/agent/service/register
1635574695902.png

prometheus配置

  - job_name: 'conful_sd'
    consul_sd_configs:
    - server: 192.168.153.20:8500
      services: ['Linux']
1635575049691.png

Ansible+Consul实现100台主机自动监控

基本步骤

ansible批量部署node_exporter

基于consul的服务发现

将node_exporter所在机器的IP和端口注册到consul里

prometheus从consul获取所有ip和端口自动加入监控

分组样式

id:web1,name:webservers
id:web2,name:webservers

id:db1,name:dbservers
id:db2,name:dbservers
  - job_name: 'webservers'
    consul_sd_configs:
    - server: 192.168.153.20:8500
      services: ['webservers']
  - job_name: 'dbservers'
    consul_sd_configs:
    - server: 192.168.153.20:8500
      services: ['dbservers']

node_exporter.service

[root@ansible ansible]# vi node_exporter.service 
[Unit]
Description=node_exporter
[Service]
ExecStart=/usr/local/node_exporter/node_exporter
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target

hosts

[root@ansible ansible]# vi hosts
[webservers]
192.168.153.17 name=web1 ansible_ssh_user=root ansible_ssh_pass='root'

[dbservers]
192.168.153.20 name=db1 ansible_ssh_user=root ansible_ssh_pass='root'

consul-register.sh

[root@ansible ansible]# vi consul-register.sh
#!/bin/bash
service_name=$1
instance_id=$2
ip=$3
port=$4


curl -X PUT -d '{"id": "'"$instance_id"'","name": "'"$service_name"'","address": "'"$ip"'","port":'"$port"',"tags": ["'"$service_name"'"],"checks": [{"http": "http://'"$ip"':'"$port"'","interval":"5s"}]}' http://192.168.153.20:8500/v1/agent/service/register

playbook.yaml

[root@ansible ansible]# vi playbook.yaml
- hosts: dbservers
  gather_facts: no
  tasks:
  - name: 推送二进制文件
    unarchive: src=node_exporter-1.0.1.linux-amd64.tar.gz dest=/usr/local
  - name: 重命名
    shell: |
      cd /usr/local
      if [! -d node_exporter]; then
        mv node_exporter-1.0.1.linux-amd64.tar.gz node_exporter
      fi
  - name: 复制systemd文件
    copy: src=node_exporter.service dest=/usr/lib/systemd/system
  - name: 启动服务
    systemd: name=node_exporter state=restarted daemon_reload=yes
  - name: 推送注册脚本
    copy: src=consul-register.sh  dest=/usr/local/bin/
  - name: 注册当前节点
    shell: /bin/bash /usr/local/bin/consul-register.sh {{group_names[0]}} {{name}} {{inventory_hostname}} 9100
[root@ansible ansible]# vi playbook.yaml
- hosts: webservers
  gather_facts: no
  tasks:
  - name: 推送二进制文件
    unarchive: src=node_exporter-1.0.1.linux-amd64.tar.gz dest=/usr/local
  - name: 重命名
    shell: |
      cd /usr/local
      if [! -d node_exporter]; then
        mv node_exporter-1.0.1.linux-amd64.tar.gz node_exporter
      fi
  - name: 复制systemd文件
    copy: src=node_exporter.service dest=/usr/lib/systemd/system
  - name: 启动服务
    systemd: name=node_exporter state=restarted daemon_reload=yes
  - name: 推送注册脚本
    copy: src=consul-register.sh  dest=/usr/local/bin/
  - name: 注册当前节点
    shell: /bin/bash /usr/local/bin/consul-register.sh {{group_names[0]}} {{name}} {{inventory_hostname}} 9100

执行playbook(webservers,dbservers)

[root@ansible ansible]# ansible-playbook  playbook.yaml  -i hosts
1635582782300.png

监控Kubernetes

架构图

1635903014096.png

K8s RBAC授权

[root@k8smaster prometheus]# kubectl apply -f rbac.yaml 

获取Token并保存到文件

#获取prometheus的secrets:- name
[root@k8smaster prometheus]# kubectl get sa prometheus -n kube-system -o yaml
...
secrets:
- name: prometheus-token-r8xrb

#生产token密钥文件
[root@k8smaster prometheus]# kubectl describe secret prometheus-token-r8xrb -n kube-system

[root@k8smaster prometheus]# kubectl describe secret prometheus-token-r8xrb -n kube-system > token.k8s

#修改token.k8s,只保留token


#将文件复制到prometheus文件下
[root@k8smaster prometheus]# cp -r token.k8s /opt/monitor/prometheus/


获取k8s的master地址

[root@k8smaster ~]# kubectl get ep
NAME         ENDPOINTS             AGE
kubernetes   192.168.153.21:6443   11h


监控K8s集群Pod

整体流程

#prometheus从Aprserver获取信息
prometheus - Aprserver(192.168.153.21:6443)
#Aprserver获取信息从kubelet自带的cadvisor获取相应指标
Aprserver(192.168.153.21:6443) -kubelet(cadvisor)
-----------------------------------------------------------------------
prometheus - Aprserver(192.168.153.21:6443) -kubelet(cadvisor)

创建Job和kubeconfig_sd_configs

  - job_name: kubernetes-nodes-cadvisor
    metrics_path: /metrics
    scheme: https
    kubernetes_sd_configs:
    - role: node
      api_server: https://192.168.153.21:6443
      bearer_token_file: /opt/monitor/prometheus/token.k8s
      tls_config:
        insecure_skip_verify: true
    bearer_token_file: /opt/monitor/prometheus/token.k8s
    tls_config:
      insecure_skip_verify: true
    relabel_configs:
    # 将标签(.*)作为新标签名,原有值不变
    - action: labelmap
      regex: __meta_kubernetes_node_label_(.*)
    # 修改NodeIP:10250为APIServerIP:6443
    - action: replace
      regex: (.*)
      source_labels: ["__address__"]
      target_label: __address__
      replacement: 192.168.153.21:6443
    # 实际访问指标接口 https://NodeIP:10250/metrics/cadvisor 这个接口只能APISERVER访问,故此重新标记标签使用APISERVER代理访问
    - action: replace
      source_labels: [__meta_kubernetes_node_name]
      target_label: __metrics_path__
      regex: (.*)
      replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor 
      
---------------------------------------------------------------------------------
注意:master的ip地址
     token.k8s的位置

1635649444767.png

Grafana导入仪表盘

1635650002117.png

监控K8s资源对象状态

整体流程

prometheus - [kube-state-metrics] -kubelet(cadvisor)
1635650210664.png

安装部署kube-state-metrics

#启动kube-state-metrics服务
[root@k8smaster prometheus]# kubectl apply -f kube-state-metrics.yaml

#查看服务状态
[root@k8smaster prometheus]# kubectl get pods -n kube-system
kube-state-metrics-5d8b77488c-9hb5j       2/2     Running   0          112s

[root@k8smaster prometheus]# kubectl describe pod kube-state-metrics-5d8b77488c-9hb5j -n kube-system


[root@k8smaster prometheus]# kubectl get pods -n  kube-system -o wide 
kube-state-metrics-5d8b77488c-9hb5j       2/2     Running   0          7m39s   10.244.249.6     k8snode1    <none>           <none>

[root@k8smaster prometheus]# curl 10.244.249.6:8080/metrics

---------------------------------------------------------------------------
注意:10.244.249.6:8080中的8080是kube-state-metrics.yaml文件里设置的http-metrics

创建Job和kubeconfig_sd_configs

  - job_name: kubernetes-service-endpoints
    kubernetes_sd_configs:
    - role: endpoints
      api_server: https://192.168.153.21:6443
      bearer_token_file: /opt/monitor/prometheus/token.k8s
      tls_config:
        insecure_skip_verify: true
    bearer_token_file: /opt/monitor/prometheus/token.k8s
    tls_config:
      insecure_skip_verify: true
    # Service没配置注解prometheus.io/scrape的不采集
    relabel_configs:
    - action: keep
      regex: true
      source_labels:
      - __meta_kubernetes_service_annotation_prometheus_io_scrape
    # 重命名采集目标协议
    - action: replace
      regex: (https?)
      source_labels:
      - __meta_kubernetes_service_annotation_prometheus_io_scheme
      target_label: __scheme__
    # 重命名采集目标指标URL路径
    - action: replace
      regex: (.+)
      source_labels:
      - __meta_kubernetes_service_annotation_prometheus_io_path
      target_label: __metrics_path__
    # 重命名采集目标地址
    - action: replace
      regex: ([^:]+)(?::\d+)?;(\d+)
      replacement: $1:$2
      source_labels:
      - __address__
      - __meta_kubernetes_service_annotation_prometheus_io_port
      target_label: __address__
    # 将K8s标签(.*)作为新标签名,原有值不变
    - action: labelmap
      regex: __meta_kubernetes_service_label_(.+)
    # 生成命名空间标签
    - action: replace
      source_labels:
      - __meta_kubernetes_namespace
      target_label: kubernetes_namespace
    # 生成Service名称标签
    - action: replace
      source_labels:
      - __meta_kubernetes_service_name
      target_label: kubernetes_service_name
--------------------------------------------------------------------------
注意:master的ip地址
     token.k8s的位置

1635651251207.png

Grafana导入仪表盘

1635651405145.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容