新手学习Prometheus监控Day02

任务说明
7.3、基于Prometheus的HPA自动伸缩
7.4、Prometheus黑盒监控
7.5、自定义资源接入监控系统
7.6、基于Consul的自动发现


一、遗留问题处理

由于集群是kubeadm工具部署,默认情况下prometheus无法获取controller和scheduler的监控数据,原因是:两个服务的pod没有配置对应的svc;controller和scheduler的yaml文件中服务监听地址是127.0.0.1

kube-controller-manager、kube-scheduler、kube-proxy监听任务

修改配置文件

修改 /etc/kubernetes/manifests/kube-controller-manager.yaml 文件和 /etc/kubernetes/manifests/kube-scheduler.yaml 文件,将其中的 - --bind-address=127.0.0.1 修改为 - --bind-address=0.0.0.0

$ grep bind  /etc/kubernetes/manifests/kube-controller-manager.yaml
    - --bind-address=0.0.0.0
$ grep bind  /etc/kubernetes/manifests/kube-scheduler.yaml
    - --bind-address=0.0.0.0
    
kubectl apply -f /etc/kubernetes/manifests/kube-controller-manager.yaml
kubectl apply -f /etc/kubernetes/manifests/kube-scheduler.yaml

或者如下方式:

sed -i 's/bind-address=127.0.0.1/bind-address=0.0.0.0/g' /etc/kubernetes/manifests/kube-controller-manager.yaml
sed -i 's/bind-address=127.0.0.1/bind-address=0.0.0.0/g' /etc/kubernetes/manifests/kube-scheduler.yaml
kubectl apply -f /etc/kubernetes/manifests/kube-controller-manager.yaml
kubectl apply -f /etc/kubernetes/manifests/kube-scheduler.yaml

在这里插入图片描述
在这里插入图片描述
修改完成之后服务会自动重启
在这里插入图片描述

创建对应的svc

kube-controller-manager svc

cat > prometheus-kubeControllerManagerService.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
  namespace: kube-system
  name: kube-controller-manager
  labels:
    app.kubernetes.io/name: kube-controller-manager
spec:
  selector:
    component: kube-controller-manager
  type: ClusterIP
  clusterIP: None
  ports:
  - name: https-metrics
    port: 10257
    targetPort: 10257
    protocol: TCP
EOF

kubectl apply -f prometheus-kubeControllerManagerService.yaml 

kube-scheduler svc

cat > prometheus-kubeSchedulerService.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
  namespace: kube-system
  name: kube-scheduler
  labels:
    app.kubernetes.io/name: kube-scheduler
spec:
  selector:
    component: kube-scheduler
  type: ClusterIP
  clusterIP: None
  ports:
  - name: https-metrics
    port: 10259
    targetPort: 10259
    protocol: TCP
EOF

kubectl apply -f prometheus-kubeSchedulerService.yaml 

kube-proxy

cat > prometheus-kubeProxy.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
  name: kube-proxy
  namespace: kube-system
spec:
  type: ClusterIP
  clusterIP: None
  ports:
  - port: 10249
    targetPort: 10249
    name: kube-proxy-metrics-port
  selector:
    k8s-app: kube-proxy
EOF

kubectl apply -f prometheus-kubeProxy.yaml

kube-proxy默认监听127.0.0.1:10249,修改监听0.0.0.0:10249
kubectl edit configmap kube-proxy -n kube-system
在这里插入图片描述
重启proxy并验证监听
在这里插入图片描述

controller-manager监控任务

    - job_name: 'controller-manager'
      kubernetes_sd_configs:
      - role: endpoints
      scheme: https
      tls_config:
        insecure_skip_verify: true
      authorization:
        credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: kube-system;kube-controller-manager;https-metrics

scheduler监控任务

    - job_name: 'scheduler'
      kubernetes_sd_configs:
      - role: endpoints
      scheme: https
      tls_config:
        insecure_skip_verify: true
      authorization:
        credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: kube-system;kube-scheduler;https-metrics

