K8S监控-Prometheus信息收集

节点信息收集(node_exporter)

为了能够采集集群中各个节点的资源使用情况,我们需要在各节点中部署一个Node Exporter实例。

这里就需要一种新的工作负载类型—守护进程集(DaemonSet);DaemonSet 可以保证集群中所有的或者部分的节点都能够运行同一份 Pod 副本,每当有新的节点被加入到集群时,Pod 就会在目标的节点上启动,如果节点被从集群中剔除,节点上的 Pod 也会被垃圾收集器清除;DaemonSet 的作用就像是计算机中的守护进程,它能够运行集群存储、日志收集和监控等『守护进程』,这些服务一般是集群中必备的基础服务。

创建DaemonSet服务:

vim prometheus-node-exporter.yml
kind: DaemonSet
apiVersion: apps/v1
metadata:
  name: prometheus-node-exporter
  namespace: monitoring
  labels:
    app: prometheus
    component: node-exporter
spec:
  selector:
    matchLabels:
      app: prometheus
      component: node-exporter
  template:
    metadata:
      labels:
        app: prometheus
        component: node-exporter
        release: v1.1.2
      annotations:
        prometheus.io/port: '9100'
        prometheus.io/scrape: 'true'
    spec:
      volumes:
        - name: localtime
          hostPath:
            path: /etc/localtime
            type: ''
        - name: proc
          hostPath:
            path: /proc
            type: ''
        - name: sys
          hostPath:
            path: /sys
            type: ''
        - name: dockersock
          hostPath:
            path: /var/run/docker.sock
            type: ''
      containers:
        - name: prometheus-node-exporter
          image: 'prom/node-exporter:v1.1.2'
          args:
            - '--path.procfs=/host/proc'
            - '--path.sysfs=/host/sys'
          ports:
            - name: metrics
              hostPort: 9100
              containerPort: 9100
              protocol: TCP
          resources:
            limits:
              cpu: 200m
              memory: 200Mi
            requests:
              cpu: 100m
              memory: 128Mi
          volumeMounts:
            - name: proc
              readOnly: true
              mountPath: /host/proc
            - name: sys
              readOnly: true
              mountPath: /host/sys
            - name: localtime
              readOnly: true
              mountPath: /etc/localtime
            - name: dockersock
              readOnly: true
              mountPath: /var/run/docker.sock
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
      serviceAccountName: prometheus
      serviceAccount: prometheus
      hostNetwork: true
      hostPID: true
      tolerations:
        - operator: Exists
  revisionHistoryLimit: 10
kubectl create -f prometheus-node-exporter.yml
kubectl -n monitoring get daemonsets.apps

由于Node Exporter需要能够访问宿主机,因此这里指定了hostNetwork和hostPID,让Pod实例能够以主机网络以及系统进程的形式运行。

由于Node Exporter以主机网络运行,因为可以通过节点的IP加上Pod端口来访问节点上运行的node_exporter。

通过Pod采集 (pods演示)

通过Daemonset的形式将Node Exporter部署到了集群中的各个节点中。接下来,可以通过Prometheus的pod服务发现模式,找到当前集群中部署的Node Exporter实例即可。 需要注意的是,由于K8S中并非所有的Pod都提供了对Prometheus的支持,有些可能只是一些简单的用户应用,为了区分哪些Pod实例是可以供Prometheus进行采集的,上面我们为Node Exporter添加了注解:

annotations:
  prometheus.io/port: '9100'
  prometheus.io/scrape: 'true'
  prometheus.io/path: 'metrics'

通过注解来scrape区分Pod是否可以供Prometheus采集;通过port来指定提供采集的端口;通过path来指定采集路径(如果使用的是默认的 /metrics,可以不用明确指定)。

修改Prometheus配置文件,优化采集任务:

vim prometheus-config.yml
...
      - 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__
          - __meta_kubernetes_pod_annotation_prometheus_io_port
          action: replace
          regex: ([^:]+)(?::\d+)?;(\d+)
          replacement: $1:$2
          target_label: __address__
        - source_labels:
          - __meta_kubernetes_pod_annotation_prometheus_io_path
          action: replace
          regex: (.+)
          target_label: __metrics_path__
        - source_labels:
          - __meta_kubernetes_namespace
          action: replace
          target_label: kubernetes_namespace
        - source_labels:
          - __meta_kubernetes_pod_name
          action: replace
          target_label: kubernetes_pod
        tls_config:
          insecure_skip_verify: true
kubectl replace -f prometheus-config.yml
kubectl -n monitoring delete pod prometheus-0

通过Pod模式自动发现的Node Exporter实例:

以上通过relabel过程实现对Pod实例的过滤,以及采集任务地址替换,从而实现对特定Pod实例监控指标的采集。需要说明的是kubernetes-pods并不是只针对Node Exporter而言,对于用户任意部署的Pod实例,只要其提供了对Prometheus的支持,用户都可以通过为Pod添加注解的形式为其添加监控指标采集的支持。

Node采集任务

上面是通过自动发现node_exporter的Pod来自动创建的采集,而实际情况中我们希望Pod采集的信息能跟Node节点信息分开。修改配置文件,定义node采集任务:

vim prometheus-config.yml
...
      - job_name: 'kubernetes-nodes'
        kubernetes_sd_configs:
        - role: node
        relabel_configs:
        - source_labels:
          - __meta_kubernetes_node_name
          regex: (.+)
          replacement: $1:9100
          target_label: __address__
        - source_labels: [instance]
          target_label: node
        
      - 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:
          - __meta_kubernetes_pod_name
          action: drop
          regex: prometheus-node-exporter-(.+)
        - source_labels:
          - __address__
          - __meta_kubernetes_pod_annotation_prometheus_io_port
          action: replace
          regex: ([^:]+)(?::\d+)?;(\d+)
          replacement: $1:$2
          target_label: __address__
        - source_labels:
          - __meta_kubernetes_pod_annotation_prometheus_io_path
          action: replace
          regex: (.+)
          target_label: __metrics_path__
        - source_labels:
          - __meta_kubernetes_namespace
          action: replace
          target_label: kubernetes_namespace
        - source_labels:
          - __meta_kubernetes_pod_name
          action: replace
          target_label: kubernetes_pod
        tls_config:
          insecure_skip_verify: true
kubectl replace -f prometheus-config.yml
curl -X POST http://172.16.220.143:30090/-/reload

这里将原先的kubernetes-nodes采集任务进行了配置,通过relabel修改节点的连接地址为node_exporter所监听的地址。同时在kubernetes-pods任务中,将prometheus-node-exporter开头的Pod从采集中去除。

查看配置应用后的结果:

kubernetes-nodes获取正常,而群集中没有其它提供采集的Pod,故不再有kubernetes-pods信息。

发表评论

error: Content is protected !!