K8S集群监控 Prometheus Agent + Cadvisor + Kube-state-metrics + 夜莺(Victoria)

一、资源环境

K8S集群:v1.23.6
Prometheus: v2.34.0
Kube-state-metrics: v2.12.0
夜莺:v6.0.0
Grafana: v10.4.1 

二、创建存放监控文件的文件夹

mkdir -p /opt/yaml/monitor
mkdir -p /opt/yaml/monitor/ksm

三、创建监控专用的命名空间

kubectl create namespace monitor

四、创建api认证授权信息rbac

vim apiserver-auth.yaml
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: categraf
rules:
  - apiGroups: [""]
    resources:
      - nodes
      - nodes/metrics
      - nodes/stats
      - nodes/proxy
      - services
      - endpoints
      - pods
    verbs: ["get", "list", "watch"]
  - apiGroups:
      - extensions
      - networking.k8s.io
    resources:
      - ingresses
    verbs: ["get", "list", "watch"]
  - nonResourceURLs: ["/metrics", "/metrics/cadvisor"]
    verbs: ["get"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: categraf
  namespace: monitor
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: categraf
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: categraf
subjects:
  - kind: ServiceAccount
    name: categraf
    namespace: monitor
kubectl apply -f apiserver-auth.yaml

五、创建prometheus-agent的ConfigMap采集指标

注意:regex: default;kubernetes;https,分别对应资源svc的命名空间;svc名称;端口名称

- url: 'http://192.168.90.155:17000/prometheus/v1/write'  # 为夜莺底层prometheus写入地址,就是夜莺数据库

vim prometheus-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-agent-conf
  labels:
    name: prometheus-agent-conf
  namespace: monitor
data:
  prometheus.yml: |-
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    scrape_configs:
      - job_name: 'apiserver'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: default;kubernetes;https
                       
    remote_write:
    - url: 'http://192.168.90.155:17000/prometheus/v1/write'
kubectl apply -f prometheus-cm.yaml

 六、创建Prometehus Agent容器

其中 --enable-feature=agent表示启动的是 agent 模式。

vim prometheus-agent-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-agent
  namespace: monitor
  labels:
    app: prometheus-agent
spec:
  replicas: 2
  selector:
    matchLabels:
      app: prometheus-agent
  template:
    metadata:
      labels:
        app: prometheus-agent
    spec:
      serviceAccountName: categraf
      containers:
        - name: prometheus
          image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/prom/prometheus:v2.34.0
          args:
            - "--config.file=/etc/prometheus/prometheus.yml"
            - "--web.enable-lifecycle"
            - "--enable-feature=agent"
          ports:
            - containerPort: 9090
          resources:
            requests:
              cpu: 1
              memory: 1Gi
            limits:
              cpu: 1
              memory: 1Gi
          volumeMounts:
            - name: prometheus-config-volume
              mountPath: /etc/prometheus/
            - name: prometheus-storage-volume
              mountPath: /prometheus/
      volumes:
        - name: prometheus-config-volume
          configMap:
            defaultMode: 420
            name: prometheus-agent-conf
        - name: prometheus-storage-volume
          emptyDir: {}
kubectl apply -f prometheus-agent-deploy.yaml

七、夜莺PromeSQL指标测试

apiserver_request_total

 八、K8s-ControllerManager组件监控

(1)权限绑定和一些基础配置

   上面已经创建过了,无需重复创建(忽略)

(2)增加prometheus-agent的ConfigMap指标采集内容

         注意:regex: default;kubernetes;https,分别对应资源svc的命名空间;svc名称;端口名称

vim prometheus-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-agent-conf
  labels:
    name: prometheus-agent-conf
  namespace: monitor
data:
  prometheus.yml: |-
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    scrape_configs:
      - job_name: 'apiserver'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: default;kubernetes;https
       
      - job_name: 'controller-manager'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-controller-manager-svc;https-metrics
               
    remote_write:
    - url: 'http://192.168.90.155:17000/prometheus/v1/write'
kubectl apply -f prometheus-cm.yaml

(3)创建kube-controller-manager的svc(如果有,请忽略这一步)

         先查看一下自己有没有对应的kube-controller-manager的endpoint/svc ,有的话就无需创建忽略,如果没有创建一个svc即可

vim kube-controller-manager-svc.yaml
apiVersion: v1
kind: Service
metadata:
  annotations:
  labels:
    k8s-app: kube-controller-manager
  name: kube-controller-manager-svc
  namespace: kube-system
spec:
  clusterIP: None
  ports:
    - name: https-metrics
      port: 10257
      protocol: TCP
      targetPort: 10257
  selector:
    component: kube-controller-manager
  sessionAffinity: None
  type: ClusterIP
kubectl apply -f kube-controller-manager-svc.yaml

(4)更改kube-controller-manager的bind-address

         为了监控集群中的组件,需要直接访问 kube-controller-manager的metrics指标
         找到bind-address 把127.0.0.1 改为 0.0.0.0,可以接受来自远程连接
         无需手动重启,kubelet 会自动检测到配置文件的更改并重启 kube-controller-manager

vim /etc/kubernetes/manifests/kube-controller-manager.yaml
----
----
- --bind-address=0.0.0.0 
----
----

(5)更新prometheus agent的pod,实时采集新数据

kubectl delete pod prometheus-agent-xxxxx-xxxxx -n monitor

(6)夜莺PromeSQL指标测试

  running_managed_controllers

 九、K8s-Scheduler组件监控

(1)权限绑定和一些基础配置

   上面已经创建过了,无需重复创建(忽略)

(2)增加prometheus-agent的ConfigMap指标采集内容

         注意:regex: kube-system;kube-scheduler-svc;https-metrics,分别对应资源svc的命名空间;svc名称;端口名称

vim prometheus-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-agent-conf
  labels:
    name: prometheus-agent-conf
  namespace: monitor
data:
  prometheus.yml: |-
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    scrape_configs:
      - job_name: 'apiserver'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: default;kubernetes;https
       
      - job_name: 'controller-manager'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-controller-manager-svc;https-metrics
      
      - job_name: 'scheduler'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-scheduler-svc;https-metrics
           
    remote_write:
    - url: 'http://192.168.90.155:17000/prometheus/v1/write'
kubectl apply -f prometheus-cm.yaml

(3)创建Scheduler的svc(如果有,请忽略这一步)

         先查看一下自己有没有对应的Scheduler的endpoint/svc ,有的话就无需创建忽略,如果没有创建一个svc即可

vim kube-scheduler-svc.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: kube-scheduler
  name: kube-scheduler-svc
  namespace: kube-system
spec:
  clusterIP: None
  ports:
    - name: https
      port: 10259
      protocol: TCP
      targetPort: 10259
  selector:
    component: kube-scheduler
  sessionAffinity: None
  type: ClusterIP
kubectl apply -f kube-scheduler-svc.yaml

(4)更改kube-scheduler的bind-address

         为了监控集群中的组件,需要直接访问 kube-scheduler的metrics指标
         找到bind-address 把127.0.0.1 改为 0.0.0.0,可以接受来自远程连接
         无需手动重启,kubelet 会自动检测到配置文件的更改并重启 kube-scheduler

vim /etc/kubernetes/manifests/kube-scheduler.yaml
----
----
- --bind-address=0.0.0.0 
----
----

(5)更新prometheus agent的pod,实时采集新数据

kubectl delete pod prometheus-agent-xxxxxx-xxxxx -n monitor

(6)夜莺PromeSQL指标测试

scheduler_scheduler_cache_size

 十、K8s-Etcd组件监控

(1)权限绑定和一些基础配置

   上面已经创建过了,无需重复创建(忽略)

(2)增加prometheus-agent的ConfigMap指标采集内容

         注意:regex: kube-system;etcd-svc;http,分别对应资源svc的命名空间;svc名称;端口名称

vim prometheus-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-agent-conf
  labels:
    name: prometheus-agent-conf
  namespace: monitor
data:
  prometheus.yml: |-
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    scrape_configs:
      - job_name: 'apiserver'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: default;kubernetes;https
       
      - job_name: 'controller-manager'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-controller-manager-svc;https-metrics
      
      - job_name: 'scheduler'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-scheduler-svc;https-metrics
      
      - job_name: 'etcd'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: http
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;etcd-svc;http
                        
    remote_write:
    - url: 'http://192.168.90.155:17000/prometheus/v1/write'
kubectl apply -f prometheus-cm.yaml

(3)创建etcd的svc(如果有,请忽略这一步)

         先查看一下自己有没有对应的etcd的endpoint/svc ,有的话就无需创建忽略,如果没有创建一个svc即可

vim etcd-svc.yaml
apiVersion: v1
kind: Service
metadata:
  namespace: kube-system
  name: etcd-svc
  labels:
    k8s-app: etcd
spec:
  selector:
    component: etcd
  type: ClusterIP
  clusterIP: None
  ports:
    - name: http
      port: 2381
      targetPort: 2381
      protocol: TCP
kubectl apply -f etcd-svc.yaml

(4)更改etcd的listen-metrics-urls

        为了监控集群中的组件,需要直接访问etcd的metrics指标
        找到lisetn这行,把地址改为0.0.0.0,可以接受来自远程连接
       无需手动重启,kubelet 会自动检测到配置文件的更改并重启 etcd

vim /etc/kubernetes/manifests/etcd.yaml    
-----
-----
-----
- --listen-metrics-urls=http://0.0.0.0:2381 
-----
-----
-----

(5)更新prometheus agent的pod,实时采集新数据

kubectl delete pod prometheus-agent-xxxxxx-xxxxx -n monitor

(6)夜莺PromeSQL指标测试

etcd_cluster_version

  十一、K8s-kubelet组件监控

(1)权限绑定和一些基础配置

   上面已经创建过了,无需重复创建(忽略)

(2)增加prometheus-agent的ConfigMap指标采集内容

         注意:regex: kube-system;kubelet;https-metrics,分别对应资源svc的命名空间;svc名称;端口名称

vim prometheus-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-agent-conf
  labels:
    name: prometheus-agent-conf
  namespace: monitor
data:
  prometheus.yml: |-
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    scrape_configs:
      - job_name: 'apiserver'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: default;kubernetes;https
       
      - job_name: 'controller-manager'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-controller-manager-svc;https-metrics
      
      - job_name: 'scheduler'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-scheduler-svc;https-metrics
      
      - job_name: 'etcd'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: http
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;etcd-svc;http
     
      - job_name: 'kubelet'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kubelet;https-metrics
                
    remote_write:
    - url: 'http://192.168.90.155:17000/prometheus/v1/write'
kubectl apply -f prometheus-cm.yaml

(3)创建kubelet的svc(如果有,请忽略这一步)

         先查看一下自己有没有对应的kubelet的endpoint/svc ,有的话就无需创建忽略,如果没有创建一个svc即可

vim kube-kubelet.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: kubelet
  name: kube-kubelet
  namespace: kube-system
spec:
  clusterIP: None
  ports:
    - name: https
      port: 10250
      protocol: TCP
      targetPort: 10250
  sessionAffinity: None
  type: ClusterIP
---
apiVersion: v1
kind: Endpoints
metadata:
  labels:
    k8s-app: kubelet
  name: kube-kubelet
  namespace: kube-system
subsets:
  - addresses:
      - ip: 192.168.120.101
      - ip: 192.168.120.102  ##这里我们自定义的endpoint,这里添加的是需要监控的k8s节点,这里我写的是master的ip地址和node的IP地址
    ports:
      - name: https
        port: 10250
        protocol: TCP
kubectl apply -f kube-kubelet.yaml

(4)更新prometheus agent的pod,实时采集新数据

kubectl delete pod prometheus-agent-xxxxxx-xxxxx -n monitor

(5)夜莺PromeSQL指标测试

kubelet_running_pods

 十二、K8s-KubeProxy组件监控

(1)权限绑定和一些基础配置

   上面已经创建过了,无需重复创建(忽略)

(2)增加prometheus-agent的ConfigMap指标采集内容

         注意:kube-system;kube-proxy-svc;http,分别对应资源svc的命名空间;svc名称;端口名称

vim prometheus-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-agent-conf
  labels:
    name: prometheus-agent-conf
  namespace: monitor
data:
  prometheus.yml: |-
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    scrape_configs:
      - job_name: 'apiserver'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: default;kubernetes;https
       
      - job_name: 'controller-manager'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-controller-manager-svc;https-metrics
      
      - job_name: 'scheduler'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-scheduler-svc;https-metrics
      
      - job_name: 'etcd'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: http
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;etcd-svc;http
     
      - job_name: 'kubelet'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kubelet;https-metrics
   
      - job_name: 'kube-proxy'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: http
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-proxy-svc;http

                        
    remote_write:
    - url: 'http://192.168.90.155:17000/prometheus/v1/write'
kubectl apply -f prometheus-cm.yaml

(3)创建KubeProxy的svc(如果有,请忽略这一步)

         先查看一下自己有没有对应的KubeProxy的endpoint/svc ,有的话就无需创建忽略,如果没有创建一个svc即可

vim kube-proxy-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: kube-proxy
  name: kube-proxy-svc
  namespace: kube-system
spec:
  clusterIP: None
  selector:
    k8s-app: kube-proxy
  ports:
    - name: http
      port: 10249
      protocol: TCP
      targetPort: 10249
  sessionAffinity: None
  type: ClusterIP
kubectl apply -f kube-proxy-svc.yaml 

(4)更改kube-proxy的metricsbindAddress

         为了监控集群中的组件,需要直接访问kube-proxy的metrics指标
    找到metricsBindAddress这行,把地址改为0.0.0.0,可以接受来自远程连接
    无需手动重启,edit后会自动检测到配置文件的更改并重启kube-proxy

kubectl edit cm -n kube-system kube-proxy
    kind: KubeProxyConfiguration
    metricsBindAddress: "0.0.0.0"  
    mode: ""
    nodePortAddresses: null
    oomScoreAdj: nul

(5)更新prometheus agent的pod,实时采集新数据

kubectl delete pod prometheus-agent-xxxxxx-xxxxx -n monitor

(6)夜莺PromeSQL指标测试

kubeproxy_network_programming_duration_seconds_bucket

(7)滚动更新kube-proxy

kubectl rollout restart ds kube-proxy -n kube-system

 十三、Cadvisor 组件监控

(1)权限绑定和一些基础配置

   上面已经创建过了,无需重复创建(忽略)

(2)增加prometheus-agent的ConfigMap指标采集内容

         注意:kube-system;kube-proxy-svc;http,分别对应资源svc的命名空间;svc名称;端口名称

(3)因为k8s已经将cadvisor内置到了kubelet组件,抓取路径为:/metrics/cadvisor

vim prometheus-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-agent-conf
  labels:
    name: prometheus-agent-conf
  namespace: monitor
data:
  prometheus.yml: |-
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    scrape_configs:
      - job_name: 'apiserver'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: default;kubernetes;https
        - target_label: origin_prometheus
          replacement: 'test'

      - job_name: 'controller-manager'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-controller-manager-svc;https-metrics
        - target_label: origin_prometheus
          replacement: 'test'

      - job_name: 'scheduler'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-scheduler-svc;https-metrics
        - target_label: origin_prometheus
          replacement: 'test'

      - job_name: 'etcd'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: http
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;etcd-svc;http
        - target_label: origin_prometheus
          replacement: 'test'

      - job_name: 'kubelet'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kubelet;https-metrics
        - target_label: origin_prometheus
          replacement: 'test'

      - job_name: 'kube-proxy'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: http
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-proxy-svc;http
        - target_label: origin_prometheus
          replacement: 'test'
       
      - job_name: 'kubelet-cadvisor'
        kubernetes_sd_configs:
        - role: node
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_node_name]
          target_label: node
        - target_label: __metrics_path__
          replacement: /metrics/cadvisor
        - target_label: origin_prometheus
          replacement: 'test'

    remote_write:
    - url: 'http://192.168.90.155:17000/prometheus/v1/write'
