一、docker部署prometheus

一 介绍
Prometheus Server 监控端主程序(监控机上部署)如果prometheus是物理机部署想监控pod只要能连接到cAdvsor就行。
Node exporter 负载收集宿主机的硬件信息(node节点上部署)
cAdvsor 负责收集宿主机上的所有容器信息,好像单台容器信息收集不到它只能收集容器的总使用率,容器一般监控cpu 内存 网络 (node节点上部署)
Grafana 负责图形展示(监控机上部署)
alertmanager 负责报警(在监控机上部署)
如果想部署docker版的pushgateway,需要被监控容器需要提前部署好crontab才能定期推送数据给pushgateway
https://www.jb51.net/article/219848.htm#_label2
grafana模版地址https://grafana.com/grafana/dashboards/

二 查询
1、查询目标是容器container时
• 查询目标是容器时都是container_* 开头的
• 查询目标是物理机时都是node_* 开头的

1 容器查询参数,单位是字节(B),grafana直接改成单位子节就能自动转换

# 查询cpu使用率
sum(irate(container_cpu_usage_seconds_total{image!=""}[1m])) without (cpu) * 100

# 查询内存使用量
container_memory_working_set_bytes{image!=""} 
# 查询内存使用率(由于数值无穷大会显示+lnf)
sum(container_memory_working_set_bytes{name="MyNginx"}) by (name) / sum(container_spec_memory_limit_bytes{name="MyNginx"}) by (name) * 100

# 网卡每秒下载速度network Rx
irate(container_network_receive_bytes_total{image!=""}[5m])

# 网卡每秒上传速度nentwork Tx
irate(container_network_transmit_bytes_total{image!=""}[5m])

三 部署
1、启动prometheus容器

  • 可以装在master上或node上
(1) 先启动prometheus访问测试
# docker run -itd --privileged=true --restart=always -p 9090:9090 --net=bridge --name=prome prom/prometheus
---------------
--net=bridge     # 使用桥接网络可以直接与node exporter通信,或自己创建一个网络

(2) 把prometheus.yml文件拷贝出来,如果不拷贝出来再次启动容器时使用-v指定挂载目录容器目录会被清空
# docker cp prome:/etc/prometheus/prometheus.yml /soft/docker/prometheus/

(3) 重新启动prometheus并挂载
# docker run -itd --privileged=true --restart=always -p 9090:9090 --net=bridge -v /soft/docker/prometheus:/etc/prometheus -v /etc/localtime:/etc/localtime  --name=prome prom/prometheus
--------------------
这里要把prometheus真个目录挂过来

(4) 查看容器内部ip
# docker exec -it prome  ifconfig eth0|grep "inet addr"
          inet addr:172.16.15.2  Bcast:172.16.15.255  Mask:255.255.255.0

(5) 访问node节点ip
 http://192.168.1.10:9090

2、启动node_exporter容器

  • 写法都是固定的直接粘贴就行
  • 在node节点上部署
  • 这些组件都使用桥接网络通信
(1) 启动node-export 
docker run -d -p 9100:9100 --name=node-exporter \
    -v "/proc:/host/proc" \
    -v "/sys:/host/sys" \
    -v "/:/rootfs" \
    --net=bridge \
    prom/node-exporter \
    --path.procfs /host/proc \
    --path.sysfs /host/sys \
    --path.rootfs=/rootfs \
    --collector.filesystem.ignored-mount-points="^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)"

(2)查看容器内网ip
# docker exec -it node-exporter ifconfig eth0|grep "inet addr"
          inet addr:172.16.15.3  Bcast:172.16.15.255  Mask:255.255.255.0

(3) 把node_export加入prometheus.yml并重启prometheus
 - job_name: "node1"
    static_configs:
      - targets: ["192.168.1.10:9100"]
        labels:
          rule: node1

3、启动cAdvisor

  • 部署上这个后才会有container 监控参数
(1) 启动cadvisor容器,--publish=-p
docker run -d \
-v "/etc/localtime:/etc/localtime" \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=18104:8080 \
--detach=true \
--name=cadvisor \
--privileged=true \
--net=bridge \
google/cadvisor:latest

==== m1 芯片要使用arm64架构,linux使用amd64架构
docker run -d \
-v "/etc/localtime:/etc/localtime" \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=18104:8080 \
--detach=true \
--name=cadvisor \
--privileged=true \
--net=bridge \
unibaktr/cadvisor:latest
===

(2) 把cadvisor加入prometheus.yml并重启prometheus
- job_name: "node1"
    static_configs:
      - targets: ["192.168.1.10:9100","172.16.15.4:8080"]   # 直接用容器内部ip就行8080是cadvisor的端口
        labels:
          rule: node1

