[英]Unable to scrape metrics from pods
我能够使用此Prometheus作业配置从Kubernetes服务中获取Prometheus指标:
- job_name: 'prometheus-potapi'
static_configs:
- targets: ['potapi-service.potapi:1234']
它使用Kubernetes DNS,它为我提供了我用于服务的三个pod中的任何一个的指标。
我想看看每个pod的结果。
我能够使用此配置查看我想要的数据:
- job_name: 'prometheus-potapi-pod'
static_configs:
- targets: ['10.1.0.126:1234']
我使用Prometheus中提供的服务发现机制进行了搜索和实验。 不幸的是,我不明白应该如何设置。 如果您不知道它是如何工作的,那么服务发现参考实际上并没有用。
我正在寻找一个例子,其中使用IP号的作业被一些服务发现机制取代。 指定IP足以让我看到我正在寻找的数据是暴露的。
我希望从同一名称空间中的所有内容中获取指标,即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>
在给定这些先决条件的情况下,您将如何重写作业定义?
在这里,他们使用example.io/scrape=true
(以及类似的注释来指定scrape端口和刮擦路径,如果它不是/metrics
),这就是人们实现“自动发现”部分的方式。
如果您应用注解-在舞会配置相关的配置片段-一个Service
,然后将舞会上刮的港口和道路Service
,这意味着你将不得不对统计Service
本身,而不是背后的各个端点它。 类似地,如果您标记Pod
,您将收集Pod
的指标,但是需要将它们汇总以获得事务状态的交叉Pod
视图。 有多种不同的资源类型可以自动发现,包括节点和入口 。 他们都表现得相似。
除非你的Prom实例有严重的CPU或存储问题,否则我绝对不会在配置中枚举scrape目标:我会使用scrape注释,这意味着你可以改变谁被刮,什么端口等没有每次重新配置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__
...
有两个部分。
检查注释prometheus.io/scrape
,其值为'true'
。 它在第一个source_labels
。 prometheus_io_scrape
转化为prometheus.io/scrape
可能并不明显
获取地址并添加所需的端口。 它在第二个source_labels
。 将查询__address__
源以获取主机名或IP号。 在这种情况下,使用神秘的正则表达式([^:]+)(?::\\d+)?
找到一个ip号([^:]+)(?::\\d+)?
。 我想要使用的端口是'1234',所以我将其硬编码为replacement:
结果是__address__
现在将包含pod的ip,端口1234
以10.1.0.172:1234
格式附加,其中10.1.0.172
是找到了ip号码。
在Prometheus中使用此配置,我应该能够找到具有适当注释的pod。
那么注释应该添加到哪里呢? 我最终在我的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
部分中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.