kubectl apply -f prometheus-cm.yaml

(4)创建kubelet的svc(如果有,请忽略这一步)

         先查看一下自己有没有对应的kubelet的endpoint/svc ,有的话就无需创建忽略,如果没有创建一个svc即可

(5)更新prometheus agent的pod,实时采集新数据

kubectl delete pod prometheus-agent-xxxxxx-xxxxx -n monitor

(6)夜莺PromeSQL指标测试

container_cpu_system_seconds_total

十四、利用kube-state-metrics监控K8s资源

(1)进入创建好的资源文件夹

cd /opt/yaml/monitor/ksm

(2)下载新版本的Kube-state-metrics

       地址:https://github.com/kubernetes/kube-state-metrics/releases

将examples/standard目录下的文件拷贝到ksm文件夹
分别为:cluster-role.yaml、cluster-role-binding.yaml、deployment.yaml、service.yaml、service-account.yaml

(3)修改deployment.yaml文件镜像

- image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.12.0为k8s的官方的镜像站,在我们国内拉不下来

vim deployment.yaml
spec:
      automountServiceAccountToken: true
      containers:
      - image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.12.0
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 5
          timeoutSeconds: 5
        name: kube-state-metrics

(4)修改deployment.yaml文件时区

vim deployment.yaml
spec:
      automountServiceAccountToken: true
      containers:
      - image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.12.0
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 5
          timeoutSeconds: 5
        name: kube-state-metrics
        env:
          - name: TZ              
            value: Asia/Shanghai
        ports:
        - containerPort: 8080
          name: http-metrics
        - containerPort: 8081
          name: telemetry
        readinessProbe:
          httpGet:
            path: /
            port: 8081
          initialDelaySeconds: 5