(3) 访问cadvisor可以看到所有被监控的容器信息(需要等会才能采集到数据,它只采集不存储)

在这里插入图片描述
在这里插入图片描述

4、查看prometheus是否接入成功
在这里插入图片描述

5、查询prometheus监控数据
(1) 这里查询的是node1节点cpu使用率信息
在这里插入图片描述
(2) 查看容器的cpu使用率,image容器镜像,name是容器名称
在这里插入图片描述
(3) 查看容器内存使用与docker stats看到的一样
在这里插入图片描述
6、启动grafana容器

  • docker模版号193
  • linux监控模版号9276
docker run -d -i -p 3000:3000 --name=grafana \
-v "/etc/localtime:/etc/localtime" \
-e "GF_SERVER_ROOT_URL=http://grafana.server.name" \
-e "GF_SECURITY_ADMIN_PASSWORD=admin" \
--net=bridge \
grafana/grafana
----------------------
账号:admin
密码:admin

7、启动alert-manager容器

(1) 先启动alert-manager把配置文件拿下来
# docker run -itd -p 9093:9093 --name=alert     prom/alertmanager
# docker cp alert:/etc/alertmanager/alertmanager.yml ./

(2) 替换alertmanager.yml内容如下
# cat alertmanager.yml 
global:
  resolve_timeout: 5m                    # 持续5分钟没有收到告警标记就会认为已经发送过了
  smtp_from: "1107916963@qq.com"         # 配置发件邮箱信息
  smtp_smarthost: 'smtp.qq.com:25'
  smtp_auth_username: "1107916963@qq.com"
  smtp_auth_password: "fecmtfzctecigcid"
  smtp_require_tls: false                # 禁用TLS传输方式


route:                                  # 路由配置:用于判断把告警信息发给谁,路由可以有多个             
  group_by: ['alertname']  # 定义分组名称,promethues支持告警分组功能:满足规则的报警会被合并到一个通知中
  group_wait: 10s         # 分组等待时间间隔:在这个时间内收到的告警信息会合并到之前的告警信息中
  group_interval: 10s      # 定义相同组间发送告警通知的时间间隔
  repeat_interval: 30m     # 定义报警重复时间间隔
  receiver: 'email'                     # 把告警信息发给哪一个接收者(对应reveivers中的name标签)

receivers:                              # 接收者配置
  - name: 'email'                       # 接收者名称(对应receiver标签)
    email_configs:                      # email配置参数,还支持wechat_configs、webhook_configs
    - to: "wenqiangit@163.com"        # 接收者邮箱     
      send_resolved: true
      headers:                          # 这个不写也可以
        subject: "Grafana告警"           # 自定义邮件主题信息, 可以只写这一条
        from: "Grafana"                 # 自定义由谁发出的信息
        to: "OP"                        # 自定义要发给谁


inhibit_rules:                          # 抑制配置:防止同一条信息重复发送
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']


(3) 再次启动并挂载
# docker run -itd -p 9093:9093 --name=alert  -v /soft/docker/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml   prom/alertmanager
# docker exec -it alert alertmanager --version
alertmanager, version 0.23.0

(4) 把alertmanager加入prometheus.yml并增加报警规则
# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets: ['192.168.1.10:9093']
rule_files:
  - "/etc/prometheus/rules.yml"

(5) 在prometheus挂载目录下创建rules.yml
# cat /soft/docker/prometheus/rules.yml 
groups:
- name: node_alert-rule1       # 第一个告警规则
  rules:
  - alert: cpu_alert           # 告警名称
    expr: 100 - avg(irate(node_cpu_seconds_total{mode="idle"}[1m])) by (instance) * 100 > 5    # 告警语句
    for: 1m                    # 持续1分钟就发邮件告警
    labels:
      level: warning           # 告警级别
      system: node             # 这里可以自定义标签对应alertmanager.yml中的子路由标签
    annotations:
      description: "instance: {{ $labels.instance }} , cpu usage is too high ! value: {{ $value }}" # 告警内容
      summary: "cpu usage is too high" # 描述信息


- name: pod_cpu       # 第二个告警规则
  rules:
  - alert: pod_cpu_alert           # 告警名称
    expr: sum(irate(container_cpu_usage_seconds_total{image!=""}[1m])) without (cpu) * 100 > 5    # 告警语句
    for: 1m                    # 持续1分钟就发邮件告警
    labels:
      level: warning           # 告警级别
      system: node             # 这里可以自定义标签对应alertmanager.yml中的子路由标签
    annotations:
      description: "instance: {{ $labels.name }} , pod cpu usage is too high ! value: {{ $value }}" # 告警内容
      summary: "cpu usage is too high" # 描述信息

