K8s 集群内的 Prometheus 抓取监测数据是通过 servicemonitor 这个 crd 来完成的. 每个 servicemonitor 对应 Prometheus 中的一个 target. 每个 servicemonitor 对应一个或多个 service, 负责获取这些 service 上指定端口暴露的监测数据, 并向 Prometheus 上报.
service 是 k8s 集群内的资源. 如果想让 service 对应集群外的应用, 则必须手动创建 endpoint.
下面以运行在集群外的某个机器上的 gpu-exporter 为例.
一, 手动创建 endpoint
gpu-exporter 占用宿主机的 9445 端口, 因此创建 endpoint 如下:
- apiVersion: v1
- kind: Endpoints
- metadata:
- name: gpu-data
- subsets:
- - addresses:
- ip: [宿主机 ip]
- ports:
- - port: 9445
- name: gpu
注意, 为了后面创建 servicemonitor 时使用, 这里给 port 起一个名字.
二, 创建 service 与 endpoint 绑定
创建与 endpoint 名字相同的 service, 则二者会自动绑定.
- apiVersion: v1
- kind: Service
- metadata:
- name: gpu-data
- labels:
- App: gpu-data
- spec:
- ports:
- - port: 9445
- targetPort: 9445
- name: gpu
注意, service 的 name 字段必须与 endpoint 相同, 并且下面 port 的 name 也需要相同. 另外, 需要为这个 service 配置一个 label, 以便后面 servicemonitor 进行筛选.
创建后, 执行 kubectl describe, 看看 service 的 endpoint 字段是否已经显示为 [宿主机 ip]:9445. 执行 curl [service 的 ip]:9445, 看看有没有监测数据的返回值.
三, 创建 servicemonitor
创建与 service 同名的 servicemonitor:
- apiVersion: monitoring.coreos.com/v1
- kind: ServiceMonitor
- metadata:
- labels:
- App: prometheus
- prometheus: prometheus
- name: gpu-data
- spec:
- endpoints:
- - interval: 10s
- path: /
- targetPort: 9445
- port: gpu
- jobLabel: k8s-App
- namespaceSelector:
- matchNames:
- - default
- selector:
- matchLabels:
- App: gpu-data
servicemonitor 的 label 需要查看 Prometheus 中对应的 servicemonitor 字段:
kubectl get prometheus -n kube-system prometheus-operator-prometheus -o YAML
查看 serviceMonitorSelector.matchExpressions 字段中对应的 key,value 对, 选出一对填写在 metadata.labels 中即可.
下面的 spec.endpoint 中, port 填写前面 service 和 endpoint 中定义的 port 名字, path 这里是 /, 因为 gpu-exporter 直接暴露在 ip:9445 / 下. 很多情况下会填写 / metrics.
后面 selector 需要填写之前 service 定义的 label.
创建后, 查看 Prometheus 的页面, 查找 target, 看看是否出现了 default/gpu-data 这一个 target.
四, 判断数据是否已经为 Prometheus 接受
可以直接通过 http API 判断:
curl [prometheus 的 pod 或 serviceip]:9090/API/v1/query?query=nvidia_gpu_memory_used_bytes
看看有无监测数据输出.
来源: http://www.bubuko.com/infodetail-3496868.html