(5)创建启动所有文件

kubectl apply -f ksm/

(6)新建kube-state-metrics的svc文件(如果有,请忽略这一步)

         8080 端口返回的内容就是各类 Kubernetes 对象信息,比如 node 相关的信息;

         8081 端口暴露的是 KSM 自身的指标,KSM 要调用 APIServer 的接口,watch 相关数据,需要度量这些动作的健康状况

vim service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: exporter
    app.kubernetes.io/name: kube-state-metrics
    app.kubernetes.io/version: 2.8.2
  name: kube-state-metrics
  namespace: kube-system
spec:
  clusterIP: None
  ports:
  - name: http-metrics
    port: 8080                  
    targetPort: http-metrics
  - name: telemetry
    port: 8081
    targetPort: telemetry
  selector:
    app.kubernetes.io/name: kube-state-metrics
kubectl apply -f service.yaml

(7)测试采集情况

kubectl get endpoints -A | grep kube-state

curl 10.95.156.119:8080/metrics 

(8)增加prometheus-agent的2个ConfigMap指标采集内容

   regex: kube-system;kube-state-metrics;http-metrics ,分别对应资源的,命名空间;svc名称;端口名称
   regex: kube-system;kube-state-metrics;telemetry ,分别对应资源的,命名空间;svc名称;端口名称