(6) 查看prometheus-Alerts已经触发报警规则

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、k8s部署prometheus

方法一:通过通过github项目一件部署
实际上Prometheus Operator对于Job的配置只适用于在Kubernetes中部署和管理的应用程序。如果你希望使用Prometheus监控一些其他的资源,例如AWS或者其他平台中的基础设施或者应用,这些并不在Prometheus Operator的能力范围之内。
需要翻墙(这种方式感觉有问题也可能是我不会用,把alertmanager grafana prometheus通过NodePort暴露出来只能本机访问,外部无法访问但有时候外部又能访问??)
https://www.cnblogs.com/huss2016/p/14865316.html
https://github.com/prometheus-operator/kube-prometheus
在这里插入图片描述
1、拉代码,我的kubenetes时1.25我应该拉release-0.12版本

(1) 确定我的k8s版本号
# kubectl get nodes
NAME           STATUS   ROLES    AGE   VERSION
192.168.1.14   Ready    <none>   18h   v1.25.6
192.168.1.18   Ready    <none>   18h   v1.25.6

(2) 拉代码
git clone -b release-0.12  https://github.com/prometheus-operator/kube-prometheus.git

2、部署prometheus

(1) 部署
# 就这三条命令内存给大点(4g)很快部署完毕
# cd kube-prometheus/
kubectl apply --server-side -f manifests/setup
kubectl wait \
	--for condition=Established \
	--all CustomResourceDefinition \
	--namespace=monitoring
kubectl apply -f manifests/

# 如果环境不再需要了就这样清除
kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup

(2) 我们查看pod发现有些镜像没有拉下来
# kubectl get pod -n monitoring
NAME                                   READY   STATUS             RESTARTS      AGE
alertmanager-main-0                    1/2     Running            1 (41s ago)   3m51s
alertmanager-main-1                    1/2     Running            1 (31s ago)   3m51s
alertmanager-main-2                    1/2     Running            1 (41s ago)   3m51s
blackbox-exporter-6fd586b445-8xlcb     3/3     Running            0             5m21s
grafana-9f58f8675-m2rng                1/1     Running            0             5m19s
kube-state-metrics-66659c89c-9m7vj     2/3     ImagePullBackOff   0             5m18s
node-exporter-cmtc6                    2/2     Running            0             5m18s
node-exporter-cpffz                    2/2     Running            0             5m18s
prometheus-adapter-757f9b4cf9-ljf5p    0/1     ErrImagePull       0             5m16s
prometheus-adapter-757f9b4cf9-mgcsj    0/1     ImagePullBackOff   0             5m16s
prometheus-k8s-0                       2/2     Running            0             3m51s
prometheus-k8s-1                       2/2     Running            0             3m51s
prometheus-operator-776c6c6b87-gn6ff   2/2     Running            0             5m15s

(3) 我们看一下哪些镜像没有拉下来
kubectl describe pod prometheus-adapter-757f9b4cf9-mgcsj -n monitoring
 Warning  Failed     5m52s (x7 over 10m)  kubelet            Error: ImagePullBackOff
  Warning  Failed     67s (x2 over 7m40s)  kubelet            Failed to pull image "registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.10.0": rpc error: code = Unknown desc = failed to pull and unpack image "registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.10.0": failed to resolve reference "registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.10.0": failed to do request: Head "https://asia-east1-docker.pkg.dev/v2/k8s-artifacts-prod/images/prometheus-adapter/prometheus-adapter/manifests/v0.10.0": dial tcp 108.177.97.82:443: i/o timeout
发现这个镜像没有拉下来registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.10.0
我们看一下这个镜像在哪个yaml文件中
# grep "prometheus-adapter:v0.10.0" /soft/kube-prometheus/manifests/*.yaml
prometheusAdapter-deployment.yaml:        image: registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.10.0

(4)然后我们去hub.docker中找一下这个镜像然后替换prometheusAdapter-deployment.yaml里面的镜像并重新apply
# grep "image" prometheusAdapter-deployment.yaml 
        image: selina5288/prometheus-adapter:v0.9.1
# kubectl apply -f  prometheusAdapter-deployment.yaml 

