prometheus.(2).添加監控插件以及配置


添加監控配置

作者聲明:本博客內容是作者在學習以及搭建過程中積累的內容,內容采自網絡中各位老師的優秀博客以及視頻,並根據作者本人的理解加以修改(由於工作以及學習中東拼西湊,如果造成無法提供原鏈接,在此抱歉!!!)

作者再次聲明:作者只是一個很摳腳的IT工作者,希望可以跟那些提供原創的老師們學習

一.node_exporter監控集群節點

通過prometheus來采集節點的監控指標,可以通過node_exporter獲取,node_exporter就是抓取用於采集服務器節點的各種運行指標,目前node_exporter幾乎支持所有常見的監控點,比如cpu、distats、loadavg、meminfo、netstat等,詳細的監控列表可以參考github repo

這里使用DeamonSet控制器來部署該服務,這樣每一個節點都會運行一個Pod,如果我們從集群中刪除或添加節點后,也會進行自動擴展

1.node-exporter.yaml

# cat >>prometheus-node-exporter.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: kube-system
  labels:
    name: node-exporter
spec:
  selector:
    matchLabels:
      name: node-exporter
  template:
    metadata:
      labels:
        name: node-exporter
    spec:
      hostPID: true
      hostIPC: true
      hostNetwork: true
      containers:
      - name: node-exporter
        image: prom/node-exporter:v0.16.0
        ports:
        - containerPort: 9100
        resources:
          requests:
            cpu: 0.15
        securityContext:
          privileged: true
        args:
        - --path.procfs
        - /host/proc
        - --path.sysfs
        - /host/sys
        - --collector.filesystem.ignored-mount-points
        - '"^/(sys|proc|dev|host|etc)($|/)"'
        volumeMounts:
        - name: dev
          mountPath: /host/dev
        - name: proc
          mountPath: /host/proc
        - name: sys
          mountPath: /host/sys
        - name: rootfs
          mountPath: /rootfs
      tolerations:
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"
      volumes:
        - name: proc
          hostPath:
            path: /proc
        - name: dev
          hostPath:
            path: /dev
        - name: sys
          hostPath:
            path: /sys
        - name: rootfs
          hostPath:
            path: /
#EOF

2.查看DaemonSet字段

kubectl explain DaemonSet
kubectl explain DaemonSet --recursive (列出所有字段)

3.啟動

kubectl create -f prometheus-node-exporter.yaml
kubectl get pod -n kube-system -o wide|grep node

4.node-exporter.yaml文件說明

4.1 Pod的安全策略

由於我們要獲取的數據是主機的監控指標數據,而我們的node-exporter是運行在容器中的,所以我們在Pod中需要配置一些Pod的安全策略

hostPID:true
hostIPC:true
hostNetwork:true
#這三個配置主要用於主機的PID namespace、IPC namespace以及主機網絡,這里需要注意的是namespace是用於容器隔離的關鍵技術,這里的namespace和集群中的namespace是兩個完全不同的概念

4.2 監控master節點

另外我們還需要將主機/dev、/proc、/sys這些目錄掛在到容器中,這些因為我們采集的很多節點數據都是通過這些文件來獲取系統信息

比如我們在執行top命令可以查看當前cpu使用情況,數據就來源於/proc/stat,使用free命令可以查看當前內存使用情況,其數據來源是/proc/meminfo文件

另外如果是使用kubeadm搭建的,同時需要監控master節點的,則需要添加下方的相應容忍

  - key: "node-role.kubernetes.io/master"
    operator: "Exists"
    effect: "NoSchedule

4.3 啟動參數

node-exporter容器相關啟動參數

    args:
    - --path.procfs     #配置掛載宿主機(node節點)的路徑
    - /host/proc
    - --path.sysfs      #配置掛載宿主機(node節點)的路徑
    - /host/sys
    - --collector.filesystem.ignored-mount-points
    - '"^/(sys|proc|dev|host|etc)($|/)"'

4.4 映射端口

在我們的yaml文件中加入了hostNetwork:true會直接將我們的宿主機的9100端口映射出來,從而不需要創建service 在我們的宿主機上就會有一個9100的端口

容器的9100--->映射到宿主機9100

  hostNetwork: true
  containers:
  - name: node-exporter
    image: prom/node-exporter:v0.16.0
    ports:
    - containerPort: 9100

二.添加監控

1.node監控

我們這里三個節點都運行了node-exporter程序,如果我們通過一個Server來將數據收集在一起,用靜態的方式配置到prometheus就會顯示一條數據,我們得自己在指標中過濾每個節點的數據,配置比較麻煩。 這里就采用服務發現

在Kubernetes下,Prometheus通過Kubernetes API基礎,目前主要支持5種服務發現,分別是node、Server、Pod、Endpoints、Ingress

需要我們在Prometheus配置文件中,添加如下三行

    - job_name: 'kubernetes-node'
          kubernetes_sd_configs:
          - role: node
          #通過制定Kubernetes_sd_config的模式為node,prometheus就會自動從Kubernetes中發現所有的node節點並作為當前job監控的目標實例,發現的節點/metrics接口是默認的kubelet的HTTP接口

熱更新:

kubectl delete -f prometheus.configmap.yaml
kubectl create -f prometheus.configmap.yaml
curl -X POST http://10.111.194.39:9090/-/reload

2.容器監控

