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

可以在 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面板上收到告警信息了。
本篇到此就結束了,后續更新可能需要放慢速度了,太累了。。。。。