Prometheus Operator是一個用來協助在K8S上部署Prometheus的工具,我是使用此方式進行Prometheus在K8S上的部署。
我使用的版本是Prometheus Operator的v0.13.0版本(因為我的K8S版本為1.27.1)
至 https://github.com/prometheus-operator/kube-prometheus 選擇版本
https://github.com/prometheus-operator/kube-prometheus/releases/tag/v0.13.0
下載Source code (tar.gz 或是 .zip都可以 ) ,下載完成後使用scp將壓縮檔傳到VM上。
將壓縮檔解壓縮後
# cd 到檔案夾
cd kube-prometheus-0.13.0
# cd 到manifests
cd manifests
# cd 到setup
cd setup
# 建立CRD資源
sudo kubectl create -f .
# 搜尋CRD資源是否建立
sudo kubectl get crd |grep coreos
使用Prometheus Operator在K8S上安裝Prometheus所需要下載的image
docker pull ${image}
# image
------------------------------------------------------------------
quay.io/prometheus/node-exporter:v1.6.1
docker.io/grafana/grafana:9.5.3
quay.io/prometheus/blackbox-exporter:v0.24.0
quay.io/prometheus/alertmanager:v0.26.0
jimmidyson/configmap-reload:v0.5.0
registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.9.2
registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.11.1
quay.io/prometheus-operator/prometheus-operator:v0.68.0
quay.io/prometheus/prometheus:v2.47.2
quay.io/prometheus-operator/prometheus-config-reloader:v0.68.0
quay.io/brancz/kube-rbac-proxy:v0.15.0
------------------------------------------------------------------
### 將image拉下來後,需要將image打包成.tar後上傳至需部署的VM上,再將.tar還原為image,進行下一步的部署
# 將本機的image打包為.tar檔
docker save -o ${tar name}.tar ${image name}
### 註:使用docker save時,後面需要接image name,這樣之後還原時才會有image name,如果是用image ID ,則還原後只會有image ID ,不會保留image name,在進行K8S部署時會麻煩很多,如部署的服務版本管控。
# 使用scp將本機的.tar檔傳至VM上
# 將.tar檔還原為image
ctr --namespace=k8s.io images import ${tar name}.tar
### 註: 1.27.1版本的K8S是使用containerd構建的,所以如果需要將外界的.tar檔還原為image,需要使用以上指令,將.tar檔還原成位於k8s.io namespace的image,這樣K8S才拉取的到image。若是1.21版本的K8S則使用docker load -i ${.tar name}.tar
# 檢查是否成功還原image,列出image
crictl image ls
修改grafana和Prometheus的service.yml
# cd 回上一層資料夾(manifest)
cd ..
# 修改prometheus-service.yaml
vim prometheus-service.yaml
-----------------------------------------------------------------------
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: prometheus
app.kubernetes.io/instance: k8s
app.kubernetes.io/name: prometheus
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 2.47.2
name: prometheus-k8s
namespace: monitoring
spec:
# 將service的type改成NodePort,預設為clusterIP(K8S內部使用的虛擬IP),service改為NodePort將服務暴露出去,可從外界存取(在ports新增nodePort的port號)
type: NodePort
ports:
- name: web
port: 9090
targetPort: web
nodePort: 30019
- name: reloader-web
port: 8080
targetPort: reloader-web
nodePort: 30020
selector:
app.kubernetes.io/component: prometheus
app.kubernetes.io/instance: k8s
app.kubernetes.io/name: prometheus
app.kubernetes.io/part-of: kube-prometheus
sessionAffinity: ClientIP
-----------------------------------------------------------------------
# 修改grafana-service.yaml
vim grafana-service.yaml
---------------------------------------------------------------------
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: grafana
app.kubernetes.io/name: grafana
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 9.5.3
name: grafana
namespace: monitoring
spec:
# 將service的type改成NodePort,預設為clusterIP(K8S內部使用的虛擬IP),service改為NodePort將服務暴露出去,可從外界存取(在ports新增nodePort的port號)
type: NodePort
ports:
- name: http
port: 3000
targetPort: http
nodePort: 30022
selector:
app.kubernetes.io/component: grafana
app.kubernetes.io/name: grafana
app.kubernetes.io/part-of: kube-prometheus
-----------------------------------------------------------------------
修改完畢後apply所有yml檔
# create所有資源
kubectl create -f .
### 註:所有的pod、service等等都創建於monitoring namespace裡
# 檢查是否成功創建了Prometheus Operator的CRD
kubectl get crd |grep coreos
# 檢查是否成功創建了POD
kubectl get pods -n monitoring
# 檢查是否成功創建了Service,需檢查Prometheus-k8s和grafana的type是否為nodeport和對外的port是否正確
kubectl get svc -n monitoring
輸入 http://${目標IP} : ${garana的nodeport}/login 後出現登入畫面
預設帳號密碼為 帳號:admin、密碼:admin
進入主畫面後按下 "Add your first data source "
選擇Prometheus
在URL部分輸入 http://${目標IP} : ${prometheus的nodeport}/
按 save & test,成功後即代表data source新增成功
可以在"Explore"部份下promQL,查詢metrics
選擇Dashboards,New 一個 import
輸入JSON或是上傳.json檔案
推薦使用 " Node Exporter Full " 這個dashboard ( https://grafana.com/grafana/dashboards/1860-node-exporter-full/ )
這是我新增的Dashboards,有Prometheus和LOKI的Dashboards,如果需要其他的Dashboards,可以在grafana搜尋( https://grafana.com/grafana/dashboards/ )
Grafana可以註冊多個data source,所以可以在grafana上新增以K8S方式安裝的Prometheus 的data source和新增以二進制安裝的Prometheus 的data source。
以上安裝所需的安裝包都可以在網路上下載到。使用Prometheus不僅可以監控目前的流量及服務狀態,還能透過流量狀態優化程式碼,減少deadlock的發生和memory的優化。