kube-proxy监控任务

    - job_name: 'kube-proxy'
      kubernetes_sd_configs:
      - role: endpoints
      scheme: http
      tls_config:
        insecure_skip_verify: true
      authorization:
        credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_name]
        regex: kube-proxy
        action: keep
      - action: labelmap
        regex: __meta_kubernetes_pod_label_(.+)

说明:这里新增了一个scrape job name:controller-manager,Kubernetes 服务发现仍然使用 endpoints,匹配规则有三点(通过 relabel_configs 的 keep 实现):
__meta_kubernetes_namespace endpoint 的 namespace 要求是 kube-system
__meta_kubernetes_service_name service name 要求是 kube-controller-manager
__meta_kubernetes_endpoint_port_name endpoint 的 port_name 要求是叫 https-metrics

验证
在这里插入图片描述

部署metalLB

之前由于没有部署metalLB和ingress,导致Prometheus ingress域名没有绑定IP地址,无法通过域名访问
在这里插入图片描述

二、新知识

基于Prometheus的HPA自动伸缩

在管理好集群和用好集群的同时,还缺少集群的可观察性,给集群安装一个“探针”获取到集群的资源利用率等指标信息,让集群的状态时时对我们透明可见,这样才能做好k8s运维工作。

top(性能调优的基本工具)可以实时展示Linux系统CPU以及内存的使用率
kubec top(需要安装metrics-server插件)可以展示k8s集群的资源信息。

metrics-server

Metrics Server占用极小的资源(每个节点大约占用1m CPU和2MB内存)工具,它可以定时从所有节点的kubelet中采集信息,从而收集k8s核心资源指标。

Metrics Server工作原理
在这里插入图片描述
kubelet通过cAdvisor拿到节点上Pod的指标;
Metrics Server收集每个kubelet中的指标信息,收集到这些信息之后会把信息交给APIServer,这样HPA就可以读取指标进行后续的动作。

各个组件介绍
cAdvisor: 用于收集、聚合和公开 Kubelet 中包含的容器指标的守护程序。
kubelet: 用于管理容器资源的节点代理。 可以使用 /metrics/resource 和 /stats kubelet API 端点访问资源指标。
Summary API: kubelet 提供的 API,用于发现和检索可通过 /stats 端点获得的每个节点的汇总统计信息。
metrics-server: 集群插件组件,用于收集和聚合从每个 kubelet 中提取的资源指标。 API 服务器提供 Metrics API 以供 HPA、VPA 和 kubectl top 命令使用。Metrics Server 是 Metrics API 的参考实现。
Metrics API: Kubernetes API 支持访问用于工作负载自动缩放的 CPU 和内存。 要在你的集群中进行这项工作,你需要一个提供 Metrics API 的 API 扩展服务器。

Metrics Server部署

官方文档:https://github.com/kubernetes-sigs/metrics-server
下载部署yaml文件

wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml  && mv components.yaml metrics-server.yaml

Metrics Server默认使用TLS协议,需要验证证书才能与kubelet进行通信。所以需要进行如下的配置
在这里插入图片描述
访问外网可能有问题,可以配置阿里云镜像源
registry.aliyuncs.com/google_containers/metrics-server:v0.6.1

kubectl apply -f metrics-server.yaml #部署
验证
在这里插入图片描述
等待5分钟左右数据采集完之后,执行kubectl top node查看资源使用情况
在这里插入图片描述
在这里插入图片描述
手动将副本扩容
kubectl get deploy -nkube-sysytem
在这里插入图片描述
kubectl scale deploy coredns --replicas=3 -n kube-system
在这里插入图片描述
验证
在这里插入图片描述
手动扩容难以及时应对生产环境突发的大流量,kubernetes由此诞生一个新的资源对象HorizontalPodScaler,用于动态调整Pod的副本数量。HPA可以根据Metrics Server提供的指标(CPU利用率、内存利用率)或内部指标(qps)来自动调整Pod的副本数,以确保有足够的资源应对突发业务。

