第三篇 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面板上收到告警信息了。

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


免責聲明!

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



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