vim prometheus-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-agent-conf
  labels:
    name: prometheus-agent-conf
  namespace: monitor
data:
  prometheus.yml: |-
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    scrape_configs:
      - job_name: 'apiserver'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: default;kubernetes;https
        - target_label: origin_prometheus
          replacement: 'test'

      - job_name: 'controller-manager'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-controller-manager-svc;https-metrics
        - target_label: origin_prometheus
          replacement: 'test'

      - job_name: 'scheduler'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-scheduler-svc;https-metrics
        - target_label: origin_prometheus
          replacement: 'test'

      - job_name: 'etcd'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: http
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;etcd-svc;http
        - target_label: origin_prometheus
          replacement: 'test'

      - job_name: 'kubelet'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kubelet;https-metrics
        - target_label: origin_prometheus
          replacement: 'test'

      - job_name: 'kube-proxy'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: http
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-proxy-svc;http
        - target_label: origin_prometheus
          replacement: 'test'

      - job_name: 'kubelet-cadvisor'
        kubernetes_sd_configs:
        - role: node
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_node_name]
          target_label: node
        - target_label: __metrics_path__
          replacement: /metrics/cadvisor
        - target_label: origin_prometheus
          replacement: 'test'

      - job_name: 'kube-state-metrics'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: http
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-state-metrics;http-metrics
        - target_label: origin_prometheus
          replacement: 'test'

      - job_name: 'kube-state-metrics-self'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: http
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-state-metrics;telemetry
        - target_label: origin_prometheus
          replacement: 'test'
       
    remote_write:
    - url: 'http://192.168.90.155:17000/prometheus/v1/write'
