使用Grafana Agent收集Pod的cpu和内存指标,以及标准输出日志的完整案例

原创 吴就业 153 0 2024-03-26

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/99264ca9c80640a6b3cc9c421567eeba

作者:吴就业
链接:https://wujiuye.com/article/99264ca9c80640a6b3cc9c421567eeba
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

此为文章配套视频,如阅读本篇文章有不理解的地方,可观看此讲解视频!

前面两篇:如何获取Pod标准输出(stdout)日志,使用Grafana Agent收集,最后上传到Grafana Loki如何获取Pod的CPU和内存指标,使用Grafana Agent收集指标,上传到Prometheus,其实是我按知识点拆分为两篇文章写的。

但通常这两者是一起的,可观测即离不开指标,也离不开日记。当两者都需要的时候,就没必要部署两个DaemonSet了。本篇将两者结合成一个完整的案例,大家可以直接拿去部署使用。

首先是DaemonSet:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: grafana-agent
spec:
  selector:
    matchLabels:
      app: grafana-agent
  template:
    metadata:
      labels:
        app: grafana-agent
    spec:
      serviceAccountName: grafana-agent
      containers:
      - name: grafana-agent
        image: grafana/agent:latest
        command:
          - grafana-agent
          - -config.file=/etc/agent/agent.yaml
          - -metrics.wal-directory=/tmp/metrics
          - -config.expand-env # 使环境变量能够替换配置文件中的占位符'${xxx}'
        env:
        - name: HOSTNAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: METRICS_PORT
          value: '10255'
        - name: NODE_INTRANET_IP
          valueFrom:
            fieldRef:
              fieldPath: status.hostIP
        volumeMounts:
          - name: config-volume
            mountPath: /etc/agent
          - name: pod-logs-volume
            mountPath: /var/log/pods
          - name: store-otherdata-volume
            mountPath: /tmp
      volumes:
      - name: config-volume
        configMap:
          name: grafana-agent-config
      - name: pod-logs-volume
        hostPath:
          path: /var/log/pods
      - name: store-otherdata-volume
        hostPath:
          path: /tmp

其次是rbac授权:

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: grafana-agent
  namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: grafana-agent
rules:
- apiGroups:
  - ""
  resources:
  - nodes
  - nodes/proxy
  - nodes/metrics
  - services
  - endpoints
  - pods
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: grafana-agent
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: grafana-agent
subjects:
- kind: ServiceAccount
  name: grafana-agent
  namespace: default

最后是配置文件:

apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana-agent-config
data:
  agent.yaml: |
    server:
      log_level: debug
    metrics:
      global:
        scrape_interval: 1m
      configs:
        - name: agent
          scrape_configs:
          - job_name: kubelet-metrics-resource
            metrics_path: /metrics/resource
            static_configs:
              - targets: 
                - "${NODE_INTRANET_IP}:${METRICS_PORT}"
          remote_write:
            - url: https://<你的prometheus的域名>/api/prom/push
              basic_auth:
                username: <用户名>
                password: <密码>
    logs:
      configs:
      - name: default
        clients:
        - url: https://<用户名>:<密码>@<你的Loki的域名>/loki/api/v1/push
        positions: 
          filename: /tmp/logs/positions.yaml
        scrape_configs:
        - job_name: kubernetes-pods
          pipeline_stages:
          - cri: {}
          kubernetes_sd_configs:
          - role: pod
          relabel_configs:
          - source_labels:
            - __meta_kubernetes_pod_node_name
            target_label: __host__
          - action: replace
            source_labels:
            - __meta_kubernetes_namespace
            target_label: namespace
          - action: replace
            source_labels:
            - __meta_kubernetes_pod_name
            target_label: pod
          - action: replace
            source_labels:
            - __meta_kubernetes_pod_container_name
            target_label: container
          - action: replace
            source_labels:
            - __meta_kubernetes_pod_host_ip
            target_label: host_ip
          - action: replace
            target_label: __path__
            source_labels:
            - __meta_kubernetes_pod_uid
            - __meta_kubernetes_pod_container_name
            separator: /
            replacement: "/var/log/pods/*$1/*.log"

关于每个配置项的解释,看前面两篇文章就好了。

#云原生

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

Autopilot: workload autoscaling at Google论文描述的requests预测算法

本篇简单描述(Autopilot: workload autoscaling at Google)论文中描述的资源request预测算法,不需要理解论文中那复杂的数学公式。

K8s Pod可观测cpu使用率转cpu使用量

前面《如何获取Pod的CPU和内存指标,使用Grafana Agent收集指标,上传到Prometheus》这篇介绍的指标获取只拿到了cpu使用率,怎么转成cpu使用量呢?

云原生专栏第一阶段完结,第二阶段开始

由于方向的错误,我们第一阶段开发的云原生PaaS平台这个项目也迎来了终结。但我们换了个方向继续做云原生PaaS平台。

如何获取Pod的CPU和内存指标,使用Grafana Agent收集指标,上传到Prometheus

本篇是作者在云原生PaaS平台项目中实战可观测能力做的技术调研,将关键技术知识点讲透,涉及:如何获取Pod的cpu和内存指标、使用Grafana Agent收集指标、上传到Prometheus。

如何获取Pod标准输出(stdout)日志,使用Grafana Agent收集,最后上传到Grafana Loki

本篇是作者在云原生PaaS平台项目中实战可观测能力做的技术调研,将关键技术知识点讲透,涉及:如何获取Pod的标准输出(stdout)日志、如何使用Grafana Agent收集日志(附配置案例讲解)、如何将日志上传Grafana Loki。

Kubernetes可观测之Metrics API,什么是Metrics API?

不禁感叹,k8s这个底座设计的太牛了,我们不仅可以通过CRD + 控制器做扩展,还可以自定义APIService去做扩展。k8s,牛啊!