Kubernetes 无法从POD中获取度量值
我能够使用此Prometheus作业配置从Kubernetes服务中获取Prometheus度量: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
- 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没有基于这些注释进行刮取?它不起作用,因为在中,我看不到任何更改