通过prometheus读取腾讯云TMP监控数据

现在很多业务会通过云上的TMP来监控云上的业务,比如将云上的tke、etcd等服务监控数据写到TMP,然后方便监测服务是否正常运行。

很多人之前用过开源的prometheus,会经常通过prometheus提供的ui页面来查下监控数据,但是TMP没有提供这类可视化页面,因为云上的TMP是有鉴权的,只能在grafana里面来查询监控数据。

其实TMP有提供Remote read 接口,我们可以自己部署一个prometheus来通过Remote read 接口读取TMP的监控数据,然后这样就可以在自建的prometheus ui页面直接查询到TMP的监控数据。具体可以参考云监控的文档说明https://cloud.tencent.com/document/product/1416/84294

下面我们说说如何在集群内部署配置prometheus服务来远程读取tmp的监控数据,每个tmp实例都是部署在一个eks集群,我们就将prometheus部署到对应的eks集群即可。

1. 获取tmp实例api访问账号密码

通过Remote read 接口读取数据,鉴权方式推荐使用Basic Auth,username 为账号 AppID ,password可以控制台查看tmp实例,里面的token就是密码。

2. Remote read配置

这里是在k8s集群部署,所以我们通过configmap来配置Remote read,然后挂载到容器内,具体的yaml如下

代码语言:javascript
复制
apiVersion: v1
data:
  prometheus.yml: |-
    remote_read:
    - url: "http://172.16.180.xxx:9090/api/v1/read"
      read_recent: true
      basic_auth:
        username: "AppID"
        password: "token"
      filter_external_labels: false
kind: ConfigMap
metadata:
  name: prom-cm
  namespace: kube-system

usernameh和password就是第一步获取的appid和token,更多配置项参考官网文档https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read,注意url的路径是/api/v1/read。

3. 创建prometheus工作负载

部署一个prometheus的deploy,然后挂载上一步创建的configmap,yaml如下

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: prom
    qcloud-app: prom
  name: prom
  namespace: kube-system
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: prom
      qcloud-app: prom
  template:
    metadata:
      labels:
        k8s-app: prom
        qcloud-app: prom
    spec:
      containers:
      - image: bitnami/prometheus:2.43.0
        imagePullPolicy: IfNotPresent
        name: prom
        resources:
          limits:
            cpu: 500m
            memory: 1Gi
          requests:
            cpu: 250m
            memory: 256Mi
        securityContext:
          privileged: false
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /opt/bitnami/prometheus/conf/prometheus.yml
          name: vol
          readOnly: true
          subPath: prometheus.yml
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - configMap:
          defaultMode: 420
          name: prom-cm
        name: vol

4. 创建service或者ingress访问prometheus

prometheus的pod运行正常后,创建一个service或者ingress来访问prometheus,具体看个人需求,我这里是通过公网clb类型service来访问prometheus,service的yaml如下

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: prom
    qcloud-app: prom
  name: prom
  namespace: kube-system
spec:
  externalTrafficPolicy: Cluster
  ports:
  - name: 9090-9090-tcp-2wb1xy9wja4
    nodePort: 32183
    port: 9090
    protocol: TCP
    targetPort: 9090
  selector:
    k8s-app: prom
    qcloud-app: prom
  sessionAffinity: None
  type: LoadBalancer

5. 测试通过prometheus ui访问tmp数据

浏览器输入公网clb的vip和9090端口,就可以访问promethues的前端ui页面

然后可以通过promsql来查询对应的指标,但是这里有个缺点,因为是从远程读的数据,页面输入指标没有智能提示,需要输入具体的指标名称才行。这里我们输入up是可以正常查询tmp的数据。