代码之家  ›  专栏  ›  技术社区  ›  kentor

不同端口上的重复刮擦目标

  •  1
  • kentor  · 技术社区  · 4 年前

    我使用的scratch配置与示例中建议的配置非常相似。出于某种原因,我有重复的刮擦目标。我想知道为什么会这样

    我的刮刮配置:

      - job_name: 'kubernetes-pods'
        kubernetes_sd_configs:
          - role: pod
        relabel_configs:
          - source_labels: [ __meta_kubernetes_pod_annotation_prometheus_io_scrape ]
            action: keep
            regex: true
          - source_labels: [ __meta_kubernetes_pod_annotation_prometheus_io_path ]
            action: replace
            target_label: __metrics_path__
            regex: (.+)
          - source_labels: [ __address__, __meta_kubernetes_pod_annotation_prometheus_io_port ]
            action: replace
            regex: (.+):(?:\d+);(\d+)
            replacement: ${1}:${2}
            target_label: __address__
          - action: labelmap
            regex: __meta_kubernetes_pod_label_(.+)
          - action: labeldrop
            regex: statefulset_kubernetes_io_pod_name # This is duplicate because we already have the pod_name
          - source_labels: [ __meta_kubernetes_namespace ]
            action: replace
            target_label: kubernetes_namespace
          - source_labels: [ __meta_kubernetes_pod_name ]
            action: replace
            target_label: kubernetes_pod_name
    

    因此,我在要抓取的Pod上设置了注释:

    metadata:
      annotations:
        checksum/config: "8755a7a06e8302a6861c536738da919828761d7c6a794b2c52c920b4ddae163e"
        cni.projectcalico.org/podIP: "172.22.130.165/32"
        kubernetes.io/psp: "prometheus"
        prometheus.io/path: "/metrics"
        prometheus.io/port: "9090"
        prometheus.io/scrape: "true"
    

    现在,由于某种原因,所有这些目标在抓取目标中出现两次(在不同的端口下),如Prometheus UI所示:

    Prometheus scrape targets

    为什么会这样?为什么它出现在端口80下?带有端口的目标 9090 显示了从注释中读取端口的relabel配置是有效的。

    附加信息:

    • prometheus pod是有状态集合的一部分
    • 它只定义了一个(未命名)端口9090
    • 它有一个不公开端口的init容器
    • 屏幕截图仅显示了从 kubernetes-pods 工作
    • 这只是promethius(v2.22.0),不由prometheus操作员管理
    0 回复  |  直到 4 年前
        1
  •  5
  •   weibeld    4 年前

    这个 pod Prometheus的服务发现角色为Pod的每个容器(包括init容器)创建一个目标。Pod中有一个init容器,因此这会产生两个目标。

    如果容器没有声明端口(如init容器),则会创建一个无端口目标。这意味着,你的正则表达式 replace 设定的规则 __address__ 不匹配,Prometheus默认使用端口80作为此目标。

    要删除init容器目标,请尝试添加以下规则:

    - source_labels: [ __meta_kubernetes_pod_container_init ]
      regex: true
      action: drop
    
    推荐文章