cAdvisor是一個容器資源監控工具,包括容器的內存,CPU,網絡IO,資源IO等資源,同時提供了一個Web頁面用於查看容器的實時運行狀態。

cAvisor已經內置在了kubelet組件之中,所以我們不需要單獨去安裝,cAdvisor的數據路徑為/api/v1/nodes//proxy/metrics

action 使用labelkeep或者labeldrop則可以對Target標簽進行過濾,僅保留符合過濾條件的標簽

    - job_name: 'kubernetes-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

tls_config配置的證書地址是每個Pod連接apiserver所使用的地址,基本上寫死了。並且我們在配置文件添加了一個labelmap標簽。在最下面使用了一個正則替換了cAdvisor的一個metrics地址

  • 證書是我們Pod啟動的時候kubelet給pod注入的一個證書,所有的pod啟動的時候都會有一個ca證書注入進來
  • 如要想要訪問apiserver的信息,還需要配置一個token_file
kubectl delete -f prometheus.configmap.yaml
kubectl create -f prometheus.configmap.yaml
curl -X POST http://10.111.194.39:9090/-/reload

3.Api-Service 監控

apiserver作為Kubernetes最核心的組件,它的監控也是非常有必要的,對於apiserver的監控,我們可以直接通過kubernetes的service來獲取

[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP             61d
nginx        NodePort    10.100.167.29   <none>        80:30002/TCP        44d
redis        ClusterIP   10.96.123.59    <none>        6379/TCP,9121/TCP   2d

上面的service是我們集群的apiserver內部的service的地址,要自動發現service類型的服務,需要使用role為Endpoints的kubernetes_sd_configs (自動發現),我們只需要在configmap里面在添加Endpoints類型的服務發現

   - job_name: 'kubernetes-apiserver'
     kubernetes_sd_configs:
     - role: endpoints

這里我們使用keep動作,將符合配置的保留下來,例如我們過濾default命名空間下服務名稱為kubernetes的元數據,這里可以根據__meta_kubernetes_namespace和__mate_kubertnetes_service_name2個元數據進行relabel

 - job_name: 'kubernetes-apiservers'
      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

參數解釋:
action: keep #保留哪些標簽
regex: default;kubernetes;https #匹配namespace下的default命名空間下的kubernetes service 最后https協議
可以通過kubectl describe svc kubernetes查看到

最后熱更新

4.Service 監控

apiserver實際上是一種特殊的Service,現在配置一個專門發現普通類型的Service

這里我們對service進行過濾,只有在service配置了prometheus.io/scrape: "true"過濾出來

4.1 添加service監控

    - 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_name

然后新更新

kubectl delete -f prometheus.configmap.yaml
kubectl create -f prometheus.configmap.yaml
curl -X POST http://10.111.194.39:9090/-/reload

Serivce自動發現參數說明 (並不是所有創建的service都可以被prometheus發現)

#1.參數解釋
relabel_configs:
-source_labels:[__meta_kubernetes_service_annotation_prometheus_io_scrape]
action: keep 
regex: true  保留標簽
source_labels: [__meta_kubernetes_service_annotation_prometheus_io_cheme]

這行配置代表我們只去篩選有__meta_kubernetes_service_annotation_prometheus_io_scrape的service,只有添加了這個聲明才可以自動發現其他service

#2.參數解釋
  - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
    action: replace
    target_label: __address__
    regex: ([^:]+)(?::\d+)?;(\d+)
    replacement: $1:$2
#指定一個抓取的端口,有的service可能有多個端口(比如之前的redis)。默認使用的是我們添加是使用kubernetes_service端口

#3.參數解釋
  - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
    action: replace
    target_label: __scheme__
    regex: (https?)
#這里如果是https證書類型,我們還需要在添加證書和token

4.2 service添加prometheus標簽

我們可以看到這里的服務的core DNS,為什么那么多service只有coreDNS可以被收集到呢?

  • core DNS serviceYaml 文件包含true參數,所以會被匹配到

5.kube-state-metrics

kube-state-metrics是一個簡單的服務,它監聽Kubernetes API服務器並生成相關指標數據,它不單關注單個Kubernetes組件的運行情況,而是關注內部各種對象的運行狀況

在K8s集群上Pod、DaemonSet、Deployment、Job、CronJob等各種資源對象的狀態也需要監控,這些指標主要來自於apiserver和kubelet中集成的cAvisor,但是並沒有具體的各種資源對象的狀態指標。對於Prometheus來說,當然是需要引入新的exporter來暴露這些指標,Kubernetes提供了一個kube-state-metrics

  • kube-state-metrics已經給出了在Kubernetes部署的文件,我們直接將代碼Clone到集群中執行yaml文件即可

將kube-state-metrics部署在kubernetes上之后,會發現kubernetes集群中的prometheus會在kube-state-metrics這個job下自動發現kube-state-metrics,並開始拉去metrics,這是因為部署kube-state-metrics的manifest定義文件kube-state-metrics-server.yaml對Service的定義包含prometheus.io/scrape: 'true'這樣的一個annotation。因此kube-state-metrics的endpoint可以被Prometheus自動發現

關於kube-state-metrics暴露所有監控指標可以參考kube-state-metrics的文檔kube-state-metrics Documentation(https://github.com/kubernetes/kube-state-metrics/tree/master/docs)

故障

因為修改Prometheus.config配置錯誤造成的

1586425164971


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM