一、概述
使用 helm 安裝 Prometheus Operator。使用 helm 安裝后,會在 Kubernetes 集群中創建、配置和管理 Prometheus 集群,chart 中包含多種組件:
- prometheus-operator
- prometheus
- alertmanager
- node-exporter
- kube-state-metrics
- grafana
- 收集 Kubernetes 內部組件指標的監控服務
- kube-apiserver
- kube-scheduler
- kube-controller-manager
- etcd
- kube-dns/coredns
- kube-proxy
架構
Prometheus Operator 架構圖如下:
上面架構圖中,各組件以不同的方式運行在 Kubernetes 集群中:
- Operator: 根據自定義資源(Custom Resource Definition / CRDs)來部署和管理 Prometheus Server,同時監控這些自定義資源事件的變化來做相應的處理,是整個系統的控制中心。
- Prometheus:聲明 Prometheus deployment 期望的狀態,Operator 確保這個 deployment 運行時一直與定義保持一致。
- Prometheus Server: Operator 根據自定義資源 Prometheus 類型中定義的內容而部署的 Prometheus Server 集群,這些自定義資源可以看作是用來管理 Prometheus Server 集群的 StatefulSets 資源。
- ServiceMonitor:聲明指定監控的服務,描述了一組被 Prometheus 監控的目標列表。該資源通過 Labels 來選取對應的 Service Endpoint,讓 Prometheus Server 通過選取的 Service 來獲取 Metrics 信息。
- Service:簡單的說就是 Prometheus 監控的對象。
- Alertmanager:定義 AlertManager deployment 期望的狀態,Operator 確保這個 deployment 運行時一直與定義保持一致。
二、安裝
環境說明
操作系統:centos 7.6
ip地址:192.168.31.148
k8s版本:v1.16.3
主機名:k8s-master
配置:2核4g
helm:v2.16.6
操作系統:centos 7.6
ip地址:192.168.31.179
k8s版本:v1.16.3
主機名:k8s-node01
配置:4核8g
安裝
Prometheus Operator 所有的組件都打包成 Helm Chart,安裝部署非常方便。
helm install --name prometheus-operator --set rbacEnable=true --namespace=monitoring stable/prometheus-operator
查看資源
#查看創建的資源 kubectl get all -n monitoring #查看安裝后的release helm list #查看訪問類型 kubectl get svc -n monitoring
查看狀態
# kubectl get pod -n monitoring NAME READY STATUS RESTARTS AGE pod/alertmanager-prometheus-operator-alertmanager-0 2/2 Running 0 98m pod/prometheus-operator-grafana-857dfc5fc8-vdnff 2/2 Running 0 99m pod/prometheus-operator-kube-state-metrics-66b4c95cd9-mz8nt 1/1 Running 0 99m pod/prometheus-operator-operator-56964458-8sspk 2/2 Running 0 99m pod/prometheus-operator-prometheus-node-exporter-dcf5p 1/1 Running 0 99m pod/prometheus-operator-prometheus-node-exporter-nv6ph 1/1 Running 0 99m pod/prometheus-prometheus-operator-prometheus-0 3/3 Running 1 98m
確保pod狀態運行正常
方法1:修改訪問類型為NodePort
將type類型值改為NodePort
kubectl edit svc prometheus-operator-grafana -n monitoring kubectl edit svc prometheus-operator-alertmanager -n monitoring kubectl edit svc prometheus-operator-prometheus -n monitoring
查看修改后的訪問類型
# kubectl get svc -n monitoring NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 100m prometheus-operated ClusterIP None <none> 9090/TCP 100m prometheus-operator-alertmanager NodePort 10.1.238.78 <none> 9093:31765/TCP 102m prometheus-operator-grafana NodePort 10.1.125.228 <none> 80:30284/TCP 102m prometheus-operator-kube-state-metrics ClusterIP 10.1.187.129 <none> 8080/TCP 102m prometheus-operator-operator ClusterIP 10.1.242.61 <none> 8080/TCP,443/TCP 102m prometheus-operator-prometheus NodePort 10.1.156.181 <none> 9090:30268/TCP 102m prometheus-operator-prometheus-node-exporter ClusterIP 10.1.226.134 <none> 9100/TCP 102m
修改 kubelet 打開只讀端口
prometheus 需要訪問 kubelet 的 10255 端口獲取 metrics。但是默認情況下 10255 端口是不開放的,會導致 prometheus 上有 unhealthy。打開只讀端口需要編輯所有節點的vi /var/lib/kubelet/config.yaml (我這里有圖形界面可以用gedit命令)文件,加入以下內容
port: 10250 readOnlyPort: 10255 #增加此行
重啟 kubelet 服務
systemctl restart kubelet.service
查看grafana隨機端口
# kubectl get svc -n monitoring|grep grafana prometheus-operator-grafana NodePort 10.1.125.228 <none> 80:30284/TCP 106m
可以看到,它的隨機端口為:30284
訪問grafana,地址為:http://nodeip:30284/
默認的用戶名/密碼為:admin/prom-operator,登陸后,點擊Manage,如下圖:
效果如下:
方法2:通過 Ingress 來暴漏服務
安裝Ingress
kubectl apply -f https://kuboard.cn/install-script/v1.17.x/nginx-ingress.yaml
新建文件prometheus-ingress.yaml:
apiVersion: extensions/v1beta1 kind: Ingress metadata: namespace: monitoring name: prometheus-ingress spec: rules: - host: grafana.domain.com http: paths: - backend: serviceName: prometheus-operator-grafana servicePort: 80 - host: prometheus.domain.com http: paths: - backend: serviceName: prometheus-operator-prometheus servicePort: 9090 - host: alertmanager.domain.com http: paths: - backend: serviceName: prometheus-operator-alertmanager servicePort: 9093
執行命令
kubectl apply -f prometheus-ingress.yaml
修改hosts文件:
192.168.31.179 grafana.domain.com 192.168.31.179 prometheus.domain.com 192.168.31.179 alertmanager.domain.com
注意:192.168.31.179 是Node節點ip
訪問以下幾個url,是否正常。
http://grafana.domain.com http://prometheus.domain.com http://alertmanager.domain.com
效果如下:
三、修改k8s配置
Prometheus Operator某些圖表沒有數據,需要修改配置文件才行。
etcd
prometheus 通過 4001 端口訪問 etcd metrics,但是 etcd 默認監聽 2379。解決方法是在 /etc/kubernetes/manifests/etcd.yaml
增加k8s-app: etcd-server
apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: k8s-app: etcd-server component: etcd tier: control-plane
重啟kubelet
systemctl restart kubelet.service
注意:經驗證,此方法無效。etcd依然沒有圖表數據。
kube-controller-manager
由於 kube-controller-manager 和 kube-scheduler 默認監聽 127.0.0.1 ,prometheus 無法通過本機地址獲取數據,需要修改kube-controller-manager 和 kube-scheduler 監聽地址。
解決辦法如下:/etc/kubernetes/manifests/kube-controller-manager.yaml 增加 k8s-app: kube-controller-manager
apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: k8s-app: kube-controller-manager component: kube-controller-manager tier: control-plane
重啟kubelet
systemctl restart kubelet.service
訪問圖表
kube-scheduler
/etc/kubernetes/manifests/kube-scheduler.yaml增加 k8s-app: kube-scheduler
apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: k8s-app: kube-scheduler component: kube-scheduler tier: control-plane
重啟kubelet
systemctl restart kubelet.service
訪問圖表
本文參考鏈接:
https://www.cnblogs.com/majiang/p/11431577.html
https://blog.csdn.net/choerodon/article/details/98587027