**示例:**创建一个nginx应用,定义deployment和service作为自动伸缩的对象
nginx-hpa-dep.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ngx-hpa-dep
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ngx-hpa-dep
  template:
    metadata:
      labels:
        app: ngx-hpa-dep
    spec:
      containers:
      - image: nginx:alpine
        name: nginx
        ports:
        - containerPort: 80
        resources:   #resource字段一定要写清楚,HPA要根据这里判断获取资源指标
          requests:
            cpu: 50m
            memory: 10Mi
          limits:
            cpu: 100m
            memory: 20Mi
---
apiVersion: v1
kind: Service
metadata:
  name: ngx-hpa-svc
spec:
  ports:
 - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: ngx-hpa-dep

部署之后副本默认是1
在这里插入图片描述
nginx-demom-hpa.yaml
指定 Pod 数量最少 2 个,最多 8 个,CPU 使用率5%时扩容
kubectl autoscale 创建一个 HorizontalPodAutoscaler 的样板 YAML 文件

  • min,Pod 数量的最小值,也就是缩容的下限。
  • max,Pod 数量的最大值,也就是扩容的上限。
  • cpu-percent,CPU使用率指标,当大于这个值时扩容,小于这个值时缩容。
    kubectl autoscale deploy ngx-hpa-dep --min=2 --max=8 --cpu-percent=5 --dry-run=client -o yaml > nginx-demo-hpa.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: ngx-hpa
spec:
  maxReplicas: 8
  minReplicas: 2    #最小副本是2
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: ngx-hpa-dep
  targetCPUUtilizationPercentage: 5

验证:①通过kubectl apply创建这个 HorizontalPodAutoscaler 后,它会发现 Deployment 里的实例只有 1 个,不符合 min 定义的下限的要求,就先扩容到 2 个:
在这里插入图片描述
验证:②压测CPU进行扩容
需要注意的是:Metrics Server 大约每 15 秒采集一次数据,所以 HorizontalPodAutoscaler 的自动化扩容和缩容也是按照这个时间点来逐步处理的。

#运行一个测试 Pod,使用的镜像是httpd:alpine,它里面有 HTTP 性能测试工具 ab(Apache Bench)
kubectl run test -it --image=httpd:alpine -- sh

#然后我们向 Nginx 发送一百万个请求,持续 1 分钟,再用 kubectl get hpa 来观察 HorizontalPodAutoscaler 的运行状况:
ab -c 10 -t 60 -n 1000000 'http://ngx-hpa-svc/'

重新打开一个创口动态观察副本数变化:watch kubectl get pod
当它发现目标的 CPU 使用率超过了预定的 5% 后,就会以 2 的倍数开始扩容,一直到数量上限,然后持续监控一段时间;
在这里插入图片描述
在这里插入图片描述
扩容到8副本就会停止
在这里插入图片描述
如果 CPU 使用率回落,就会再缩容到最小值 (默认会等待五分钟如果负载没有上去,就会缩小到最低水平,防止抖动)。
等待时间可以单独配置

总结

  1. MetricsServer是Kubernetes中的一个组件,它可以将集群中的散布的资源使用情况数据收集并聚合起来。收集的数据包括节点的CPU和内存使用情况等。
  2. 通过API提供给Kubernetes中的其它组件(如HPA)使用。MetricsServer可以帮助集群管理员和应用程序开发者更好的了解集群中资源的使用情况,并根据这些数据做出合理的决策,例如调整Pod副本数、扩展集群等。
  3. Metrics Server对于Kubernetes中的资源管理和应用程序扩展非常重要。

Prometheus黑盒监控Blackbox

