第三篇 kubernetes使用Operator部署Prometheus監控
阿新 • • 發佈:2020-12-02
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面板上收到告警資訊了。
本篇到此就結束了,後續更新可能需要放慢速度了,太累了。。。。。