• prometheus k8s服务发现


    Prometheus的服务发现在解决什么问题?


    被监控的目标(target)是整个监控体系中重要组成部分,传统监控系统zabbix通过 网络发现的机制自动创建主机到zabbix-server,进而快速地对目标进行监控。同样在Prometheus监控中存在一个叫服务发现的机制,在k8s容器环境中由于集群内实例网络地址是动态的,我们不可能每次创建或修改实例都将实例IP写入Prometheus的target中,借助服务发现我们可以快速的将集群内的资源注册到Prometheus-server中。

    Prometheus 中的 scrape_config 是什么?


    Prometheus通过yml文件来存储配置文件,通过scrape_config(抓取配置)域来配置抓取目标和抓取服务发现方式。

    scrape_config指定了一组target和抓取参数。在一般情况下,一个scrape_config指定一个作业。

    如下指定了两个静态服务发现prometheus、kube-state-metrics,

    scrape_configs:
    - job_name: prometheus
      static_configs:
      - targets:
        - localhost:9090
    - job_name: kube-state-metrics
      static_configs:
      - targets:
        - prometheus-kube-state-metrics.monitoring.svc:8080
    

    Prometheus支持的服务发现非常多:

    • static_configs: 静态服务发现
    • dns_sd_configs: DNS 服务发现
    • file_sd_configs: 文件服务发现
    • kubernetes_sd_configs: Kubernetes 服务发现
    • gce_sd_configs: GCE 服务发现
    • ec2_sd_configs: EC2 服务发现
    • openstack_sd_configs: OpenStack 服务发现
    • azure_sd_configs: Azure 服务发现

    前面4个是比较常用的,这里我们主要介绍kubernetes_sd_configs,其他的比较简单可查看Prometheus官方文档 prometheus configuration

    什么是 Kubernetes_sd_configs?


    Prometheus中k8s服务发现的原理是通过 Kubernetes 的REST API 检索抓取目标,并始终与集群状态保持同步。所以我们需要配置Kubernetes_sd_configs来访问K8s API

    比如我们要抓取k8s ingress,需要为Prometheus指定用于RBAC认证证书和serviceaccount的token

    - job_name: 'kubernetes-ingress'
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        insecure_skip_verify: true
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      kubernetes_sd_configs:
      - role: ingress
    

    这里的role为k8s中资源实体如 endpoints、service,、pod,、node或 ingress

    当指定ingress时,Prometheus将每个入口地址发现为一个目标。

    重载配置文件后可以在Prometheus Service Discovery查看发现的target

    image-20220303195620411

    发现apiserver配置

    - job_name: kubernetes-apiservers
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 
        insecure_skip_verify: true
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token 
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - action: keep
        regex: default;kubernetes;https
        source_labels:
        - __meta_kubernetes_namespace
        - __meta_kubernetes_service_name
        - __meta_kubernetes_endpoint_port_name
    

    这里我们用到了relabel_configs即重新打标,动作为keep 啥意思呢? 首先我们通过k8s API获取到所有endpoints,将endpoints中的含元数据 namespace、service_name、endpoint_port_name的实例和regex匹配,如果匹配成功就保留。这用来过滤一下不需要的实例时很有用。

    通过kubectl 查看的kubernetes这个endpoints的信息

    # kubectl describe endpoints kubernetes
    Name:         kubernetes
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    Subsets:
      Addresses:          192.168.1.82,192.168.1.83,192.168.1.84
      NotReadyAddresses:  <none>
      Ports:
        Name   Port  Protocol
        ----   ----  --------
        https  6443  TCP
    

    发现出来的target如下

    image-20220303190902069

    这里有一个隐藏点,Prometheus会把元数据中的__address____metrics_path__作为endpoint,下面我们来看一个替换元数据的node实例

    发现node配置

    - job_name: kubernetes-nodes
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        insecure_skip_verify: true
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      kubernetes_sd_configs:
      - role: node
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - replacement: kubernetes.default.svc:443
        target_label: __address__
      - regex: (.+)
        replacement: /api/v1/nodes/$1/proxy/metrics
        source_labels:
        - __meta_kubernetes_node_name
        target_label: __metrics_path__
    

    这里的动作为labelmap,可用于标签替换。首先获取所有node,对元数据__address__中的value替换为replacement的值kubernetes.default.svc:443

    在replacement的值中可以通过$1,$2,$3...的方式引用source_labels的key-value,所以元数据__metrics_path__的值将会被/api/v1/nodes/{node_name}/proxy/metrics替换。

    发现出的node如下所示,此时target的address和metrics_path已被替换了。

    image-20220303195053113

    以上通过kubernetes-apiservers、kubernetes-nodes的实例简单介绍了Prometheus中如何实现k8s集群资源的服务发现以及相应的配置和操作。亦可参考Prometheus示例配置prometheus-kubernetes

    希望小作文对你有些许帮助,如果内容有误请指正。通过博客阅读:iqsing.github.io

  • 相关阅读:
    卷积神经网络 图像处理,卷积神经网络识别图片
    Docker 部署常用应用(持续更新中)
    webpack一些常用的Loader和Plugin
    7个技巧帮助你进行更有吸引力的脉动/脉搏调查
    前端ES6 面试过关宝典
    java技术:nacos
    Python基础入门知识
    20230527 K-均值聚类算法,由INSCODE AI创作助手进行生成
    LVS集群
    【21天学习挑战赛】经典算法拓展-----时间复杂度学习
  • 原文地址:https://www.cnblogs.com/qsing/p/15961734.html