(5) 最后查看以及启动的pod
# kubectl get pod -n monitoring
NAME                                   READY   STATUS             RESTARTS         AGE
alertmanager-main                      1/2     Running            18 (5m56s ago)   58m
blackbox-exporter-6fd586b445-8xlcb     3/3     Running            0                5h1m
grafana-9f58f8675-m2rng                1/1     Running            0                5h1m
kube-state-metrics-f8cbfb55f-m4sf8     3/3     Running            0                4h35m
node-exporter-cmtc6                    2/2     Running            0                5h1m
node-exporter-cpffz                    2/2     Running            0                5h1m
prometheus-adapter-6c7bbd7f75-5f2pm    1/1     Running            0                4h40m
prometheus-k8s-0                       2/2     Running            0                5h
prometheus-k8s-1                       2/2     Running            0                5h
prometheus-operator-776c6c6b87-gn6ff   2/2     Running            0                5h1m

3、访问

(1)我们查看svc资源发现都是clusterIP是无法访问的,通过需要配置Ingres来访问,但是今天我们使用Nodeport方式
# kubectl get svc -n monitoring
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
alertmanager-main       ClusterIP   10.68.115.212   <none>        9093/TCP,8080/TCP            5h2m
alertmanager-operated   ClusterIP   None            <none>        9093/TCP,9094/TCP,9094/UDP   59m
blackbox-exporter       ClusterIP   10.68.149.99    <none>        9115/TCP,19115/TCP           5h2m
grafana                 ClusterIP   10.68.146.11    <none>        3000/TCP                     5h2m
kube-state-metrics      ClusterIP   None            <none>        8443/TCP,9443/TCP            5h2m
node-exporter           ClusterIP   None            <none>        9100/TCP                     5h2m
prometheus-adapter      ClusterIP   10.68.219.68    <none>        443/TCP                      5h2m
prometheus-k8s          ClusterIP   10.68.179.68    <none>        9090/TCP,8080/TCP            5h2m
prometheus-operated     ClusterIP   None            <none>        9090/TCP                     5h1m
prometheus-operator     ClusterIP   None            <none>        8443/TCP                     5h2m

(2) 修改svc资源类型并apply
# vim prometheus-service.yaml 
# vim grafana-service.yaml 
# vim alertmanager-service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: alert-router
    app.kubernetes.io/instance: main
    app.kubernetes.io/name: alertmanager
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 0.25.0
  name: alertmanager-main
  namespace: monitoring
spec:
  ports:
  - name: web
    port: 9093
    targetPort: web
  - name: reloader-web
    port: 8080
    targetPort: reloader-web
  type: NodePort                   # 增加一行
  selector:
    app.kubernetes.io/component: alert-router
    app.kubernetes.io/instance: main
    app.kubernetes.io/name: alertmanager
    app.kubernetes.io/part-of: kube-prometheus
  sessionAffinity: ClientIP

(2)再次查看svc资源已改成NodePort
# kubectl get svc -n monitoring
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE
alertmanager-main       NodePort    10.68.115.212   <none>        9093:30055/TCP,8080:32561/TCP   5h11m
alertmanager-operated   ClusterIP   None            <none>        9093/TCP,9094/TCP,9094/UDP      68m
blackbox-exporter       ClusterIP   10.68.149.99    <none>        9115/TCP,19115/TCP              5h11m
grafana                 NodePort    10.68.146.11    <none>        3000:31406/TCP                  5h11m
kube-state-metrics      ClusterIP   None            <none>        8443/TCP,9443/TCP               5h11m
node-exporter           ClusterIP   None            <none>        9100/TCP                        5h11m
prometheus-adapter      ClusterIP   10.68.219.68    <none>        443/TCP                         5h11m
prometheus-k8s          NodePort    10.68.179.68    <none>        9090:30554/TCP,8080:30207/TCP   5h11m
prometheus-operated     ClusterIP   None            <none>        9090/TCP                        5h10m
prometheus-operator     ClusterIP   None            <none>        8443/TCP                        5h11m

(3) 访问node节点ip:port,如果pod所在node变了访问的ip也要换一下
# 查看pod坐在哪个node节点
# kubectl get pod -n monitoring -o wide|egrep "prometheus-k8s|grafana|alert"
alertmanager-main-0                    2/2     Running   0          9m11s   172.20.0.18    192.168.1.14   <none>           <none>
grafana-9f58f8675-m2rng                1/1     Running   0          6h6m    172.20.0.2     192.168.1.14   <none>           <none>
prometheus-k8s-0                       2/2     Running   0          13m     172.20.0.23    192.168.1.18   <none>           <none>


方法二 通过独立部署的prometheus监控k8s
它是通过api接口+token+rbac授权+证书才能建立连接
http://e.betheme.net/article/show-201060.html?action=onClick
https://blog.csdn.net/m0_48898914/article/details/128194358

方法三、yaml方式部署prometheus监控k8s
https://blog.csdn.net/rzy1248873545/article/details/125758153

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