Kubernetes 无法从POD中获取度量值

Kubernetes 无法从POD中获取度量值,kubernetes,prometheus,Kubernetes,Prometheus,我能够使用此Prometheus作业配置从Kubernetes服务中获取Prometheus度量: - job_name: 'prometheus-potapi' static_configs: - targets: ['potapi-service.potapi:1234'] - job_name: 'prometheus-potapi-pod' static_configs: - targets: ['10.1.0.126:1234'] 它使用Kubernetes DNS

我能够使用此Prometheus作业配置从Kubernetes服务中获取Prometheus度量:

- job_name: 'prometheus-potapi'
  static_configs:
  - targets: ['potapi-service.potapi:1234']
- job_name: 'prometheus-potapi-pod'
  static_configs:
  - targets: ['10.1.0.126:1234']
它使用Kubernetes DNS,并从我的三个吊舱中的任何一个为我的服务提供度量

我想看看每个吊舱的结果

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

- job_name: 'prometheus-potapi'
  static_configs:
  - targets: ['potapi-service.potapi:1234']
- job_name: 'prometheus-potapi-pod'
  static_configs:
  - targets: ['10.1.0.126:1234']
我已经使用普罗米修斯提供的服务发现机制进行了搜索和实验。不幸的是,我不明白应该如何设置它。如果你不知道它是如何工作的,那么它就没有真正的帮助

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

我想从所有的pod中提取度量值,它们都位于同一名称空间,
potapi

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

最后,它们的名称如下:

potapi-deployment-754d96f855-lkh4x
potapi-deployment-754d96f855-pslgg
potapi-deployment-754d96f855-z2zj2 
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
当我这样做的时候

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>
名称:potapi-deployment-754d96f855-pslgg
名称空间:potapi
节点:docker for desktop/192.168.65.3
开始时间:2018年8月7日星期二14:18:55+0200
标签:app=potapi
pod模板哈希=3108529411
注释:
状态:正在运行
IP:10.1.0.127
控制人:ReplicaSet/potapi-deployment-754d96f855
容器:
波塔皮:
容器ID:docker://72a0bafbda9b82ddfc580d79488a8e3c480d76a6d17c43d7f7d7ab18458c56ee
图片:potapi服务
图像ID:docker://sha256:d64e94c2dda43c40f641008c122e6664845d73cab109768efa0c3619cb0836bb
端口:4567/TCP、4568/TCP、1234/TCP
主机端口:0/TCP、0/TCP、0/TCP
状态:正在运行
开始时间:2018年8月7日星期二14:18:57+0200
准备好了吗
重新启动计数:0
环境:
挂载:
/来自default-token-4fttn(ro)的var/run/secrets/kubernetes.io/serviceCount
条件:
类型状态
初始化为True
准备好了吗
播客预定为真
卷数:
default-token-4fttn:
类型:Secret(由Secret填充的卷)
SecretName:default-token-4fttn
可选:false
QoS等级:最佳努力
节点选择器:
容差:node.kubernetes.io/未就绪:不执行300秒
node.kubernetes.io/不可访问:不执行300秒
活动:
考虑到这些先决条件,您将如何重写作业定义?

在这里,他们使用(以及用于指定和的类似注释,如果不是
/metrics
),这就是实现“自动发现”部分的方式

如果将该注释(以及Prom配置中的相关配置片段)应用于
服务
,则Prom将刮除
服务
上的端口和路径,这意味着您将拥有
服务
本身的统计信息,而不是其后面的各个端点。类似地,如果您为
Pod
s贴上标签,您将为
Pod
s收集指标,但需要将它们汇总起来,以获得事务状态的跨
Pod
视图。可以自动发现多种不同的资源类型,包括和。他们的行为都很相似

除非您对Prom实例有严重的CPU或存储问题,否则我绝对不会像这样在配置中枚举刮取目标:我会使用刮取注释,这意味着您可以更改刮取的对象、端口等,而无需每次重新配置Prom

请注意,如果希望按原样使用示例,并且希望从kubernetes资源YAML中应用这些注释,请确保引用
:“true”
值,否则YAML会将其提升为布尔文字,而kubernetes注释只能是字符串值

从命令行应用注释可以很好地工作:

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

(顺便说一句,他们在示例中使用了
example.io/
,但该字符串没有什么特别之处,只是将
scrape
部分命名为名称空间,以防止它与另一个名为
scrape
的部分发生冲突。因此,如果您希望避免将某个奇怪的名称命名为
example.io/在您的群集中)

我最终得到了以下解决方案:

...

- 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__

...
有两部分

  • 检查值为
    'true'
    的注释
    prometheus.io/scrape
    。它在第一个
    源标签中完成。
    
    prometheus\u io\u scrap
    翻译成
    prometheus.io/scrap

  • 获取地址并向其添加所需的端口。这是在第二个
    源标签上完成的。
    \uuu地址\uuuu
    源将被查询主机名或ip号。在这种情况下,ip号是使用神秘的正则表达式
    ([^::]+)(?::\d+)找到的?
    。我要使用的端口是“1234”,因此我在
    替换:
    中对其进行了硬编码。结果是
    \uuuu地址\uuuuu
    现在将包含pod的ip,端口
    1234
    10.1.0.172:1234
    格式附加,其中
    10.1.0.172
    是找到的ip号

有了普罗米修斯的这种配置,我应该能够找到带有适当注释的豆荚

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

完整的部署描述如下所示:

potapi-deployment-754d96f855-lkh4x
potapi-deployment-754d96f855-pslgg
potapi-deployment-754d96f855-z2zj2 
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

有趣的注释添加在
模板
部分

谢谢你的指点。他们给我指明了一个好的方向。不幸的是,注释命令对我不起作用。不知道或不理解为什么。什么是“不起作用”是什么意思?这些注释不适用于POD,或者Prom没有基于这些注释进行刮取?它不起作用,因为在中,我看不到任何更改