传统方式只关注服务的某些指标(如内存、指标),但是却无法判断服务是否可用,例如:一个服务在运行状态下但是却无法处理请求或者请求返回错误的数据,这种传统监控是监控不到的。而blackbox则可以定期发起请求,检查返回结果判断服务是否可用。
blackbox核心思想:模拟一个独立于服务的,符合服务使用协议规则的请求发送到某个服务,然后根据返回结果来判断服务是否可用。

白盒监控:是指我们日常监控主机的资源用量、容器的运行状态的运行数据。
黑盒监控:常见的黑盒监控包括 HTTP探针、TCP探针、Dns、Icmp等用于检测站点、服务的可访问性、服务的连通性,以及访问效率等。
一个完善的监控目标,是要从白盒角度发现潜在的问题,能够在黑盒的角度快速发现已经发生的问题。

黑盒监控是以故障为导向当故障发生时,黑盒监控能快速发现故障。
白盒监控则侧重于主动发现或者预测潜在的问题。

黑盒监控应用场景

  • ICMP 测试:主机探活机制 TCP 测试:业务组件端口状态监听、应用层协议定义与监听
  • HTTP 测试:定义 Request Header信息、判断 Http status / Http Respones Header / Http Body 内容
  • POST 测试:接口联通性
  • SSL 证书过期时间

Blackbox Exporter部署

configmap可以参考
https://github.com/prometheus/blackbox_exporter/blob/master/CONFIGURATION.md
https://github.com/prometheus/blackbox_exporter/blob/master/example.yml

首先得声明一个 Blackbox 的 Deployment,并利用 Configmap 来为 Blackbox 提供配置文件。
blackbox-configmap.yaml
需要先部署configmap,否则blackbox的deployment部署会有异常

apiVersion: v1
kind: ConfigMap
metadata:
  name: blackbox-exporter
  namespace: monitor
  labels:
    app: blackbox-exporter
data:
  blackbox.yml: |-
    modules:
      ## ----------- DNS 检测配置 -----------
      dns_tcp:  
        prober: dns
        dns:
          transport_protocol: "tcp"
          preferred_ip_protocol: "ip4"
          query_name: "kubernetes.default.svc.cluster.local" # 用于检测域名可用的网址
          query_type: "A" 
      ## ----------- TCP 检测模块配置 -----------
      tcp_connect:
        prober: tcp
        timeout: 5s
      ## ----------- ICMP 检测配置 -----------
      icmp:
        prober: icmp
        timeout: 5s
        icmp:
          preferred_ip_protocol: "ip4"
      ## ----------- HTTP GET 2xx 检测模块配置 -----------
      http_get_2xx:  
        prober: http
        timeout: 10s
        http:
          method: GET
          preferred_ip_protocol: "ip4"
          valid_http_versions: ["HTTP/1.1","HTTP/2"]
          valid_status_codes: [200]           # 验证的HTTP状态码,默认为2xx
          no_follow_redirects: false          # 是否不跟随重定向
      ## ----------- HTTP GET 3xx 检测模块配置 -----------
      http_get_3xx:  
        prober: http
        timeout: 10s
        http:
          method: GET
          preferred_ip_protocol: "ip4"
          valid_http_versions: ["HTTP/1.1","HTTP/2"]
          valid_status_codes: [301,302,304,305,306,307]  # 验证的HTTP状态码,默认为2xx
          no_follow_redirects: false                     # 是否不跟随重定向
      ## ----------- HTTP POST 监测模块 -----------
      http_post_2xx: 
        prober: http
        timeout: 10s
        http:
          method: POST
          preferred_ip_protocol: "ip4"
          valid_http_versions: ["HTTP/1.1", "HTTP/2"]
          #headers:                             # HTTP头设置
          #  Content-Type: application/json
          #body: '{}'                           # 请求体设置

blackbox-exporter.yaml

apiVersion: v1
kind: Service
metadata:
  name: blackbox-exporter
  namespace: monitor
  labels:
    k8s-app: blackbox-exporter
