https://www.cnblogs.com/lvcisco/p/12575298.html
正文
注意:
Prometheus-operator 已經改名為 Kube-promethues
參考:
- https://www.liangzl.com/get-article-detail-126792.html
- https://blog.51cto.com/zgui2000/2388379
- http://www.gdjmqj.com/news/hulianwang/10721.html
系統參數:
- Prometheus Operator版本: 0.29 (Prometheus Operator更名為Kube-Prometheus,且版本變為:0.1.0)
- Kubernetes 版本: 1.14.0
- 項目 Github 地址: https://github.com/coreos/kube-prometheus
一、介紹
1、Kubernetes Operator 介紹
在 Kubernetes 的支持下,管理和伸縮 Web 應用、移動應用后端以及 API 服務都變得比較簡單了。其原因是這些應用一般都是無狀態的,所以 Deployment 這樣的基礎 Kubernetes API 對象就可以在無需附加操作的情況下,對應用進行伸縮和故障恢復了。
而對於數據庫、緩存或者監控系統等有狀態應用的管理,就是個挑戰了。這些系統需要應用領域的知識,來正確的進行伸縮和升級,當數據丟失或不可用的時候,要進行有效的重新配置。我們希望這些應用相關的運維技能可以編碼到軟件之中,從而借助 Kubernetes 的能力,正確的運行和管理復雜應用。
Operator 這種軟件,使用 TPR(第三方資源,現在已經升級為 CRD) 機制對 Kubernetes API 進行擴展,將特定應用的知識融入其中,讓用戶可以創建、配置和管理應用。和 Kubernetes 的內置資源一樣,Operator 操作的不是一個單實例應用,而是集群范圍內的多實例。
2、Prometheus Operator 介紹
Kubernetes 的 Prometheus Operator 為 Kubernetes 服務和 Prometheus 實例的部署和管理提供了簡單的監控定義。
安裝完畢后,Prometheus Operator提供了以下功能:
- 創建/毀壞: 在 Kubernetes namespace 中更容易啟動一個 Prometheus 實例,一個特定的應用程序或團隊更容易使用Operator。
- 簡單配置: 配置 Prometheus 的基礎東西,比如在 Kubernetes 的本地資源 versions, persistence, retention policies, 和 replicas。
- Target Services 通過標簽: 基於常見的Kubernetes label查詢,自動生成監控target 配置;不需要學習普羅米修斯特定的配置語言。
3、Prometheus Operator 系統架構圖
- Operator: Operator 資源會根據自定義資源(Custom Resource Definition / CRDs)來部署和管理 Prometheus Server,同時監控這些自定義資源事件的變化來做相應的處理,是整個系統的控制中心。
- Prometheus: Prometheus 資源是聲明性地描述 Prometheus 部署的期望狀態。
- Prometheus Server: Operator 根據自定義資源 Prometheus 類型中定義的內容而部署的 Prometheus Server 集群,這些自定義資源可以看作是用來管理 Prometheus Server 集群的 StatefulSets 資源。
- ServiceMonitor: ServiceMonitor 也是一個自定義資源,它描述了一組被 Prometheus 監控的 targets 列表。該資源通過 Labels 來選取對應的 Service Endpoint,讓 Prometheus Server 通過選取的 Service 來獲取 Metrics 信息。
- Service: Service 資源主要用來對應 Kubernetes 集群中的 Metrics Server Pod,來提供給 ServiceMonitor 選取讓 Prometheus Server 來獲取信息。簡單的說就是 Prometheus 監控的對象,例如 Node Exporter Service、Mysql Exporter Service 等等。
- Alertmanager: Alertmanager 也是一個自定義資源類型,由 Operator 根據資源描述內容來部署 Alertmanager 集群。
二、拉取 Prometheus Operator
先從 Github 上將源碼拉取下來,利用源碼項目已經寫好的 kubernetes 的 yaml 文件進行一系列集成鏡像的安裝,如 grafana、prometheus 等等。
從 GitHub 拉取 Prometheus Operator 源碼
$ wget https://github.com/coreos/kube-prometheus/archive/v0.1.0.tar.gz
解壓
$ tar -zxvf v0.1.0.tar.gz
三、進行文件分類
由於它的文件都存放在項目源碼的 manifests 文件夾下,所以需要進入其中進行啟動這些 kubernetes 應用 yaml 文件。又由於這些文件堆放在一起,不利於分類啟動,所以這里將它們分類。
進入源碼的 manifests 文件夾
$ cd kube-prometheus-0.1.0/manifests/
創建文件夾並且將 yaml 文件分類
# 創建文件夾 $ mkdir -p operator node-exporter alertmanager grafana kube-state-metrics prometheus serviceMonitor adapter # 移動 yaml 文件,進行分類到各個文件夾下 mv *-serviceMonitor* serviceMonitor/ mv 0prometheus-operator* operator/ mv grafana-* grafana/ mv kube-state-metrics-* kube-state-metrics/ mv alertmanager-* alertmanager/ mv node-exporter-* node-exporter/ mv prometheus-adapter* adapter/ mv prometheus-* prometheus/
基本目錄結構如下:
manifests/
├── 00namespace-namespace.yaml ├── adapter │ ├── prometheus-adapter-apiService.yaml │ ├── prometheus-adapter-clusterRoleAggregatedMetricsReader.yaml │ ├── prometheus-adapter-clusterRoleBindingDelegator.yaml │ ├── prometheus-adapter-clusterRoleBinding.yaml │ ├── prometheus-adapter-clusterRoleServerResources.yaml │ ├── prometheus-adapter-clusterRole.yaml │ ├── prometheus-adapter-configMap.yaml │ ├── prometheus-adapter-deployment.yaml │ ├── prometheus-adapter-roleBindingAuthReader.yaml │ ├── prometheus-adapter-serviceAccount.yaml │ └── prometheus-adapter-service.yaml ├── alertmanager │ ├── alertmanager-alertmanager.yaml │ ├── alertmanager-secret.yaml │ ├── alertmanager-serviceAccount.yaml │ └── alertmanager-service.yaml ├── grafana │ ├── grafana-dashboardDatasources.yaml │ ├── grafana-dashboardDefinitions.yaml │ ├── grafana-dashboardSources.yaml │ ├── grafana-deployment.yaml │ ├── grafana-serviceAccount.yaml │ └── grafana-service.yaml ├── kube-state-metrics │ ├── kube-state-metrics-clusterRoleBinding.yaml │ ├── kube-state-metrics-clusterRole.yaml │ ├── kube-state-metrics-deployment.yaml │ ├── kube-state-metrics-roleBinding.yaml │ ├── kube-state-metrics-role.yaml │ ├── kube-state-metrics-serviceAccount.yaml │ └── kube-state-metrics-service.yaml ├── node-exporter │ ├── node-exporter-clusterRoleBinding.yaml │ ├── node-exporter-clusterRole.yaml │ ├── node-exporter-daemonset.yaml │ ├── node-exporter-serviceAccount.yaml │ └── node-exporter-service.yaml ├── operator │ ├── 0prometheus-operator-0alertmanagerCustomResourceDefinition.yaml │ ├── 0prometheus-operator-0prometheusCustomResourceDefinition.yaml │ ├── 0prometheus-operator-0prometheusruleCustomResourceDefinition.yaml │ ├── 0prometheus-operator-0servicemonitorCustomResourceDefinition.yaml │ ├── 0prometheus-operator-clusterRoleBinding.yaml │ ├── 0prometheus-operator-clusterRole.yaml │ ├── 0prometheus-operator-deployment.yaml │ ├── 0prometheus-operator-serviceAccount.yaml │ └── 0prometheus-operator-service.yaml ├── prometheus │ ├── prometheus-clusterRoleBinding.yaml │ ├── prometheus-clusterRole.yaml │ ├── prometheus-prometheus.yaml │ ├── prometheus-roleBindingConfig.yaml │ ├── prometheus-roleBindingSpecificNamespaces.yaml │ ├── prometheus-roleConfig.yaml │ ├── prometheus-roleSpecificNamespaces.yaml │ ├── prometheus-rules.yaml │ ├── prometheus-serviceAccount.yaml │ └── prometheus-service.yaml └── serviceMonitor ├── 0prometheus-operator-serviceMonitor.yaml ├── alertmanager-serviceMonitor.yaml ├── grafana-serviceMonitor.yaml ├── kube-state-metrics-serviceMonitor.yaml ├── node-exporter-serviceMonitor.yaml ├── prometheus-serviceMonitorApiserver.yaml ├── prometheus-serviceMonitorCoreDNS.yaml ├── prometheus-serviceMonitorKubeControllerManager.yaml ├── prometheus-serviceMonitorKubelet.yaml ├── prometheus-serviceMonitorKubeScheduler.yaml └── prometheus-serviceMonitor.yaml
四、修改源碼 yaml 文件
由於這些 yaml 文件中設置的應用鏡像國內無法拉取下來,所以修改源碼中的這些 yaml 的鏡像設置,替換鏡像地址方便拉取安裝。再之后因為需要將 Grafana & Prometheus 通過 NodePort 方式暴露出去,所以也需要修改這兩個應用的 service 文件。
1、修改鏡像
(1)、修改 operator
修改 0prometheus-operator-deployment.yaml
$ vim operator/0prometheus-operator-deployment.yaml
改成如下:
...... containers: - args: - --kubelet-service=kube-system/kubelet - --logtostderr=true - --config-reloader-image=quay-mirror.qiniu.com/coreos/configmap-reload:v0.0.1 #修改鏡像 - --prometheus-config-reloader=quay-mirror.qiniu.com/coreos/prometheus-config-reloader:v0.29.0 #修改鏡像 image: quay-mirror.qiniu.com/coreos/prometheus-operator:v0.29.0 #修改鏡像 ......
(2)、修改 adapter
修改 prometheus-adapter-deployment.yaml
$ vim adapter/prometheus-adapter-deployment.yaml
改成如下:
...... containers: - args: - --cert-dir=/var/run/serving-cert - --config=/etc/adapter/config.yaml - --logtostderr=true - --metrics-relist-interval=1m - --prometheus-url=http://prometheus-k8s.monitoring.svc:9090/ - --secure-port=6443 image: quay-mirror.qiniu.com/coreos/k8s-prometheus-adapter-amd64:v0.4.1 #修改鏡像 name: prometheus-adapter ......
(3)、修改 alertmanager
修改 alertmanager-alertmanager.yaml
$ vim alertmanager/alertmanager-alertmanager.yaml
改成如下:
...... spec: baseImage: quay-mirror.qiniu.com/prometheus/alertmanager #修改鏡像 nodeSelector: beta.kubernetes.io/os: linux replicas: 3 securityContext: fsGroup: 2000 runAsNonRoot: true runAsUser: 1000 serviceAccountName: alertmanager-main version: v0.17.0
(4)、修改 node-exporter
修改 node-exporter-daemonset.yaml
$ vim node-exporter/node-exporter-daemonset.yaml
改成如下:
...... containers: - args: - --web.listen-address=127.0.0.1:9100 image: quay-mirror.qiniu.com/prometheus/node-exporter:v0.17.0 #修改鏡像 ...... - args: - --logtostderr - --upstream=http://127.0.0.1:9100/ image: quay-mirror.qiniu.com/coreos/kube-rbac-proxy:v0.4.1 #修改鏡像 ......
(5)、修改 kube-state-metrics
修改 kube-state-metrics-deployment.yaml 文件
$ vim kube-state-metrics/kube-state-metrics-deployment.yaml
改成如下:
...... containers: - args: - --logtostderr - --secure-listen-address=:8443 - --tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - --upstream=http://127.0.0.1:8081/ image: quay-mirror.qiniu.com/coreos/kube-rbac-proxy:v0.4.1 #修改鏡像 name: kube-rbac-proxy-main - args: - --logtostderr - --secure-listen-address=:9443 - --tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - --upstream=http://127.0.0.1:8082/ image: quay-mirror.qiniu.com/coreos/kube-rbac-proxy:v0.4.1 #修改鏡像 name: kube-rbac-proxy-self - args: - --host=127.0.0.1 - --port=8081 - --telemetry-host=127.0.0.1 - --telemetry-port=8082 image: quay-mirror.qiniu.com/coreos/kube-state-metrics:v1.5.0 #修改鏡像 name: kube-state-metrics - command: - /pod_nanny - --container=kube-state-metrics - --deployment=kube-state-metrics - name: MY_POD_NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace image: registry.aliyuncs.com/google_containers/addon-resizer:1.8.4 #修改鏡像 name: addon-resizer ......
(6)、修改 node-exporter
修改 node-exporter-daemonset.yaml 文件
$ vim prometheus/prometheus-prometheus.yaml
改成如下:
...... spec: alerting: alertmanagers: - name: alertmanager-main namespace: monitoring port: web baseImage: quay-mirror.qiniu.com/prometheus/prometheus #修改鏡像 nodeSelector: beta.kubernetes.io/os: linux replicas: 2 resources: requests: memory: 400Mi ruleSelector: matchLabels: prometheus: k8s role: alert-rules securityContext: fsGroup: 2000 runAsNonRoot: true runAsUser: 1000 serviceAccountName: prometheus-k8s serviceMonitorNamespaceSelector: {} serviceMonitorSelector: {} version: v2.7.2
2、修改 Service 端口設置
(1)、修改 Prometheus Service
修改 prometheus-service.yaml 文件
$ vim prometheus/prometheus-service.yaml
修改prometheus Service端口類型為NodePort,設置nodePort端口為32101
apiVersion: v1 kind: Service metadata: labels: prometheus: k8s name: prometheus-k8s namespace: monitoring spec: type: NodePort ports: - name: web port: 9090 targetPort: web nodePort: 32101 selector: app: prometheus prometheus: k8s sessionAffinity: ClientIP
(2)、修改 Grafana Service
修改 grafana-service.yaml 文件
$ vim grafana/grafana-service.yaml
修改garafana Service端口類型為NodePort,設置nodePort端口為32102
apiVersion: v1 kind: Service metadata: labels: app: grafana name: grafana namespace: monitoring spec: type: NodePort ports: - name: http port: 3000 targetPort: http nodePort: 32102 selector: app: grafana
3、修改數據持久化存儲
prometheus 實際上是通過 emptyDir 進行掛載的,我們知道 emptyDir 掛載的數據的生命周期和 Pod 生命周期一致的,如果 Pod 掛掉了,那么數據也就丟失了,這也就是為什么我們重建 Pod 后之前的數據就沒有了的原因,所以這里修改它的持久化配置。
(1)、創建 StorageClass
創建一個名稱為 fast 的 StorageClass,不同的存儲驅動創建的 StorageClass 配置也不同,下面提供基於”GlusterFS”和”NFS”兩種配置,如果是NFS存儲,請提前確認集群中是否存在”nfs-provisioner”應用。
GlusterFS 存儲的 StorageClass 配置
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast #---SorageClass 名稱 provisioner: kubernetes.io/glusterfs #---標識 provisioner 為 GlusterFS parameters: resturl: "http://10.10.249.63:8080" restuser: "admin" gidMin: "40000" gidMax: "50000" volumetype: "none" #---分布巻模式,不提供備份,正式環境切勿用此模式
NFS 存儲的 StorageClass 配置
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast provisioner: nfs-client #---動態卷分配應用設置的名稱,必須和集群中的"nfs-provisioner"應用設置的變量名稱保持一致 parameters: archiveOnDelete: "true" #---設置為"false"時刪除PVC不會保留數據,"true"則保留數據
(2)、修改 Prometheus 持久化
修改 prometheus-prometheus.yaml 文件
$ vim prometheus/prometheus-prometheus.yaml
prometheus是一種 StatefulSet 有狀態集的部署模式,所以直接將 StorageClass 配置到里面,在下面的yaml中最下面添加持久化配置:
apiVersion: monitoring.coreos.com/v1 kind: Prometheus metadata: labels: prometheus: k8s name: k8s namespace: monitoring spec: alerting: alertmanagers: - name: alertmanager-main namespace: monitoring port: web baseImage: quay-mirror.qiniu.com/prometheus/prometheus nodeSelector: beta.kubernetes.io/os: linux replicas: 2 resources: requests: memory: 400Mi ruleSelector: matchLabels: prometheus: k8s role: alert-rules securityContext: fsGroup: 2000 runAsNonRoot: true runAsUser: 1000 serviceAccountName: prometheus-k8s serviceMonitorNamespaceSelector: {} serviceMonitorSelector: {} version: v2.7.2 storage: #----添加持久化配置,指定StorageClass為上面創建的fast volumeClaimTemplate: spec: storageClassName: fass #---指定為fast resources: requests: storage: 10Gi
(3)、修改 Grafana 持久化配置
創建 grafana-pvc.yaml 文件
由於 Grafana 是部署模式為 Deployment,所以我們提前為其創建一個 grafana-pvc.yaml 文件,加入下面 PVC 配置。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: grafana namespace: monitoring #---指定namespace為monitoring spec: storageClassName: fast #---指定StorageClass為上面創建的fast accessModes: - ReadWriteOnce resources: requests: storage: 5Gi
修改 grafana-deployment.yaml 文件設置持久化配置,應用上面的 PVC
$ vim grafana/grafana-deployment.yaml
將 volumes 里面的 “grafana-storage” 配置注掉,新增如下配置,掛載一個名為 grafana 的 PVC
...... volumes: - name: grafana-storage #-------新增持久化配置 persistentVolumeClaim: claimName: grafana #-------設置為創建的PVC名稱 #- emptyDir: {} #-------注釋掉舊的配置 # name: grafana-storage - name: grafana-datasources secret: secretName: grafana-datasources - configMap: name: grafana-dashboards name: grafana-dashboards ......
五、部署前各節點提前下載鏡像
為了保證服務啟動速度,所以最好部署節點提前下載所需鏡像。
docker pull quay-mirror.qiniu.com/coreos/configmap-reload:v0.0.1
docker pull quay-mirror.qiniu.com/coreos/prometheus-config-reloader:v0.29.0
docker pull quay-mirror.qiniu.com/coreos/prometheus-operator:v0.29.0
docker pull quay-mirror.qiniu.com/coreos/k8s-prometheus-adapter-amd64:v0.4.1
docker pull quay-mirror.qiniu.com/prometheus/alertmanager:v0.17.0
docker pull quay-mirror.qiniu.com/prometheus/node-exporter:v0.17.0
docker pull quay-mirror.qiniu.com/coreos/kube-rbac-proxy:v0.4.1
docker pull quay-mirror.qiniu.com/coreos/kube-state-metrics:v1.5.0
docker pull registry.aliyuncs.com/google_containers/addon-resizer:1.8.4
docker pull quay-mirror.qiniu.com/prometheus/prometheus:v2.7.2
六、更改 kubernetes 配置與創建對應 Service
必須提前設置一些 Kubernetes 中的配置,否則 kube-scheduler 和 kube-controller-manager 無法監控到數據。
1、更改 kubernetes 配置
由於 Kubernetes 集群是由 kubeadm 搭建的,其中 kube-scheduler 和 kube-controller-manager 默認綁定 IP 是 127.0.0.1 地址。Prometheus Operator 是通過節點 IP 去訪問,所以我們將 kube-scheduler 綁定的地址更改成 0.0.0.0。
(1)、修改 kube-scheduler 配置
編輯 /etc/kubernetes/manifests/kube-scheduler.yaml 文件
$ vim /etc/kubernetes/manifests/kube-scheduler.yaml
將 command 的 bind-address 地址更改成 0.0.0.0
...... spec: containers: - command: - kube-scheduler - --bind-address=0.0.0.0 #改為0.0.0.0 - --kubeconfig=/etc/kubernetes/scheduler.conf - --leader-elect=true ......
(2)、修改 kube-controller-manager 配置
編輯 /etc/kubernetes/manifests/kube-controller-manager.yaml 文件
$ vim /etc/kubernetes/manifests/kube-controller-manager.yaml
將 command 的 bind-address 地址更改成 0.0.0.0
spec: containers: - command: - kube-controller-manager - --allocate-node-cidrs=true - --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf - --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf - --bind-address=0.0.0.0 #改為0.0.0.0 ......
2、創建 kube-scheduler & controller-manager 對應 Service
因為 Prometheus Operator 配置監控對象 serviceMonitor 是根據 label 選取 Service 來進行監控關聯的,而通過 Kuberadm 安裝的 Kubernetes 集群只創建了 kube-scheduler & controller-manager 的 Pod 並沒有創建 Service,所以 Prometheus Operator 無法這兩個組件信息,這里我們收到創建一下這倆個組件的 Service。
apiVersion: v1 kind: Service metadata: namespace: kube-system name: kube-controller-manager labels: k8s-app: kube-controller-manager spec: selector: component: kube-controller-manager type: ClusterIP clusterIP: None ports: - name: http-metrics port: 10252 targetPort: 10252 protocol: TCP --- apiVersion: v1 kind: Service metadata: namespace: kube-system name: kube-scheduler labels: k8s-app: kube-scheduler spec: selector: component: kube-scheduler type: ClusterIP clusterIP: None ports: - name: http-metrics port: 10251 targetPort: 10251 protocol: TCP
如果是二進制部署還得創建對應的 Endpoints 對象將兩個組件掛入到 kubernetes 集群內,然后通過 Service 提供訪問,才能讓 Prometheus 監控到。
七、安裝Prometheus Operator
所有文件都在 manifests 目錄下執行。
1、創建 namespace
$ kubectl apply -f 00namespace-namespace.yaml
2、安裝 Operator
$ kubectl apply -f operator/
查看 Pod,等 pod 創建起來在進行下一步
$ kubectl get pods -n monitoring
NAME READY STATUS RESTARTS
prometheus-operator-5d6f6f5d68-mb88p 1/1 Running 0
3、安裝其它組件
kubectl apply -f adapter/
kubectl apply -f alertmanager/
kubectl apply -f node-exporter/
kubectl apply -f kube-state-metrics/
kubectl apply -f grafana/
kubectl apply -f prometheus/
kubectl apply -f serviceMonitor/
查看 Pod 狀態
$ kubectl get pods -n monitoring
NAME READY STATUS RESTARTS
alertmanager-main-0 2/2 Running 0
alertmanager-main-1 2/2 Running 0
alertmanager-main-2 2/2 Running 0
grafana-b6bd6d987-2kr8w 1/1 Running 0
kube-state-metrics-6f7cd8cf48-ftkjw 4/4 Running 0
node-exporter-4jt26 2/2 Running 0
node-exporter-h88mw 2/2 Running 0
node-exporter-mf7rr 2/2 Running 0
prometheus-adapter-df8b6c6f-jfd8m 1/1 Running 0
prometheus-k8s-0 3/3 Running 0
prometheus-k8s-1 3/3 Running 0
prometheus-operator-5d6f6f5d68-mb88p 1/1 Running 0
八、查看 Prometheus & Grafana
1、查看 Prometheus
打開地址: http://192.168.2.11:32101 查看 Prometheus 采集的目標,看其各個采集服務狀態有木有錯誤。
2、查看 Grafana
打開地址: http://192.168.2.11:32102 查看 Grafana 圖表,看其 Kubernetes 集群是否能正常顯示。
- 默認用戶名:admin
- 默認密碼:admin
可以看到各種儀表盤