1. 程式人生 > 實用技巧 >第三篇 kubernetes使用Operator部署Prometheus監控

第三篇 kubernetes使用Operator部署Prometheus監控

1.什麼是Operator

Operator是由CoreOS開發的,用來擴充套件Kubernetes API,特定的應用程式控制器,它用來建立、配置和管理複雜的有狀態應用,如資料庫、快取和監控系統。Operator基於Kubernetes的資源和控制器概念之上構建,但同時又包含了應用程式特定的領域知識。建立Operator的關鍵是CRD(自定義資源)的設計。

Operator是將運維人員對軟體操作的知識給程式碼化,同時利用 Kubernetes 強大的抽象來管理大規模的軟體應用。目前CoreOS官方提供了幾種Operator的實現,其中就包括我們今天的主角:Prometheus Operator,Operator的核心實現就是基於 Kubernetes 的以下兩個概念:

資源:物件的狀態定義
控制器:觀測、分析和行動,以調節資源的分佈
當前CoreOS提供的以下四種Operator:
(1)  etcd:建立etcd叢集
(2)  Rook:雲原生環境下的檔案、塊、物件儲存服務
(3)  Prometheus:建立Prometheus監控例項
(4) Tectonic:部署Kubernetes叢集
接下來我們將使用Operator建立Prometheus。

2. 開始部署prometheus

我們這裡直接通過 Prometheus-Operator 的原始碼來進行安裝,當然也可以用 Helm 來進行一鍵安裝,我們採用原始碼安裝可以去了解更多的實現細節。首頁將原始碼 Clone 下來:
#yum install git -y 
#mkdir /root/k8s/prometheus/
#git clone https://github.com/coreos/prometheus-operator     ### 0.30.0版本之前
#git clone https://github.com/coreos/kube-prometheus         ### 0.30.0版本之後
#cd kube-prometheus/manifests

#進入到 manifests 目錄下面,這個目錄下面包含我們所有的資源清單檔案,直接在該資料夾下面執行建立資源命令即可:

#kubectl create -f setup/
#kubectl create -f .
部署完成後,會建立一個名為monitoring的 namespace,所有資源物件對將部署在該名稱空間下面,此外 Operator 會自動建立4個 CRD 資源物件:
# kubectl get crd |grep coreos

![](https://img2020.cnblogs.com/blog/2104126/202012/2104126-20201201115651160-597616715.png)

可以在 monitoring 名稱空間下面檢視所有的 Pod,其中 alertmanager 和 prometheus 是用 StatefulSet 控制器管理的,其中還有一個比較核心的 prometheus-operator 的 Pod,用來控制其他資源物件和監聽物件變化的:
等待所有pod變成Running 大致用了 7分鐘。
# kubectl  get pod -n monitoring

檢視建立的 Service:

可以看到上面針對 grafana 和 prometheus 都建立了一個型別為 ClusterIP 的 Service。
當然如果我們想要在外網訪問這兩個服務的話可以通過建立對應的 Ingress 物件或者使用 NodePort 型別的 Service。
我們這裡為了簡單,直接使用 NodePort 型別的服務即可,編輯 grafana 和 prometheus-k8s 這兩個 Service,將服務型別更改為 NodePort:
#kubectl edit svc prometheus-k8s -n monitoring
type: ClusterIP  修改為   type: NodePort

 瀏覽器訪問如下兩個地址:
grafana:   http://192.168.25.65:30072/
prometheus:    http://192.168.25.65:32424/


grafana  的 面板可以從官網上下載進行匯入,當然預設部署的也會自帶一些常用的面板。
官網地址: https://grafana.com/grafana/dashboards

3. 修改prometheus配置使targets生效

在prometheus 的 tagets 中我們可以看到大部分的配置都是正常的,只有兩三個沒有管理到對應的監控目標,比如 kube-controller-manager 和 kube-scheduler 這兩個系統元件,這就和 ServiceMonitor 的定義有關係了。

我們通過selector.matchLabels在 kube-system 這個名稱空間下面匹配具有k8s-app=kube-scheduler這樣的 Service,但是我們系統中根本就沒有對應的 Service,所以我們需要手動建立一個 Service:(prometheus-kubeSchedulerService.yaml)
#vi  prometheus-kubeSchedulerService.yaml
apiVersion: v1
kind: Service
metadata:
  namespace: kube-system
  name: kube-scheduler
  labels:
    k8s-app: kube-scheduler
spec:
  selector:
    component: kube-scheduler
  ports:
  - name: http-metrics
    port: 10251
    targetPort: 10251
    protocol: TCP


#kubectl create -f prometheus-kubeSchedulerService.yaml
#kubectl get svc -n kube-system -l k8s-app=kube-scheduler
NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)     AGE
kube-scheduler   ClusterIP   10.1.53.61   <none>        10251/TCP   9s

我們可以看到現在已經發現了 target,但是抓取資料結果出錯了,這個錯誤是因為我們叢集是使用 kubeadm 搭建的,其中 kube-scheduler 預設是繫結在127.0.0.1上面的,而上面我們這個地方是想通過節點的 IP 去訪問,所以訪問被拒絕了,我們只要把 kube-scheduler 繫結的地址更改成0.0.0.0即可滿足要求,由於 kube-scheduler 是以靜態 Pod 的形式執行在叢集中的,所以我們只需要更改靜態 Pod 目錄下面對應的 YAML (kube-scheduler.yaml)檔案即可:
# cd /etc/kubernetes/manifests
將 kube-scheduler.yaml 檔案中-command的--address地址更改成0.0.0.0
# vi kube-scheduler.yaml
--address地址更改成0.0.0.0

同上 kube-controller-manager  的修改方式一樣:
#vi  prometheus-kubecontrollermanagerService.yaml
apiVersion: v1
kind: Service
metadata:
  namespace: kube-system
  name: kube-controller-manager
  labels:
    k8s-app: kube-controller-manager
spec:
  selector:
    component: kube-controller-manager
  ports:
  - name: http-metrics
    port: 10252
    targetPort: 10252
    protocol: TCP

#kubectl  create -f prometheus-kubecontrollermanagerService.yaml


將 /etc/kubernetes/manifests/kube-controller-manager.yaml  檔案中-command的--address地址更改成0.0.0.0
# vi  /etc/kubernetes/manifests/kube-controller-manager.yaml
-command的--address地址更改成0.0.0.0

等待一短時間後重新整理在看,就會獲取到target 了。

4.給grafana配置webhook報警

這裡為了實驗方便 我們使用grafana 的alert 告警來配置模擬告警的情況。
首先從grafana 官網上查詢可直接用於設定告警的面板https://grafana.com/grafana/dashboards/5984  進行匯入

隨後參考如下配置:




然後就可以在grafana面板上收到告警資訊了。

本篇到此就結束了,後續更新可能需要放慢速度了,太累了。。。。。