spec:
  type: ClusterIP
  ports:
  - name: http
    port: 9115
    targetPort: 9115
  selector:
    k8s-app: blackbox-exporter
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: blackbox-exporter
  namespace: monitor
  labels:
    k8s-app: blackbox-exporter
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: blackbox-exporter
  template:
    metadata:
      labels:
        k8s-app: blackbox-exporter
    spec:
      containers:
      - name: blackbox-exporter
        image: prom/blackbox-exporter:v0.21.0
        imagePullPolicy: IfNotPresent
        args:
        - --config.file=/etc/blackbox_exporter/blackbox.yml
        - --web.listen-address=:9115
        - --log.level=info
        ports:
        - name: http
          containerPort: 9115
        resources:
          limits:
            cpu: 200m
            memory: 256Mi
          requests:
            cpu: 100m
            memory: 50Mi
        livenessProbe:
          tcpSocket:
            port: 9115
          initialDelaySeconds: 5
          timeoutSeconds: 5
          periodSeconds: 10
          successThreshold: 1
          failureThreshold: 3
        readinessProbe:
          tcpSocket:
            port: 9115
          initialDelaySeconds: 5
          timeoutSeconds: 5
          periodSeconds: 10
          successThreshold: 1
          failureThreshold: 3
        volumeMounts:
        - name: config
          mountPath: /etc/blackbox_exporter
      volumes:
      - name: config
        configMap:
          name: blackbox-exporter
          defaultMode: 420

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

配置探测任务

DNS监控

vim prometheus-config.yaml

    - job_name: "kubernetes-dns"
      metrics_path: /probe      # 不是 metrics,是 probe
      params:
        module: [dns_tcp]       # 使用 DNS TCP 模块
      static_configs:
        - targets:
          - kube-dns.kube-system:53     # 不要省略端口号
          - 8.8.4.4:53
          - 8.8.8.8:53
          - 223.5.5.5:53
      relabel_configs:
        - source_labels: [__address__]
          target_label: __param_target
        - source_labels: [__param_target]
          target_label: instance
        - target_label: __address__
          replacement: blackbox-exporter.monitor:9115       # 服务地址,和上面的 Service 定义保持一致

以下为部分参数的解释

################ DNS 服务器监控 ###################
- job_name: "kubernetes-dns"
  metrics_path: /probe
  params:
    ## 配置要使用的模块,要与blackbox exporter配置中的一致
    ## 这里使用DNS模块
    module: [dns_tcp]
  static_configs:
    ## 配置要检测的地址
    - targets:
      - kube-dns.kube-system:53
      - 8.8.4.4:53
      - 8.8.8.8:53
      - 223.5.5.5
  relabel_configs:
    ## 将上面配置的静态DNS服务器地址转换为临时变量 “__param_target”
    - source_labels: [__address__]
      target_label: __param_target
    ## 将 “__param_target” 内容设置为 instance 实例名称
    - source_labels: [__param_target]
      target_label: instance
    ## BlackBox Exporter 的 Service 地址
    - target_label: __address__
      replacement: blackbox-exporter.monitor:9115

kubectl apply -f prometheus-config.yaml
热加载
curl -XPOST http://prometheus.kubernets.cn/-/reload
验证
在这里插入图片描述
在这里插入图片描述

ICMP采集任务
    - job_name: icmp-status
      metrics_path: /probe
      params:
        module: [icmp]
      static_configs:
      - targets:
        - 192.10.192.222
        labels:
          group: icmp
      relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: blackbox-exporter.monitor:9115
http监控任务

自定义发现 Service 监控 端口 和 路径

    - job_name: 'kubernetes-services'
      metrics_path: /probe
      params:
        module:     ## 使用HTTP_GET_2xx与HTTP_GET_3XX模块
        - "http_get_2xx"
        - "http_get_3xx"
      kubernetes_sd_configs:        ## 使用Kubernetes动态服务发现,且使用Service类型的发现
      - role: service
      relabel_configs:      ## 设置只监测Kubernetes Service中Annotation里配置了注解prometheus.io/http_probe: true的service
      - action: keep
        source_labels: [__meta_kubernetes_service_annotation_prometheus_io_http_probe]
        regex: "true"
      - action: replace
        source_labels: 
        - "__meta_kubernetes_service_name"
        - "__meta_kubernetes_namespace"
        - "__meta_kubernetes_service_annotation_prometheus_io_http_probe_port"
        - "__meta_kubernetes_service_annotation_prometheus_io_http_probe_path"
        target_label: __param_target
        regex: (.+);(.+);(.+);(.+)
        replacement: $1.$2:$3$4
      - target_label: __address__
        replacement: blackbox-exporter.monitor:9115     ## BlackBox Exporter 的 Service 地址
      - source_labels: [__param_target]
        target_label: instance
      - action: labelmap
        regex: __meta_kubernetes_service_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_service_name]
        target_label: kubernetes_name   

需要在service中配置如下annotation才能被探测

annotations:
  prometheus.io/http-probe: "true"      ## 开启 HTTP 探针
  prometheus.io/http-probe-port: "8080"     ## HTTP 探针会使用 8080 端口来进行探测
  prometheus.io/http-probe-path: "/healthCheck"     ## HTTP 探针会请求  /healthCheck  路径来进行探测,以检查应用程序是否正常运行

示例代码

apiVersion: v1
kind: Service
metadata:
  name: springboot
  annotations:
    prometheus.io/http-probe: "true"
    prometheus.io/http-probe-port: "8080"
    prometheus.io/http-probe-path: "/apptwo"
spec:
  type: ClusterIP
  selector:
    app: springboot
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 8080

配置完Prometheus采集任务之后都需要热加载
curl -XPOST http://prometheus.kubernets.cn/-/reload

TCP监控任务
    - job_name: "service-tcp-probe"
      scrape_interval: 1m
      metrics_path: /probe
      # 使用blackbox exporter配置文件的tcp_connect的探针
      params:
        module: [tcp_connect]
      kubernetes_sd_configs:
      - role: service
      relabel_configs:
      # 保留prometheus.io/scrape: "true"和prometheus.io/tcp-probe: "true"的service
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape, __meta_kubernetes_service_annotation_prometheus_io_tcp_probe]
        action: keep
        regex: true;true
      # 将原标签名__meta_kubernetes_service_name改成service_name
      - source_labels: [__meta_kubernetes_service_name]
        action: replace
        regex: (.*)
        target_label: service_name
      # 将原标签名__meta_kubernetes_service_name改成service_name
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        regex: (.*)
        target_label: namespace
      # 将instance改成 `clusterIP:port` 地址
      - source_labels: [__meta_kubernetes_service_cluster_ip, __meta_kubernetes_service_annotation_prometheus_io_http_probe_port]
        action: replace
        regex: (.*);(.*)
        target_label: __param_target
        replacement: $1:$2
      - source_labels: [__param_target]
        target_label: instance
      # 将__address__的值改成 `blackbox-exporter.monitor:9115`
      - target_label: __address__
        replacement: blackbox-exporter.monitor:9115

tcp需要在service上添加注释必须有以下三行

  annotations:
    prometheus.io/scrape: "true"        ## 这个服务是可以被采集指标的,Prometheus 可以对这个服务进行数据采集
    prometheus.io/tcp-probe: "true"     ## 开启 TCP 探针
    prometheus.io/http-probe-port: "8080"       ## HTTP 探针会使用 8080 端口来进行探测,以检查应用程序是否正常运行

示例应用

apiVersion: v1
kind: Service
metadata:
  name: springboot
  annotations:
    prometheus.io/scrape: "true"
    prometheus.io/tcp-probe: "true"
    prometheus.io/http-probe-port: "8080"
spec:
  type: ClusterIP
  selector:
    app: springboot
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 8080

案例分析:采集不到端口
在这里插入图片描述
任务中采集的是http端口,而不是tcpde
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
configmap不需要修改,只需要修改svc层面
在这里插入图片描述
在这里插入图片描述

HTTP 监控(监控外部域名)
    - job_name: "blackbox-external-website"
      scrape_interval: 30s
      scrape_timeout: 15s
      metrics_path: /probe
      params:
        module: [http_get_2xx]
      static_configs:
      - targets:
        - https://www.baidu.com # 改为公司对外服务的域名
        - https://www.jd.com
      relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: blackbox-exporter.monitor:9115
HTTP Post 监控(监控外部域名)
    - job_name: 'blackbox-http-post'
      metrics_path: /probe
      params:
        module: [http_post_2xx]
      static_configs:
        - targets:
          - https://www.example.com/api # 要检查的网址
      relabel_configs:
        - source_labels: [__address__]
          target_label: __param_target
        - source_labels: [__param_target]
          target_label: instance
        - target_label: __address__
          replacement: blackbox-exporter.monitor:9115

总结

  • Blackbox Exporter是一个用于监控网络服务的开源工具。
  • 通过模拟HTTP、HTTPS、DNS、TCP等协议向服务端发送请求,并返回响应码、响应时间等信息。
  • Blackbox Exporter具有高度的灵活性,可以通过配置文件进行定制,包括对请求的频率、超时时限、请求头、请求参数等进行配置。
  • Blackbox Exporter还支持Prometheus监控系统,可以将采集到的数据自动发送给Prometheus,并进行聚合和展示。

自定义资源接入监控系统

Prometheus使用各种Exporter来监控资源。Exporter可以看成是监控的agent端,它负责收集对应资源的指标,并提供接口给到Prometheus读取。

虚拟机监控

配置安装node-exporter

docker run -d -p 9100:9100 \
-v "/proc:/host/proc" \
-v "/sys:/host/sys" \
-v "/:/rootfs" \
-v "/etc/localtime:/etc/localtime" \
prom/node-exporter \
--path.procfs /host/proc \
--path.sysfs /host/sys \
--collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"  

验证数据是否收集:curl localhost:9100/metrics

配置采集任务

    - job_name: 'other-ECS'
      static_configs:
        - targets: ['192.10.192.14:9100']
          labels:
            hostname: 'test-node-exporter'

在这里插入图片描述

特殊应用进程监控

配置

#配置文件,指定进程名称,模式采用Matches模式,监控进程是sd-api这个服务
mkdir -p /opt/process-exporter/config
cat /opt/process-exporter/config/process-exporter.yml
process_names:
  - name: "{{.Matches}}"
    cmdline:
    - 'sd-api'

# 被采集端配置安装process-exporter
docker run -itd --rm -p 9256:9256 --privileged -v /proc:/host/proc -v /opt/process-exporter/config:/config ncabatoff/process-exporter --procfs /host/proc -config.path config/process-exporter.yml

匹配 sd-api 的进程(ps -ef | grep sd-api)
通过process-exporter的网页去查看监控的数据, 包含:namedprocess_namegroup_num_procs{groupname=“map[:sd-api]”} 即代表启动正确

## 指定过程进行监控
# cat process-exporter.yml
process_names:
  - name: "{{.Matches}}"
    cmdline:
    - 'sd-api'

#  - name: "{{.Matches}}"
#    cmdline:
#    - 'mysqld'

#  - name: "{{.Matches}}"
#    cmdline:
#    - 'org.apache.zookeeper.server.quorum.QuorumPeerMain'

curl验证
curl localhost:9256/metrics |grep namedprocess_namegroup_num_procs
在这里插入图片描述

