代码之家  ›  专栏  ›  技术社区  ›  Thomas Sundberg

无法从pods中获取度量

  •  0
  • Thomas Sundberg  · 技术社区  · 8 年前

    我可以使用此普罗米修斯作业配置从Kubernetes服务中获取普罗米修斯度量:

    - job_name: 'prometheus-potapi'
      static_configs:
      - targets: ['potapi-service.potapi:1234']
    

    它使用Kubernetes DNS,它给出了我的三个pod中任何一个的度量。

    我想看看每个豆荚的结果。

    我可以使用此配置查看所需的数据:

    - job_name: 'prometheus-potapi-pod'
      static_configs:
      - targets: ['10.1.0.126:1234']
    

    我使用普罗米修斯提供的服务发现机制进行了搜索和实验。不幸的是,我不明白该如何设置。这个 service discovery reference 如果你不知道它是如何工作的,那就没什么用了。

    我正在寻找一个使用IP号的作业被某种服务发现机制替换的示例。指定IP就足以让我看到我要查找的数据已公开。

    我想从所有的pod中获取相同名称空间中的度量, potapi .

    度量总是通过同一个端口公开, 1234 .

    最后,所有的名字都是这样命名的:

    potapi-deployment-754d96f855-lkh4x
    potapi-deployment-754d96f855-pslgg
    potapi-deployment-754d96f855-z2zj2 
    

    当我这样做的时候

    kubectl describe pod potapi-deployment-754d96f855-pslgg -n potapi
    

    我得到这样的描述:

    Name:           potapi-deployment-754d96f855-pslgg
    Namespace:      potapi
    Node:           docker-for-desktop/192.168.65.3
    Start Time:     Tue, 07 Aug 2018 14:18:55 +0200
    Labels:         app=potapi
      pod-template-hash=3108529411
    Annotations:    <none>
    Status:         Running
    IP:             10.1.0.127
    Controlled By:  ReplicaSet/potapi-deployment-754d96f855
    Containers:
      potapi:
        Container ID:   docker://72a0bafbda9b82ddfc580d79488a8e3c480d76a6d17c43d7f7d7ab18458c56ee
        Image:          potapi-service
        Image ID:       docker://sha256:d64e94c2dda43c40f641008c122e6664845d73cab109768efa0c3619cb0836bb
        Ports:          4567/TCP, 4568/TCP, 1234/TCP
        Host Ports:     0/TCP, 0/TCP, 0/TCP
        State:          Running
          Started:      Tue, 07 Aug 2018 14:18:57 +0200
        Ready:          True
        Restart Count:  0
        Environment:    <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from default-token-4fttn (ro)
    Conditions:
      Type           Status
      Initialized    True
      Ready          True
      PodScheduled   True
    Volumes:
      default-token-4fttn:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-4fttn
        Optional:    false
    QoS Class:       BestEffort
    Node-Selectors:  <none>
    Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
      node.kubernetes.io/unreachable:NoExecute for 300s
    Events:          <none>
    

    考虑到这些先决条件,您将如何重写作业定义?

    2 回复  |  直到 8 年前
        1
  •  2
  •   mdaniel    8 年前

    在这里他们使用 example.io/scrape=true (以及用于指定 scrape port 以及 scrape path 如果不是的话 /metrics ),这就是实现“自动发现”部分的方法。

    如果将该注释(以及Prom配置中的相关配置片段)应用于 Service ,然后Prom将在 服务 ,这意味着您将拥有 服务 它本身,而不是它后面的各个端点。同样,如果您将 Pod s、 您将为 豆荚 但是他们需要被卷起才能有十字架- 豆荚 对事态的看法。可以自动发现多种不同的资源类型,包括 node 和 ingress ,也是。他们的行为都很相似。

    除非您对Prom实例有严重的CPU或存储问题,否则我绝对不会在配置中那样枚举scrape目标:我将使用scrape注释,这意味着您可以更改被scrape的对象、哪个端口等,而不必每次都重新配置Prom。

    请注意,如果您想原样使用它们的示例,并且希望从kubernetes资源YAML中应用这些注释,请确保引用 : 'true' 值,否则YAML将把它提升为布尔文本,而kubernetes注释只能是字符串值。

    从命令行应用注释将工作正常:

    kubectl annotate pod -l app=potapi example.io/scrape=true
    

    (顺便说一下,他们使用 example.io/ 在他们的例子中,除了它的名称空间 scrape 部分防止它与其他命名的东西碰撞 刮 . 因此,如果您希望避免使用名称奇怪的名称,可以随意使用组织的名称空间 示例.io/ 在你的群中)

        2
  •  1
  •   Thomas Sundberg    8 年前

    我最终得到了这个解决方案:

    ...
    
    - 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: [__address__]
        action: replace
        regex: ([^:]+)(?::\d+)?
        replacement: $1:1234
        target_label: __address__
    
    ...
    

    有两部分。

    • 检查批注 prometheus.io/scrape 有价值的 'true' . 这是第一次 source_labels . 这也许不是不言而喻的 prometheus_io_scrape 翻译成 普罗米修斯.io/scrape

    • 获取地址并将所需端口添加到其中。在第二天完成 源标签 . 这个 __address__ 将查询源以获取主机名或ip号。在本例中,ip号是使用隐式正则表达式找到的 ([^:]+)(?::\d+)? . 我想用的端口是1234,所以我硬编码了 replacement: 结果是 __地址__ 现在将包含pod的ip和端口 1234 附在格式上 10.1.0.172:1234 哪里 10.1.0.172 是找到的ip号。

    在普罗米修斯的这个配置下,我应该能够找到带有正确注释的豆荚。

    那么应该在哪里添加注释呢?最后我把它添加到了Kubernetes部署模板描述中。

    完整的部署描述如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: potapi-deployment
      namespace: potapi
      labels:
        app: potapi
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: potapi
      template:
        metadata:
          annotations:
            prometheus.io/scrape: 'true'
          labels:
            app: potapi
        spec:
          containers:
          - name: potapi
            image: potapi-service
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 4567
              name: service
            - containerPort: 1234
              name: metrics
    

    有趣的注释添加在 template 部分

    推荐文章