kubectl apply -f prometheus-cm.yaml

(9)更新prometheus agent的pod,实时采集新数据

kubectl delete pod prometheus-agent-xxxxxx-xxxxx -n monitor

(10)夜莺PromeSQL指标测试

kube_pod_container_info

 十五、自定义标签

用于标识数据的来源或环境

- target_label: origin_prometheus             # 自定义标签名
  replacement: 'prod'                         # 标签值

完整Yaml文件:prometheus-cm.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-agent-conf
  labels:
    name: prometheus-agent-conf
  namespace: monitor
data:
  prometheus.yml: |-
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    scrape_configs:
      - job_name: 'apiserver'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: default;kubernetes;https
        - target_label: origin_prometheus
          replacement: 'prod'

      - job_name: 'controller-manager'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-controller-manager-svc;https-metrics
        - target_label: origin_prometheus
          replacement: 'prod'

      - job_name: 'scheduler'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-scheduler-svc;https-metrics
        - target_label: origin_prometheus
          replacement: 'prod'

      - job_name: 'etcd'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: http
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;etcd-svc;http
        - target_label: origin_prometheus
          replacement: 'prod'

      - job_name: 'kubelet'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kubelet;https-metrics
        - target_label: origin_prometheus
          replacement: 'prod'

      - job_name: 'kube-proxy'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: http
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-proxy-svc;http
        - target_label: origin_prometheus
          replacement: 'prod'

      - job_name: 'kubelet-cadvisor'
        kubernetes_sd_configs:
        - role: node
        scheme: https
        tls_config:
          insecure_skip_verify: true
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        relabel_configs:
        - source_labels: [__meta_kubernetes_node_name]
          target_label: node
        - target_label: __metrics_path__
          replacement: /metrics/cadvisor
        - target_label: origin_prometheus
          replacement: 'prod'

      - job_name: 'kube-state-metrics'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: http
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-state-metrics;http-metrics
        - target_label: origin_prometheus
          replacement: 'prod'

      - job_name: 'kube-state-metrics-self'
        kubernetes_sd_configs:
        - role: endpoints
        scheme: http
        relabel_configs:
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
          action: keep
          regex: kube-system;kube-state-metrics;telemetry
        - target_label: origin_prometheus
          replacement: 'prod'
       
    remote_write:
    - url: 'http://192.168.90.155:17000/prometheus/v1/write'

 

posted @ 2024-07-23 02:57  吕钦扬  阅读(31)  评论(0)    收藏  举报