第10周 prometheuas相关

第10周 prometheuas相关

一、基于Operator和二进制安装prometheus环境

1.1 Operator部署

operator部署是基于已经编写好的yaml文件,可以将prometheus server、altermanager、grafana、node-exporter等组件一键批量部署。

前置条件:完成部署kubernetes

https://github.com/prometheus-operator/kube-prometheus

1.1.1下载项目文件

wget https://github.com/prometheus-operator/kube-prometheus/archive/refs/heads/main.zip
unzip main.zip
cd kube-prometheus-main/manifests/

1.1.2 查看对应yaml文件所需镜像

因部分镜像无法直接下载,需提前下载

grep -R 'image:' ./*
./alertmanager-alertmanager.yaml:  image: quay.io/prometheus/alertmanager:v0.25.0
./blackboxExporter-deployment.yaml:        image: quay.io/prometheus/blackbox-exporter:v0.23.0
./blackboxExporter-deployment.yaml:        image: jimmidyson/configmap-reload:v0.5.0
./blackboxExporter-deployment.yaml:        image: quay.io/brancz/kube-rbac-proxy:v0.14.1
./grafana-deployment.yaml:        image: grafana/grafana:9.5.1
./kubeStateMetrics-deployment.yaml:        image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.8.2
./kubeStateMetrics-deployment.yaml:        image: quay.io/brancz/kube-rbac-proxy:v0.14.1
./kubeStateMetrics-deployment.yaml:        image: quay.io/brancz/kube-rbac-proxy:v0.14.1
./nodeExporter-daemonset.yaml:        image: quay.io/prometheus/node-exporter:v1.5.0
./nodeExporter-daemonset.yaml:        image: quay.io/brancz/kube-rbac-proxy:v0.14.1
./prometheus-prometheus.yaml:  image: quay.io/prometheus/prometheus:v2.43.0
./prometheusAdapter-deployment.yaml:        image: registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.10.0
./prometheusOperator-deployment.yaml:        image: quay.io/prometheus-operator/prometheus-operator:v0.64.1
./prometheusOperator-deployment.yaml:        image: quay.io/brancz/kube-rbac-proxy:v0.14.1

1.1.3 将不能下载镜像进行替换

sed -i 's@registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.8.2@bitnami/kube-state-metrics:2.8.2@g' kubeStateMetrics-deployment.yaml
sed -i 's@registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.10.0@v5cn/prometheus-adapter:v0.10.0@g' prometheusAdapter-deployment.yaml

1.1.4 执行创建

# 先创建资源

kubectl apply --server-side -f setup/

# 创建服务

kubectl apply -f ./

查看Pod状态

kubectl get po -n monitoring 
NAME                                   READY   STATUS    RESTARTS   AGE
alertmanager-main-0                    2/2     Running   0          8m33s
alertmanager-main-1                    2/2     Running   0          8m33s
alertmanager-main-2                    2/2     Running   0          8m33s
blackbox-exporter-6cdb47d9fc-m42r7     3/3     Running   0          8m44s
grafana-789ffdcdd4-xsbn9               1/1     Running   0          8m42s
kube-state-metrics-64b886d69d-7d2jz    3/3     Running   0          8m41s
node-exporter-284sx                    2/2     Running   0          8m41s
node-exporter-2sp2h                    2/2     Running   0          8m41s
node-exporter-42695                    0/2     Pending   0          8m41s
node-exporter-c2h4x                    2/2     Running   0          8m41s
node-exporter-dvgg2                    0/2     Pending   0          8m41s
node-exporter-l7t4v                    2/2     Running   0          8m41s
prometheus-adapter-85df796f6c-98tb8    1/1     Running   0          8m37s
prometheus-adapter-85df796f6c-ng4cf    1/1     Running   0          8m36s
prometheus-k8s-0                       2/2     Running   0          8m32s
prometheus-k8s-1                       2/2     Running   0          8m32s
prometheus-operator-8454fb89d4-bzzxj   2/2     Running   0          8m36s

查看service,默认为ClusterIP

kubectl get svc -n monitoring 
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
alertmanager-main       ClusterIP   10.68.29.138    <none>        9093/TCP,8080/TCP            9m54s
alertmanager-operated   ClusterIP   None            <none>        9093/TCP,9094/TCP,9094/UDP   9m42s
blackbox-exporter       ClusterIP   10.68.183.54    <none>        9115/TCP,19115/TCP           9m53s
grafana                 ClusterIP   10.68.201.242   <none>        3000/TCP                     9m51s
kube-state-metrics      ClusterIP   None            <none>        8443/TCP,9443/TCP            9m50s
node-exporter           ClusterIP   None            <none>        9100/TCP                     9m50s
prometheus-adapter      ClusterIP   10.68.78.123    <none>        443/TCP                      9m46s
prometheus-k8s          ClusterIP   10.68.171.45    <none>        9090/TCP,8080/TCP            9m47s
prometheus-operated     ClusterIP   None            <none>        9090/TCP                     9m41s
prometheus-operator     ClusterIP   None            <none>        8443/TCP                     9m45s

默认己设置相关网络策略,可先删除相关策略,后续可根据实际需要求进行修改调整

for i in `ls |grep network`;do kubectl delete -f $i;done
networkpolicy.networking.k8s.io "alertmanager-main" deleted
networkpolicy.networking.k8s.io "blackbox-exporter" deleted
networkpolicy.networking.k8s.io "grafana" deleted
networkpolicy.networking.k8s.io "kube-state-metrics" deleted
networkpolicy.networking.k8s.io "node-exporter" deleted
networkpolicy.networking.k8s.io "prometheus-k8s" deleted
networkpolicy.networking.k8s.io "prometheus-adapter" deleted
networkpolicy.networking.k8s.io "prometheus-operator" deleted

1.1.5 验证Prometheus Web页面

客户端浏览器访问,需将prometheus-service.yaml文件中service type更改为NodePort

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: prometheus
    app.kubernetes.io/instance: k8s
    app.kubernetes.io/name: prometheus
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 2.43.0
  name: prometheus-k8s
  namespace: monitoring
spec:
  type: NodePort
  ports:
  - name: web
    port: 9090
    targetPort: web
    nodePort: 39100
  - name: reloader-web
    port: 8080
    targetPort: reloader-web
    nodePort: 39101
  selector:
    app.kubernetes.io/component: prometheus
    app.kubernetes.io/instance: k8s
    app.kubernetes.io/name: prometheus
    app.kubernetes.io/part-of: kube-prometheus
  sessionAffinity: ClientIP

更新service,查看prometheuas-k8s暴露node端口号

kubectl get svc -n monitoring 
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE
alertmanager-main       ClusterIP   10.68.29.138    <none>        9093/TCP,8080/TCP               5d20h
alertmanager-operated   ClusterIP   None            <none>        9093/TCP,9094/TCP,9094/UDP      5d20h
blackbox-exporter       ClusterIP   10.68.183.54    <none>        9115/TCP,19115/TCP              5d20h
grafana                 ClusterIP   10.68.201.242   <none>        3000/TCP                        5d20h
kube-state-metrics      ClusterIP   None            <none>        8443/TCP,9443/TCP               5d20h
node-exporter           ClusterIP   None            <none>        9100/TCP                        5d20h
prometheus-adapter      ClusterIP   10.68.78.123    <none>        443/TCP                         5d20h
prometheus-k8s          NodePort    10.68.171.45    <none>        9090:39100/TCP,8080:39101/TCP   5d20h
prometheus-operated     ClusterIP   None            <none>        9090/TCP                        5d20h
prometheus-operator     ClusterIP   None            <none>        8443/TCP                        5d20h

浏览器访问,查看status

1.1.6 验证grafana Web页面

客户端浏览器访问,需将grafana-service.yaml文件中service type更改为NodePort

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: grafana
    app.kubernetes.io/name: grafana
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 9.5.1
  name: grafana
  namespace: monitoring
spec:
  type: NodePort
  ports:
  - name: http
    port: 3000
    targetPort: http
    nodePort: 33030
  selector:
    app.kubernetes.io/component: grafana
    app.kubernetes.io/name: grafana
    app.kubernetes.io/part-of: kube-prometheus

更新service

kubectl get svc -n monitoring
grafana                 NodePort    10.68.201.242   <none>        3000:33030/TCP                  5d23h

浏览器访问,默认用户名、密码(admin admin)

1.2 通过deployment部署

1.2.1创建prometheus配置文件的configmap

---
kind: ConfigMap
apiVersion: v1
metadata:
  labels:
    app: prometheus
  name: prometheus-config
  namespace: monitoring 
data:
  prometheus.yml: |
    global:
      scrape_interval: 15s
      scrape_timeout: 10s
      evaluation_interval: 1m
    scrape_configs:
    - job_name: 'kubernetes-node'
      kubernetes_sd_configs:
      - role: node
      relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'
        target_label: __address__
        action: replace
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
    - job_name: 'kubernetes-node-cadvisor'
      kubernetes_sd_configs:
      - role:  node
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - target_label: __address__
        replacement: kubernetes.default.svc:443
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
    - job_name: 'kubernetes-apiserver'
      kubernetes_sd_configs:
      - role: endpoints
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_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: 'kubernetes-service-endpoints'
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
        action: replace
        target_label: __scheme__
        regex: (https?)
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
        action: replace
        target_label: __address__
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
      - action: labelmap
        regex: __meta_kubernetes_service_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_service_name]
        action: replace
        target_label: kubernetes_service_name

部署

kubectl apply -f case3-1-prometheus-cfg.yaml

1.2.2 部署prometheus deployment

将prometheus-server部署到node3节点,在node3创建本地数据目录

mkdir -p /data/prometheusdata
chmod 777 /data/prometheusdata
#prometheus运行在node3,提前准备数据目录并授权
kubectl create serviceaccount monitor -n monitoring #创建监控帐号
kubectl create clusterrolebinding monitor-clusterrolebinding -n monitoring --clusterrole=cluster-admin --serviceaccount=monitoring:monitor #对monitoring帐号授权


prometheus-deployment的yaml文件

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-server
  namespace: monitoring
  labels:
    app: prometheus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
      component: server
    #matchExpressions:
    #- {key: app, operator: In, values: [prometheus]}
    #- {key: component, operator: In, values: [server]}
  template:
    metadata:
      labels:
        app: prometheus
        component: server
      annotations:
        prometheus.io/scrape: 'false'
    spec:
      nodeName: 192.168.44.17
      serviceAccountName: monitor
      containers:
      - name: prometheus
        image: prom/prometheus:v2.31.2
        imagePullPolicy: IfNotPresent
        command:
          - prometheus
          - --config.file=/etc/prometheus/prometheus.yml
          - --storage.tsdb.path=/prometheus
          - --storage.tsdb.retention=720h
        ports:
        - containerPort: 9090
          protocol: TCP
        volumeMounts:
        - mountPath: /etc/prometheus/prometheus.yml
          name: prometheus-config
          subPath: prometheus.yml
        - mountPath: /prometheus/
          name: prometheus-storage-volume
      volumes:
        - name: prometheus-config
          configMap:
            name: prometheus-config
            items:
              - key: prometheus.yml
                path: prometheus.yml
                mode: 0644
        - name: prometheus-storage-volume
          hostPath:
           path: /data/prometheusdata
           type: Directory

部署与验证

kubectl apply -f case3-2-prometheus-deployment.yaml
kubectl get po -n monitoring 
NAME                                 READY   STATUS        RESTARTS        AGE
prometheus-server-7dc946c986-sn2df   1/1     Running       0               62m

1.2.3 prometheus的svc

svc的yaml

---
apiVersion: v1
kind: Service
metadata:
  name: prometheus
  namespace: monitoring
  labels:
    app: prometheus
spec:
  type: NodePort
  ports:
    - port: 9090
      targetPort: 9090
      nodePort: 30090
      protocol: TCP
  selector:
    app: prometheus
    component: server

部署与验证

kubectl apply -f case3-3-prometheus-svc.yaml
kubectl get svc -n monitoring 
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
node-exporter   NodePort   10.68.98.193   <none>        9100:39100/TCP   19d
prometheus      NodePort   10.68.148.46   <none>        9090:30090/TCP   112m

1.3 二进制部署

https://github.com/prometheus

img

1.3.1 下载prometheus server二进制程序

下载地址:https://github.com/prometheus/prometheus/releases

mkdir /apps
cd /apps
wget https://github.com/prometheus/prometheus/releases/download/v2.40.7/prometheus-2.40.7.linux-amd64.tar.gz
tar -xvf prometheus-2.40.7.linux-amd64.tar.gz
ln -s /apps/prometheus-2.40.7.linux-amd64 /apps/prometheus

1.3.2 启动prometheus服务

1.创建service文件

cat >>/etc/systemd/system/prometheus.service <<EOF
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
 
[Service]
Restart=on-failure
WorkingDirectory=/apps/prometheus/
ExecStart=/apps/prometheus/prometheus   --config.file=/apps/prometheus/prometheus.yml --web.enable-lifecycle
 
[Install]
WantedBy=multi-user.target
EOF

说明:--web.enable-lifecycle表示动态加载配置,可以用命令 curl -X POST http://localhost:9090/-/reload重新加载配置文件

prometheus启动参数配置参考

h, --help:显示帮助信息

      --version:显示版本信息

      --config.file="prometheus.yml":启动时,指定Prometheus读取配置文件的路径。  

      --web.listen-address="0.0.0.0:9090" :指定网页打开Prometheus的ip和端口,默认为"0.0.0.0:9090"。

      --web.read-timeout=5m:页面读取请求最大超时时间  

      --web.max-connections=512:同时访问Prometheus页面的最大连接数,默认为512。

      --web.external-url=<URL>:Prometheus对外提供的url(eg: Prometheus通过反向代理提供服务)。用于生成一个相对和绝对的链接返回给Prometheus本身。如果这个url有路径部分,它将用于Prometheus所有HTTP端点的前缀。如果省略了,则相关的url组件将自动派生(If the URL has a path portion, it will be used to prefix all HTTP endpoints served by Prometheus. If omitted, relevant URL components will be derived automatically)。      

      --web.route-prefix=<path>:Web端点内部路由的前缀。默认路径:web.external-url。

      --web.user-assets=<path>:静态资源路径,可以在/user下找到。

      --web.enable-lifecycle:通过HTTP请求启用关闭和重新加载。

      --web.enable-admin-api:启用管理控制操作的api端点。(Enables API endpoints for admin control actions)

      --web.console.templates="consoles":到控制台模板目录的路径,可以在consoles/目录下找到。

      --web.console.libraries="console_libraries":控制台库目录的路径。 

      --storage.tsdb.path="data/":存储的基本路径。

      --storage.tsdb.min-block-duration=2h:在持久化之前数据块的最短保存期。

      --storage.tsdb.max-block-duration=<duration>:在持久化之前数据块的最大保存期(默认为保存期的10%)。

      --storage.tsdb.retention=15d:存储采样的保存时间。

      --storage.tsdb.no-lockfile:不在数据目录中创建lockfile(Do not create lockfile in data directory)。

      --alertmanager.notification-queue-capacity=10000:等待报警通知队列的大小。

      --alertmanager.timeout=10s:发送警报到Alertmanager的超时时间。

      --query.lookback-delta=5m:允许在表达式求值期间检索度量值的delta差值(The delta difference allowed for retrieving metrics during expression evaluations)。

     --query.timeout=2m: 一个查询在终止之前可以执行的最长时间(如果超过2min,就会自动kill掉)。

      --query.max-concurrency=20:并发执行的最大查询数,默认为20。

      --log.level=info: 开启打印日志级别(debug,info,warn,error,fatal)。默认为info。

      --query.lookback-delta=10m 

 

参数用法:

eg:

未设置参数 --web.enable-lifecycle时,执行curl -X POST http://localhost:9090/-/reload 会报错:

启动设置参数--web.enable-lifecycle就可以用命令 curl -X POST http://localhost:9090/-/reload 重新加载配置文件了。

 

打印日志:

1.在prometheus目录下创建文件。

     touch prome.log

2.启动prometheus时,把参数--log.level=info带上。

启动命令为:

3.再用命令curl -X POST http://localhost:9090/-/reload重新加载prometheus.yml

查看日志:

可以看到日志最后一条输出Loading configuration file "filename=prometheus.yml"

2.启动服务

systemctl daemon-reload

systemctl enble --now prometheus.service

3.验证状态

systemctl is-active prometheus.service 
active
ss -tunlp|grep 9090
tcp    LISTEN  0       4096                      *:9090                 *:*      users:(("prometheus",pid=60695,fd=7)) 

1.2.3验证prometheus web界面

二、通过node-exporter和cadvisor收集指标数据

2.1 node-exporter

k8s各node节点安装node-exporter(二进制或daemonset方式),用于收集各k8s节点宿主机的监控指标数据,默认监听为9100

2.1.1 daemonset方式部署node-exporter

说明:若k8s环境中己通过其他方式部署prometheus node-exporter,需先停止或更改监听端口,防止端口冲突

2.1.1.1 编写yaml文件

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: monitoring 
  labels:
    k8s-app: node-exporter
spec:
  selector:
    matchLabels:
        k8s-app: node-exporter
  template:
    metadata:
      labels:
        k8s-app: node-exporter
    spec:
      tolerations:			# 容忍
        - effect: NoSchedule
          key: node-role.kubernetes.io/master
      containers:
      - image: prom/node-exporter:v1.3.1
        imagePullPolicy: Always 	#IfNotPresent	#镜像拉取策略
        name: prometheus-node-exporter
        ports:
        - containerPort: 9100
          hostPort: 9100		# 宿主机暴露port
          protocol: TCP
          name: metrics
        volumeMounts:
        - mountPath: /host/proc
          name: proc
        - mountPath: /host/sys
          name: sys
        - mountPath: /host
          name: rootfs
        args:
        - --path.procfs=/host/proc
        - --path.sysfs=/host/sys
        - --path.rootfs=/host
      volumes:
        - name: proc
          hostPath:
            path: /proc
        - name: sys
          hostPath:
            path: /sys
        - name: rootfs
          hostPath:
            path: /
      hostNetwork: true
      hostPID: true
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    prometheus.io/scrape: "true"
  labels:
    k8s-app: node-exporter
  name: node-exporter
  namespace: monitoring 
spec:
  type: NodePort
  ports:
  - name: http
    port: 9100
    nodePort: 39100
    protocol: TCP
  selector:
    k8s-app: node-exporter

2.1.1.2 执行创建

kubectl apply -f nodeport-daemonset.yaml

查看pod状态

kubectl get po -n monitoring
NAME                  READY   STATUS        RESTARTS   AGE
node-exporter-7sbj6   1/1     Running       0          151m
node-exporter-b5dqw   1/1     Running       0          151m
node-exporter-dlk8b   1/1     Running       0          151m
node-exporter-dvgg2   0/2     Terminating   0          8d
node-exporter-ppzt9   1/1     Running       0          151m
node-exporter-s5979   1/1     Running       0          151m

查看service

kubectl get svc -n monitoring 
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
node-exporter   NodePort   10.68.98.193   <none>        9100:39100/TCP   153m

缩主机监听端口

ss -tunlp|grep 9100
tcp     LISTEN   0        32768                  *:9100                 *:*      users:(("node_exporter",pid=32887,fd=3)) 

2.1.1.3 验证node-exporter web页面

访问 宿主机IP:39100

https://knowledge.zhaoweiguo.com/build/html/cloudnative/prometheus/metrics/kubernetes-nodes.html

常见指标说明

node_boot_time		系统自启动以后的总运行时间
node_cpu		系统CPU使用量
node_disk*		磁盘IO
node_filesystem*	系统文件使用量
node_load1		系统CPU负载
node_memory*		内存使用量
node_network*		网络带宽指标
go_*			node exporter中go相关指标
process_*		node exporter自身进程相关运行指标

2.1.2 prometheus server收集node-exporter数据

2.1.2.1 添加采集node节点数据配置
cat prometheus.yml 
# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]
  - job_name: "prometheus-node"
    static_configs:
      - targets: ["192.168.44.12:9100","192.168.44.14:9100","192.168.44.15:9100","192.168.44.16:9100","192.168.44.17:9100"] 

重启服务

systemctl restart prometheus.service

2.1.2.2 验证prometheus server数据采集状态

2.1.2.3 验证node数据

2.2 cadvisor

cadvisor(容器顾问)不仅可以收集一台机器上所有运行的容器信息,还提供基础查询界面和http接口,方便其他组件如prometheus进行数据抓取,cadvisor可以对节点机器上的容器进行实时监控和性能数据采集,包括容器的CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况。

https://github.com/google/cadvisor

2.2.1 daemonset方式部署cadvisor

2.2.1.1 编写yaml文件
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: cadvisor
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app: cAdvisor
  template:
    metadata:
      labels:
        app: cAdvisor
    spec:
      tolerations:    #污点容忍,忽略master的NoSchedule
        - effect: NoSchedule
          key: node-role.kubernetes.io/master
      hostNetwork: true       #将容器端口直接映射到本地宿主机
      restartPolicy: Always   # 重启策略
      containers:
      - name: cadvisor
        image: registry.cn-hangzhou.aliyuncs.com/zhangshijie/cadvisor-amd64:v0.39.3 #修改实际镜像
        imagePullPolicy: Always 	# 镜像策略
        ports:
        - containerPort: 8080
        volumeMounts:
          - name: root
            mountPath: /rootfs
          - name: run
            mountPath: /var/run
          - name: sys
            mountPath: /sys
          - name: docker
            mountPath: /var/lib/containerd
      volumes:
      - name: root
        hostPath:
          path: /
      - name: run
        hostPath:
          path: /var/run
      - name: sys
        hostPath:
          path: /sys
      - name: docker
        hostPath:
          path: /var/lib/containerd	

执行创建

kubectl apply -f cadvisor.yaml

kubectl get po -n monitoring 
NAME                  READY   STATUS        RESTARTS   AGE
cadvisor-7ng5n        1/1     Running       0          136m
cadvisor-hp56s        1/1     Running       0          136m
cadvisor-hqfrw        1/1     Running       0          136m
cadvisor-npl85        1/1     Running       0          136m
cadvisor-vxvbx        1/1     Running       0          136m
node-exporter-7sbj6   1/1     Running       0          7h8m
node-exporter-b5dqw   1/1     Running       0          7h8m
node-exporter-dlk8b   1/1     Running       0          7h8m
node-exporter-dvgg2   0/2     Terminating   0          8d
node-exporter-ppzt9   1/1     Running       0          7h8m
node-exporter-s5979   1/1     Running       0          7h8m

ss -tunlp|grep 8080
tcp     LISTEN   0        32768                  *:8080                 *:*      users:(("cadvisor",pid=217558,fd=3))   

2.2.1.2 验证web页面及指标数据

浏览器查看指标数据 宿主机IP:8080/metrics

2.2.2 prometheus server收集cadvisor数据

2.2.2.1 cadvisor指标数据
指标名称 类型 含义
container_cpu_load_average_10s gauge 过去10s容器CPU的平均负载
container_cpu_usage_seconds_total counter 容器在每个CPU内核上的累积占用时间(单位: 秒)
container_cpu_system_seconds_total counter System CPU累积占用时间(单位: 秒)
container_cpu_user_seconds_total counter User CPU累积占用时间(单位: 秒)
container_fs_usage_bytes gauge 容器中文件系统的使用量(单位: 字节)
container_fs_limit_bytes gauge 容器可以使用的文件系统总量(单位: 字节)
container_fs_reads_bytes_total counter 容器累积读取数据的总量(单位: 字节)
container_fs_writes_bytes_total counter 容器累积写入数据的总量(单位: 字节)
container_memory_max_usage_bytes gauge 容器的最大内存使用量(单位: 字节)
container_memory_usage_bytes gauge 容器当前的内存使用量(单位: 字节)
container_spec_memory_limit_bytes gauge 容器的内存使用量限制
machine_memory_bytes gauge 当前主机的内存总量
container_network_receive_bytes_total counter 容器网络累积接收数据总量(单位:字节)
container_network_transmit_bytes_total counter 容器网络累积传输数据总量(单位:字节)

当能够正常采集到cAdvisor 的样本数据后,可以通过以下表达式计算容器的CPU使用率:

  • 容器CPU使用率

    sum(irate(container_cpu_usage_seconds_total{imagel=""}[1m])) without(cpu)
    
  • 查询容器内存使用量(单位:字节)

    container_memory_usage_bytes{image!=""}
    
  • 查询容器网络接收量(速率)(单位:字节/秒)

    sum(rate(container_network_receive_bytes_total{image!=""}[1m])) without (interface)
    
  • 容器网络传输量字节/秒

    sum(rate(container_network_transmit_bytes_total{imagel=""}[1m])) without (interface)
    
  • 容器文件系统读取速率字节/秒

    sum(rate(container_fs_reads_bytes_totalf{image!=""}[1m])) without (device)
    
  • 容器文件系统写入速率字节/秒

    sum(rate(container_fs_writes_bytes_total{image!=""}[1m])) without (device)
    

cadvisor常用容器监控指标

  1. 网络流量

    #容器网络接收的字节数(1分钟内),根据名称查询name=~".+"
    sum(rate(container_network_receive_bytes_total{container_label_io_kubernetes_pod_name=~".+"}[1m])) by (container_label_io_kubernetes_pod_name)
     
    #容器网络传输的字节数(1分钟内),根据名称查询name=~".+"
    sum(rate(container_network_transmit_bytes_total{container_label_io_kubernetes_pod_name=~".+"}[1m])) by (container_label_io_kubernetes_pod_name)
    

  2. 容器CPU相关

    #所用容器system cpu的累计使用时间(1min内)
    sum(rate(container_cpu_system_seconds_total[1m]))
     
    #每个容器system cpu的使用时间(1min内)
    sum(irate(container_cpu_system_seconds_total{imagel=""}[1m])) without (cpu)
     
    #每个容器的Cpu使用率
    sum(rate(container_cpu_usage_seconds_total{container_label_io_kubernetes_pod_name=~".+"}[1m])) by (container_label_io_kubernetes_pod_name)*100
     
    #总容器的cpu使用率
    sum(sum(rate(container_cpu_usage_seconds_total{container_label_io_kubernetes_pod_name=~".+"}[1m])) by (container_label_io_kubernetes_pod_name)*100)
    
2.2.2.2 添加采集cadvisor数据配置
#cat /apps/prometheus/prometheus.yml
......
scrape_configs:
  ......
  # 添加cadvisor信息
  - job_name: "prometheus-cadvisor"
    static_configs:
      - targets: ["192.168.44.12:8080","192.168.44.14:8080","192.168.44.15:8080","192.168.44.16:8080","192.168.44.17:8080"]

重启服务

systemctl restart prometheus.service

2.2.2.3 验证prometheus数据采集状态

2.2.2.4 验证cadvisor数据

sum(rate(container_cpu_usage_seconds_total{container_label_io_kubernetes_pod_name=~".+"}[1m])) by (container_label_io_kubernetes_pod_name)*100

三、通过grafana展示prometheus的node和pod数据

官网:https://grafana.com/grafana

grafana server(10.0.0.62)与prometheus server进行分离

3.1 二进制部署grafana

下载:https://grafana.com/grafana/download

国内镜像源下载:https://mirrors.tuna.tsinghua.edu.cn/grafana/

安装说明:https://grafana.com/docs/grafana/latest/setup-grafana/installation/

3.1.1 下载并安装

wget https://mirrors.tuna.tsinghua.edu.cn/grafana/apt/pool/main/g/grafana-enterprise/grafana-enterprise_9.3.0_amd64.deb
apt update
apt-get install -y adduser libfontconfig1
dpkg -i grafana-enterprise_9.3.0_amd64.deb

3.1.2 修改grafana配置文件

vim /etc/grafana/grafana.ini 
......
# 配置端口类型、地址、端口号
[server]
protocol = http
 
http_addr = 192.168.44.23
 
http_port = 3000

3.1.3 启动服务

systemctl enable grafana-server.service
systemctl restart grafana-server.service

查看端口

root@zkkafka:/apps/prometheus# ss -tunlp|grep 3000
tcp    LISTEN  0       4096          192.168.44.23:3000           0.0.0.0:*      users:(("grafana-server",pid=77393,fd=11))  

3.1.4验证grafana 添加数据源

3.2 展示监控数据

模板:https://grafana.com/grafana/dashboards/

3.2.1展示node数据

在grafana中查找模板,可以下载json或者能上网直接使用ID

3.2.1.1 导入模板

Dashboard--Import

可选择导入json文件,加载模板ID,复制json文件内容任一方式导入模板

选择数据源

img

3.2.1.2 展示node监控数据

3.2.2 展示pod数据

3.2.2.1 导入模板

导入模板编号为14282,导入部署与node数据导入一致。

3.2.2.2 展示pod监控数据

由于promsql显示的是name标签,展示出的效果如下

将promsql中的name标签修改后,可以正常展示pod中的内容标签

将name替换为container_label_io_kubernetes_pod_name

四、梳理prometheus服务发现

4.1服务发现机制

prometheus默认是采用pull方式拉取监控数据的,也就是定时去目标主机上抓取metrics数据,每一个被抓取的目标需要暴露一个HTTP接口,prometheus通过这个暴露的接口就可以获取到相应的指标数据,这种方式需要由目标服务决定采集的目标有哪些,通过配置在scarpe_config中的各种job来实现,无法动态感知新服务,如果后面增加了节点或组件信息,就得手动修改prometheus配置,并重启prometheus,很不方便,所以出现了动态服务发现,动态服务发现能够自动实现集群中的新端点,并加入到配置中,通过服务发现,prometheus能查询到需要监控的target列表,然后轮询这些target获取监控数据。

4.2 标签重写(relabeling)

prometheus的relabeling能够在抓取到目标实例之前把目标实例的元数据标签动态重新修改,动态添加或者覆盖标签

prometheus从kubernetes API动态发现target之后,在被发现的target实例中,都包含一些原始的Metadata标签信息,默认标签有:

__address__: 以<host>:<port>格式显示targets地址
__scheme__: 采集的目标服务地址的scheme形式,HTTP或HTTPS
__metrics_path__:采集的目标服务访问路径

4.2.1 重写目的

为了更好的识别监控指标,便于后期调用数据绘图、告警等需求,prometheus支持对发现的目标进行label修改,在两个阶段可以重新标记:

  • relabel_configs

在对target进行数据采集之前(例如在采集数据之前重新定义标签信息,如目的IP、目的端口等信息),可以使用relabel_configs添加、修改或者 修改一些标签,也可以只采集特定目标或过滤目标。

  • metric_relabel_configs

在对target进行数据采集之后,即如果是己抓取到指标数据时,可以使用metric_relabel_configs做最后的重新标记和过滤。

4.2.2 label

  • source_label

源标签,没有经过relabel处理之前标签的名称

  • target_label

通过action处理之后新的标签名称

  • regex

给定的值或正则表达式匹配,匹配源标签的值

  • replacement

通过分组替换后标签(trget_label)对应的/()/() $1:$2

4.2.3 action

https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config

  • replace

替换标签值,根据regex正则匹配到源标签的值,使用replacement来引用表达式匹配的分组

  • keep

满足regex正则条件的实例进行采集,把source_labels中没有匹配到regex正则内容的target实例丢掉,即只采集匹配成功的实例。

  • drop

满足regex正则条件的实例不采集,把source_labels中匹配到的regex正则内容的target实例丢掉,即只采集没有匹配成功的实例

  • hashmod

使用hashmod计算source_labels中的Hash值并进行对比,基于自定义的模数取模,以实现对目标进行分类、重新赋值等功能

scrape_configs:
  - job_name: ip_job
    relabel_configs:
    - source_labels: [__address__]
      modulus: 4
      target_label: __ip_hash
      action: hashmod
    - source_labels: [__ip_hash]
      regex: ^1$
      action: keep
  • labelmap

匹配regex所有标签名称,然后复制匹配标签的值进行分组,可以通过replacement分组引用(${1},${2},...)替代

  • labelkeep

匹配regex所有标签名称,其他不匹配的标签都将从标签集中删除

  • labeldrop

匹配regex所有标签名称,其他匹配的标签都将从标签集中删除

4.3 服务发现类型

prometheus获取数据源target的方式有多种,如静态配置和动态服务发现配置,prometheus目前支持的服务发现有多种,常用发现方式的主要分为以下几种:

静态服务发现、基于文件的服务发现、DNS服务发现、Consul服务发现、基于kubernetes API服务发现。

更多说明见:

https://prometheus.io/docs/prometheus/latest/configuration/configuration/#configuration-file

4.3.1 静态服务发现

静态服务发现,基于prometheus配置文件指定的监控目标,每当有一个新的目标实例需要监控,都需要手动修改配置文件,配置目标target

prometheus server配置(yaml)示例

scrape_configs:
  - job_name: "staic_test"	# job名称
    # metrics_path: "/metrics"	# 默认URI
    # scheme: http		# 默认协议
    static_configs:		# 静态服务配置
      - targets: ["10.0.0.11:8080","10.0.0.12:8080","10.0.0.13:8080"]	# 目标端点地址

4.3.2 基于文件的服务发现

基于指定的文件实现服务发现,发现监控目标

prometheus server配置( yaml)示例

scrape_configs:
  # 基于文件服务发现监控配置
  - job_name: 'file_sd_test'
    scrape_interval: 10s	# 数据采集间隔时间
    file_sd_configs:
    - files:	 		# 支持yaml和json格式文件
       - /data/prometheus/static_conf/*.yml
       refresh_interval: 10s	# 重新读取文件的刷新时间

/data/prometheus/static_conf/目录下yaml文件内容

- targets: ['10.0.0.11:39100','10.0.0.12:39100']

4.3.3 DNS服务发现

基于DNS的服务发现允许配置指定一组的DNS域名,这些域名会定期查询以发现目标列表,域名需要可以被配置的DNS服务器解析为IP.

此服务发现方式仅支持基本的DNS A、AAAA、SRV记录查询。

A记录:		域名解析为一个IPv4地址
AAAA记录:	域名解析为一个IPv6地址
SRV:	SRV记录了哪台计算机提供了具体哪个服务,格式为:服务名称.协议类型.域名(如:_example-server._tcp.www.mydns.com)

prometheus server配置(yaml)示例:

scrape_configs:
  - job_name: 'dns_sd_test'
    scrape_interval: 10s	# 数据采集间隔时间
    dns_sd_configs:
    - name: ["node1.example.com","node2.example.com"]	# 域名
      type: A
      port: 9100

4.3.4 Consul服务发现

https://www.consul.io/

consul基于golang开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能,提供服务发现/注册、健康检查和保持一致性等功能。

Counsul是一个分布式k/v数据库,常用于服务的服务注册和发现。基于consul服务动态发现监控目标,prometheus一直监控consul服务,当发现在consul中注册的服务有变化,prometheus就会自动监控到所有注册到consul中目标资源

prometheus server配置(yaml)示例:

scrape_configs:
  - job_name: 'consul_sd_test'
    honor_labels: true
    metrics_path: "/metrics"
    scheme: http
    consul_sd_configs:
    - server: 10.0.0.11:8500
      services: []		# 发现的目标服务名称,空为所有服务
    - server: 10.0.0.12:8500
      services: []

参数说明:

honor_labels: 控制prometheus如何处理己经存在于己抓取数据中的标签与prometheus将附加服务器端的标签之间的冲突(“job"和”instance"标签,手动配置的目标标签己经服务发现实现生成的标签)。

如何honor_labels设置为"true",则保留己抓取数据的标签值并忽略冲突的prometheus服务端标签来解决标签冲突 ; ;另外如果被采集端有标签但是值为空,则使用prometheus本地标签值 ;如果被采集端没有此标签,但是prometheus配置了,那使用prometheus配置的标签值。

如果honor_labels设置为"false",则通过将己抓取数据中的冲突标签重名为

exported_<original-label>(如expoeterd_instanceexporterd_job)然后附加服务器端标签来解决标签冲突。

4.3.5 基于kubernetes API实现服务发现

基于kubernetes API实现服务发现,prometheus与kubernetes的API进行交互,动态的发现kubernetes中部署的所有可监控的目标资源

在kubernetes中,prometheus通过与kubernetes API进行交互,动态的发现kubernetes中部署的所有可监控的目标资源

在kubernetes中,prometheus通过与kubernetes API集成主要支持5种服务发现模式:Node、Service、Pod、Endpoints、Ingress。不同的服务发现模式适用于不同的场景,例如:node适用于与主机相关的监控资源,如节点中运行的kubernetes组件状态、节点上运行的容器状态等,service和ingress适用于通过黑盒监控场景,如对服务的可用性以及服务质量的监控;;endpoints和pod均可用于获取pod实例的监控数据,如监控用户或者管事员部署的支持Prometheus的应用

prometheus server配置示例:

...
scrape_configs:
  - job_name: "kubernetes_sd_test"
    scheme: http
    kubernetes_sd_configs: 
      - role: node

五、在prometheus实现kubernetes-apiserver及coredns服务发现

https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config

5.1 目标发现模式

在Kubernetes中,Prometheus通过与Kubernetes API集成主要支持5种服务发现模式:Node、Service、Pod、Endpoindts、Ingress。不同的服务发现模式适用于不同的场景,例如:node适用于与主机相关的监控资源,如节点中运行的kubernetes组件状态、节点上运行的容器状态等,service和ingress适用于通过黑盒监控场景,如对服务的可用性以及服务质量的监控;;endpoints和pod均可用于获取pod实例的监控数据,如监控用户或者管事员部署的支持Prometheus的应用

node

node角色可以发现集群中每个node节点的地址端口,默认为kubelete的HTTP端口。目标地址默认为Kubernetes节点对象的第一个现有地址,地址类型顺序为NodeInternalIPNodeExternalIPNodeLegacyHostIPNodeHostName

作用:监控K8S的node节点的服务器相关的指标数据。

可用标签:

__meta_kubernetes_node_name:	node节点的名称
__meta_kubernetes_node_label_<labelname>:	k8s中node节点的标签.<labelname>代表标签名称
__meta_kubernetes_node_labelpresent_<labelname>:	标签存在则为true.<labelname>代表标签名称
__meta_kubernetes_node_annotation_<annotationname>:	k8s中node节点的注解.<annotationname>代表注解名称
__meta_kubernetes_node_annotationpresent_<annotationname>:	注解存在则为true.<annotationname>代表注解名称
__meta_kubernetes_node_address_<address_type>:			不同类型的node节点地址,例如:
							_meta_kubernetes_node_address_Hostname="test-k8s-node1"
							_meta_kubernetes_node_address_InternalIP="10.0.0.11"
instance:	从apiserver获取到的节点名称

service

service角色可以发现每个service的ip和port,将其作为target。这对于黑盒监控(blackbox)很有用。

即:一个Service访问到哪个pod,就把哪个pod的数据传上来。使用的场景很少。只是看Service对应业务是否健康的时候可以使用。

可用标签

__meta_kubernetes_namespace:				service所在的命名空间
__meta_kubernetes_service_annotation_<annotationname>: 	k8s中service的注解
__meta_kubernetes_service_annotationpresent_<annotationname>: 	注解存在则为true
__meta_kubernetes_service_cluster_ip: 		k8s中service的clusterIP
__meta_kubernetes_service_external_name: 	k8s中service的external_name
__meta_kubernetes_service_label_<labelname>: 	k8s中service的标签
__meta_kubernetes_service_labelpresent_<labelname>: 	标签存在则为true
__meta_kubernetes_service_name: 		k8s中service的名称
__meta_kubernetes_service_port_name:		k8s中service的端口
__meta_kubernetes_service_port_protocol: 	k8s中service的端口协议
__meta_kubernetes_service_type: 		k8s中service的类型

pod

pod角色可以发现所有pod并将其中的pod ip作为target。如果有多个端口或者多个容器,将生成多个target(例如:80,443这两个端口,pod ip为10.0.244.22,则将10.0.244.22:80,10.0.244.22:443分别作为抓取的target)。
如果容器没有指定的端口,则会为每个容器创建一个无端口target,以便通过relabel手动添加端口。

可用标签:

__meta_kubernetes_namespace: 		pod所在的命名空间
__meta_kubernetes_pod_name: 		pod的名称
__meta_kubernetes_pod_ip: 		pod的ip
__meta_kubernetes_pod_label_<labelname>: 		pod的标签
__meta_kubernetes_pod_labelpresent_<labelname>: 	标签存在则为true
__meta_kubernetes_pod_annotation_<annotationname>: 	pod的注解
__meta_kubernetes_pod_annotationpresent_<annotationname>: 	注解存在则为true
__meta_kubernetes_pod_container_init: 			如果容器是InitContainer,则为true
__meta_kubernetes_pod_container_name: 			容器的名称
__meta_kubernetes_pod_container_port_name: 		容器的端口名称
__meta_kubernetes_pod_container_port_number: 		容器的端口号
__meta_kubernetes_pod_container_port_protocol: 		容器的端口协议
__meta_kubernetes_pod_ready: 				pod的就绪状态,true或false。
__meta_kubernetes_pod_phase: 			pod的生命周期状态.Pending, Running, Succeeded, Failed or Unknown
__meta_kubernetes_pod_node_name: 		pod所在node节点名称
__meta_kubernetes_pod_host_ip: 			pod所在node节点ip
__meta_kubernetes_pod_uid: 			pod的uid
__meta_kubernetes_pod_controller_kind: 		pod控制器的类型ReplicaSet ,DaemonSet,Job,StatefulSet...
__meta_kubernetes_pod_controller_name: 		pod控制器的名称

Endpoints

endpoints角色可以从ep(endpoints)列表中发现所有targets

可用标签:

__meta_kubernetes_namespace: 		ep对象所在的命名空间
__meta_kubernetes_endpoints_name: 	ep的名称
 
直接从ep对象的列表中获取的所有target,下面的标签将会被附加上
	__meta_kubernetes_endpoint_hostname: 	ep的主机名
	__meta_kubernetes_endpoint_node_name: 	ep的node节点名
	__meta_kubernetes_endpoint_ready: 	ep的就绪状态,true或false。
	__meta_kubernetes_endpoint_port_name: 	ep的端口名称
	__meta_kubernetes_endpoint_port_protocol: 	ep的端口协议
	__meta_kubernetes_endpoint_address_target_kind: ep对象的目标类型,比如Pod
	__meta_kubernetes_endpoint_address_target_name: ep对象的目标名称,比如pod名称
如果ep是属于service的话,则会附加service角色的所有标签
对于ep的后端节点是pod,则会附加pod角色的所有标签(即上边介绍的pod角色可用标签)
如手动创建一个ep,这个ep关联到一个pod,则prometheus的标签中会包含这个pod角色的所有标签

Ingress

ingress角色发现ingress的每个路径的target。这通常对黑盒监控很有用。该地址将设置为ingress中指定的host。

可用标签:

__meta_kubernetes_namespace: 			ingress所在的命名空间
__meta_kubernetes_ingress_name: 		ingress的名称
__meta_kubernetes_ingress_label_<labelname>: 	ingress的标签
__meta_kubernetes_ingress_labelpresent_<labelname>: 		标签存在则为true
__meta_kubernetes_ingress_annotation_<annotationname>: 		ingress的注解
__meta_kubernetes_ingress_annotationpresent_<annotationname>: 	注解存在则为true
__meta_kubernetes_ingress_scheme: 		ingress的协议,如果设置了tls则是https,默认http
__meta_kubernetes_ingress_path: 		ingress中指定的的路径。默认为/

示例

发现并监控prometheus命名空间下所有Service对应的所有pod的metrics数据

...
- job_name: prometheus-monitor
  honor_timestamps: true
  scrape_interval: 1m
  scrape_timeout: 10s
  metrics_path: /metrics
  scheme: http
  kubernetes_sd_configs:
  - role: endpoints
    namespaces:
      names:
      - prometheus
  relabel_configs:
  - source_labels: [__meta_kubernetes_service_name]
    separator: ;
    regex: prometheus-headless
    replacement: $1
    action: keep
  - source_labels: [__meta_kubernetes_pod_container_name]
    separator: ;
    regex: prometheus
    replacement: $1
    action: keep
  - source_labels: [__meta_kubernetes_namespace]
    separator: ;
    regex: (.*)
    target_label: namespace
    replacement: $1
    action: replace

发现流程:找命名空间为prometheus下的所有Service(Service注册在DNS上会暴露端口,因此不用考虑端口),然后Service由于包含了endpoints列表,因此可以找到所有的pod+port,再根据metrics_path可以拼接成http://pod+port/metrics,进而监控了所有pod的监控指标

role是endpoints:此配置说明是通过Service找Pod

5.2 apiserver服务发现

apiserver作为kubernetes最核心的组件,它的监控也是非常有必要的,对于apiserver的监控,可以直接通过kubernetes的service来获取。

5.2.1 创建RBAC规则
apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: monitoring
 
---
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
  name: monitoring-token
  namespace: monitoring
  annotations:
    kubernetes.io/service-account.name: "prometheus"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups:
  - ""
  resources:
  - nodes
  - services
  - endpoints
  - pods
  - nodes/proxy
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - "extensions"
  resources:
    - ingresses
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - configmaps
  - nodes/metrics
  verbs:
  - get
- nonResourceURLs:
  - /metrics
  verbs:
  - get
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus
  namespace: monitoring

查看

5.2.2准备文件
  • token
# 生成token
kubectl describe secrets monitoring-token -n monitoring|grep "token:"|awk '{print $2}' > k8s.token
 
# 复制文件至prometheus server服务器上,需提前在prometheus server上创建目录mkdir -p /apps/certs
scp k8s.token 192.168.44.23:/apps/certs/
  • TLS证书
# 复制k8s上ca.pem(或ca.crt)文件至prometheus server服务器上
[root@prometheus-server1 ~]#scp 192.168.44.23:/etc/kubernetes/ssl/ca.pem /apps/certs
5.2.3 编写配置
  • prometheus server部署在k8s集群内
- job_name: "kubernetes-apiserver"
  scheme: https
  kubernetes_sd_configs:
  - role: endpoints
  tls_config:		# 配置https方式,需要tls证书
    ca_file: /apps/certs/ca.pem
  bearer_token_file: /apps/certs/k8s.token
  relabel_configs:
  - source_labels: [__meta_kubernetes_namespace,__meta_kubernetes_service_name,__meta_kubernetes_endpoint_port_name]
    regex: default;kubernets;https
    action: keep
  • prometheus server部署在k8s集群外
  - job_name: 'kubernetes-apiservers-monitor'
    kubernetes_sd_configs:
    - role: endpoints
      api_server: https://192.168.44.12:6443 # k8s master VIP
      tls_config:
        ca_file: /apps/certs/ca.pem
      bearer_token_file: /apps/certs/k8s.token
    scheme: https
    tls_config:
      ca_file: /apps/certs/ca.pem
    bearer_token_file: /apps/certs/k8s.token
    relabel_configs:
    - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
      action: keep
      regex: default;kubernetes;https

匹配说明:

含义为匹配namespace为default,svc名称为kubernetes并且协议是https,匹配成功后进行保留,并且把regex作为source_labels相对应的值。即labels为key,regex为值。

5.2.4验证apiserver服务发现

查看apiserver信息

root@k8s-master1:/etc/kubernetes/ssl# kubectl get ep
NAME                          ENDPOINTS            AGE
kubernetes                    192.168.44.12:6443   182d
myserver-myapp-service-name   <none>               156d
ng-deploy-20                  <none>               163d
ng-deploy-20-nodeport         <none>               163d

5.2.5 apiserver指标数据

APIserver组件是k8s集群的入口,所有请求都是从apiserver进来的,所以对apiserver指标做监控可以用来判断集群的健康状况。

apiserver_request_total
sum(rate(apiserver_request_total[10m])) by (resources,subresource,verb)

替换标签

  - job_name: 'kubernetes-service-endpoints'	# job名称
    kubernetes_sd_configs:
    - role: endpoints				# endpoints发现
      api_server: https://10.0.0.10:6443
      tls_config:
        ca_file: /apps/certs/ca.pem
      bearer_token_file: /apps/certs/k8s.token
    scheme: https
    tls_config:
      ca_file: /apps/certs/ca.pem
    bearer_token_file: /apps/certs/k8s.token
    relabel_configs: 				# 标签重写配置
    # 保留标签然后再向下执行
    - source_labels: [__meta_kubernetes_namespace,__meta_kubernetes_service_name,__meta_kubernetes_endpoint_port_name]
      action: keep
      regex: default;kubernetes;https
 
    # 将__meta_kubernetes_namespace修改为kubernetes_namespace
    - source_labels: [__meta_kubernetes_namespace]
      action: replace
      target_label: kubernetes_namespace

替换之前

替换之后

__meta_kubernetes_namespace标签替换为kubernetes_namespace

annotation_prometheus_io_scrape

在k8s中,基于prometheus的发现规则,需要在被发现的目的target定义注解匹配

annotation_prometheus_io_scrape=true,且必须匹配成功该注解才会保留监控target,然后再进行数据抓取并进行标签替换,如annotation_prometheus_io_scheme标签为http或https:

  - job_name: 'kubernetes-test'	# job名称
    kubernetes_sd_configs:
    - role: endpoints				# endpoints发现
      api_server: https://192.168.44.12:6443
      tls_config:
        ca_file: /apps/certs/ca.pem
      bearer_token_file: /apps/certs/k8s.token
    scheme: https
    tls_config:
      ca_file: /apps/certs/ca.pem
    bearer_token_file: /apps/certs/k8s.token
    relabel_configs: 				# 标签重写配置
    # 将annotation_prometheus_io_scrape的值为true,保留标签然后再向下执行
    - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
      action: keep
      regex: true
 
    # 将annotation_prometheus_io_scheme修改为__scheme__
    - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
      action: replace
      target_label: __scheme__
      regex: (https?) 	# 正则匹配http或https协议,其他协议不替换
 
    - source_labels: [__scheme__]
      action: replace
      target_label: __scheme__
      regex: https
      replacement: http
 
    # 将annotation_prometheus_io_path替换为__metrics_path__
    - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
      action: replace
      target_label: __metrics_path
      regex: (.+)	#路径为1到任意长度(.表示\n之外的任意单个字符,+表示一次或多次)
 
    # 地址发现即标签重写
    - source_labels: [__address__,__meta_kubernetes_service_annotation_prometheus_io_port]
      action: replace
      target_label: __address__
      regex: ([^:]+)(?::\d+)?;(\d+) 
      replacement: $1:$2 	# 格式为地址:端口
 
    # 匹配regex所匹配的标签,然后进行应用
    - action: labelmap
      regex: __meta_kubernetes_service_label_(.+)	#通过正则匹配名称

image-20230606214526108

5.3 coredns服务发现

5.3.1 编写配置
  - job_name: 'kubernetes-service-endpoints'
    kubernetes_sd_configs:
    - role: endpoints
      api_server: https://10.0.0.10:6443 # k8s master VIP
      tls_config:
        ca_file: /apps/certs/ca.pem
      bearer_token_file: /apps/certs/k8s.token
    scheme: https
    tls_config:
      ca_file: /apps/certs/ca.pem
    bearer_token_file: /apps/certs/k8s.token
    relabel_configs:
    - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
      action: keep
      regex: true
 
    - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
      action: replace
      target_label: __scheme__
      regex: (https?)
 
    - source_labels: [__scheme__]
      action: replace
      target_label: __scheme__
      regex: https
      replacement: http
 
    - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
      action: replace
      target_label: __metrics_path__
      regex: (.+)
 
    - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
      action: replace
      target_label: __address__
      regex: ([^:]+)(?::\d+)?;(\d+)
      replacement: $1:$2
 
    - action: labelmap
      regex: __meta_kubernetes_service_label_(.+)
 
    - source_labels: [__meta_kubernetes_namespace]
      action: replace
      target_label: kubernetes_namespace
 
    - source_labels: [__meta_kubernetes_service_name]
      action: replace
      target_label: kubernetes_service_name
5.3.2 查看core-dns状态
root@k8s-master1:~# kubectl describe svc kube-dns -n kube-system 
Name:              kube-dns
Namespace:         kube-system
Labels:            addonmanager.kubernetes.io/mode=Reconcile
                   k8s-app=kube-dns
                   kubernetes.io/cluster-service=true
                   kubernetes.io/name=CoreDNS
Annotations:       prometheus.io/port: 9153
                   prometheus.io/scrape: true
Selector:          k8s-app=kube-dns
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.68.0.2
IPs:               10.68.0.2
Port:              dns  53/UDP
TargetPort:        53/UDP
Endpoints:         172.20.37.213:53
Port:              dns-tcp  53/TCP
TargetPort:        53/TCP
Endpoints:         172.20.37.213:53
Port:              metrics  9153/TCP
TargetPort:        9153/TCP
Endpoints:         172.20.37.213:9153
Session Affinity:  None
Events:            <none>

5.3.3 验证服务发现

修改deployment控制器的副本数,让endpoint数量发生变化,验证自动发现新添加的pod

root@k8s-master1:~# kubectl get deploy -n kube-system 
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
calico-kube-controllers   1/1     1            1           181d
coredns                   1/1     1            1           178d
metrics-server            1/1     1            1           86d

kubectl scale deployment coredns --replicas=2 -n kube-system

root@k8s-master1:~# kubectl get deployments.apps -n kube-system 
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
calico-kube-controllers   1/1     1            1           181d
coredns                   2/2     2            2           178d
metrics-server            1/1     1            1           86d


5.3.4 grafana展示监控

模板:14981

posted @   老男人学IT  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示