# ps aux | grep -v grep | grep sd-api
root     19294  2.6 13.7 7893360 2267104 ?     Ssl  Mar31 1829:10 java -jar /opt/xplatform-sd-api.jar -Dfile.encoding=UTF-8
root     19640  2.6 13.5 7891468 2218288 ?     Ssl  Mar31 1828:54 java -jar /opt/xplatform-sd-api.jar -Dfile.encoding=UTF-8

增加job采集数据

    - job_name: 'process-exporter'
      static_configs:
      - targets: ['192.10.192.14:9256']

在这里插入图片描述

中间件MySQL

准备工作
①安装数据库
②准备需要的库表和用户信息

CREATE USER 'exporter'@'%' IDENTIFIED BY '123asdZXC';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
flush privileges;

启动容器

docker run -d  --restart=always  --name mysqld-exporter -p 9104:9104 -e DATA_SOURCE_NAME="exporter:123asdZXC@(192.10.192.14:3306)/"  prom/mysqld-exporter

验证
curl localhost:9104/metrics

新增监控任务

    - job_name: 'mysql-exporter'
      static_configs:
      - targets: ['192.10.192.134:9104']

基于Consul的自动发现

consul简介:Consul是分布式k/v数据库,是一个服务注册组件,其他服务都可以注册到consul上,Prometheus也不例外,通过consul的服务发现,我们可以避免在Prometheus中指定大量的target。

当前痛点:Prometheus配置文件 prometheus-config.yaml 配置了大量的采集规则,基本上都是运维小伙伴手动处理,如果后面增加了节点或者组件信息,就得手动修改此配置,并热加载 promethues;那么能否动态的监听微服务呢?Prometheus 提供了多种动态服务发现的功能,这里以 consul 为例。

思路:

  1. prometheus配置采集job动态发现consul注册中心的数据
  2. 主机一旦配置好数据采集,通过简单的几条命令或者脚本完成数据采集接入

Prometheus服务发现机制
1)static_configs: #静态服务发现
2)file_sd_configs: #文件服务发现
3)dns_sd_configs: DNS #服务发现
4)kubernetes_sd_configs: #Kubernetes 服务发现
5)consul_sd_configs: Consul #服务发现

一、prometheus简介 Prometheus是一个开源的系统监控和告警系统,现在已经加入到CNCF基金会,成为继k8s之后第二个在CNCF维护管理的项目,在kubernetes容器管理系统中,通常会搭配prometheus进行监控prometheus支持多种exporter采集数据,还支持通过pushgateway进行数据上报,Prometheus再性能上可支撑上万台规模的集群。 二、prometheus架构图 三、prometheus组件介绍 1.Prometheus Server: 用于收集和存储时间序列数据。 2.Client Library: 客户端库,检测应用程序代码,当Prometheus抓取实例的HTTP端点时,客户端库会将所有跟踪的metrics指标的当前状态发送到prometheus server端。 3.Exporters: prometheus支持多种exporter,通过exporter可以采集metrics数据,然后发送到prometheus server端 4.Alertmanager: 从 Prometheus server 端接收到 alerts 后,会进行去重,分组,并路由到相应的接收方,发出报警,常见的接收方式有:电子邮件,微信,钉钉, slack等。 5.Grafana:监控仪表盘 6.pushgateway: 各个目标主机可上报数据到pushgatewy,然后prometheus server统一从pushgateway拉取数据。 四、课程亮点 五、效果图展示 六、讲师简介 先超(lucky):高级运维工程师、资深DevOps工程师,在互联网上市公司拥有多年一线运维经验,主导过亿级pv项目的架构设计和运维工作 主要研究方向: 1.云计算方向:容器 (kubernetes、docker),虚拟化(kvm、Vmware vSphere),微服务(istio),PaaS(openshift),IaaS(openstack)等2.系统/运维方向:linux系统下的常用组件(nginx,tomcat,elasticsearch,zookeeper,kafka等),DevOps(Jenkins+gitlab+sonarqube+nexus+k8s),CI/CD,监控(zabbix、prometheus、falcon)等 七、课程大纲
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值