kind kubernetes 集群内如何通过 helm 部署定制化 Prometheus-Operator?
文章目錄
- 1. Prometheus 簡介
- 2. Prometheus 優勢
- 3. Prometheus 架構圖
- 4. Prometheus-Operator 簡介
- 5. Prometheus-Operator 架構圖
- 6. 環境準備
- 7. Kind 部署 Kubernetes
- 7.1 安裝 Ingress-nginx 組件
- 7.2 安裝 Metric Server 組件
- 8. helm 快速安裝 Prometheus-Operator
- 9. 定制 Prometheus-Operator helm charts
- 9.1 獲取鏡像方法
- 9.2 定制內容
- 9.3 打包
- 9.4 推送 helm package 至 GitHub Package
- 9.5 推送 helm package 至私有 harbor
- 10. helm 安裝定制化的 kube-prometheus-stack
- 11. 域名訪問
- 12. 清理應用
1. Prometheus 簡介
Prometheus 是由前 Google 工程師從 2012 年開始在 Soundcloud 以開源軟件的形式進行研發的系統監控和告警工具包,自此以后,許多公司和組織都采用了 Prometheus 作為監控告警工具。Prometheus 的開發者和用戶社區非常活躍,它現在是一個獨立的開源項目,可以獨立于任何公司進行維護。為了證明這一點,Prometheus 于 2016 年 5 月加入 CNCF 基金會,成為繼 Kubernetes 之后的第二個 CNCF 托管項目。
2. Prometheus 優勢
- 由指標名稱和和鍵/值對標簽標識的時間序列數據組成的多維數據模型。
- 強大的查詢語言 PromQL。
- 不依賴分布式存儲;單個服務節點具有自治能力。
- 時間序列數據是服務端通過 HTTP 協議主動拉取獲得的。
- 也可以通過中間網關來推送時間序列數據。
- 可以通過靜態配置文件或服務發現來獲取監控目標。
- 支持多種類型的圖表和儀表盤
3. Prometheus 架構圖
組件說明:
- Prometheus Server: 用于收集和存儲時間序列數據;
- Client Library: 客戶端庫,為需要監控的服務生成相應的 metrics 并暴露給 Prometheus server;
- PushGateway: pushgateway是采用被動推送來獲取監控數據的 prometheus 插件,它可以單獨運行在任何節點上,并不一定要運行在被監控的客戶端。而后通過用戶自定義編寫的腳本把需要監控的數據發送給 pushgateway,pushgateway再將數據推送給prometheus server;
- Exporters: 負責監控機器運行狀態,提供被監控組件信息的 HTTP 接口被叫做 exporter;
- Alertmanager: 從 Prometheus server 端接收到 alerts 后,會進行去除重復數據,分組,并路由到對收的接受方式,發出報警;
- Grafana:一個監控儀表系統,它是由 Grafana Labs 公司開源的的一個系統監測工具,它可以大大幫助我們簡化監控的復雜度,我們只需要提供需要監控的數據,它就可以幫助生成各種可視化儀表,同時它還有報警功能,可以在系統出現問題時發出通知。
4. Prometheus-Operator 簡介
-
Kubernetes Operator 是由 CoreOS 公司開發的,用來擴展 Kubernetes API,特定的應用程序控制器,它用來創建、配置和管理復雜的有狀態應用,如數據庫、緩存和監控系統。Operator基于 Kubernetes 的資源和控制器概念之上構建,但同時又包含了應用程序特定的一些專業知識,比如創建一個數據庫的Operator,則必須對創建的數據庫的各種運維方式非常了解,創建Operator的關鍵是CRD(自定義資源)的設計。
-
Kubernetes CRD 是對 Kubernetes API 的擴展,Kubernetes 中的每個資源都是一個 API 對象的集合,例如我們在 YAML文件里定義的那些spec都是對 Kubernetes 中的資源對象的定義,所有的自定義資源可以跟 Kubernetes 中內建的資源一樣使用 kubectl 操作。
-
Prometheus Operator 提供 Kubernetes 原生部署和管理Prometheus及相關監控組件。該項目的目的是為 Kubernetes 集群簡化和自動化基于 Prometheus 的監控堆棧的配置。
Prometheus Operator 特性:- Kubernetes 自定義資源:使用 Kubernetes 自定義資源部署和管理 Prometheus、Alertmanager 及相關組件。
- 簡化的部署配置:配置 Prometheus 的基礎知識,例如版本、持久性、保留策略和本地 Kubernetes 資源的副本。
- Prometheus Target Configuration:根據熟悉的Kubernetes標簽查詢,自動生成監控目標配置;無需學習普羅米修斯特定的配置語言。
5. Prometheus-Operator 架構圖
這篇文章我將在kind部署的kubernets集群內通過 helm 工具安裝定制化的 Prometheus-Operator 。
6. 環境準備
- 安裝系統 Centos 8.2
- 初始化 Centos 8.2
- 安裝 Podman,它是 Podman 最初由紅帽工程師聯合開源社區一同開發的無守護進程的下一代容器管理工具,即 Docker 替代者。
- 安裝 Kubectl
安裝 Kind, 它是一個 Kubernetes 孵化項目,一套開箱即用的 Kubernetes 環境搭建方案。顧名思義,就是將 Kubernetes 所需要的所有組件,全部部署在一個 Docker 容器中。
- 安裝 helm 命令
或者
$ wget https://get.helm.sh/helm-v3.11.0-linux-amd64.tar.gz $ tar -xzvf helm-v3.11.0-linux-amd64.tar.gz $ cp linux-amd64/helm /usr/local/bin/ $ helm version version.BuildInfo{Version:"v3.11.0", GitCommit:"d14138609b01886f544b2025f5000351c9eb092e", GitTreeState:"clean", GoVersion:"go1.17.5"}7. Kind 部署 Kubernetes
- config.yaml
創建 K8s 集群:
$ kind create cluster --config config.yaml enabling experimental podman provider Creating cluster "kind" ...? Ensuring node image (kindest/node:v1.25.3) 🖼? Preparing nodes 📦? Writing configuration 📜? Starting control-plane 🕹?? Installing CNI 🔌? Installing StorageClass 💾 Set kubectl context to "kind-kind" You can now use your cluster with:kubectl cluster-info --context kind-kindHave a nice day! 👋7.1 安裝 Ingress-nginx 組件
kubectl create -f https://ghproxy.com/https://raw.githubusercontent.com/Ghostwritten/resource/main/ingress-nginx/ingress-nginx.yaml7.2 安裝 Metric Server 組件
系統資源的采集均使用Metrics-Server服務,可以通過Metrics-Server服務采集節點和Pod的內存、磁盤、CPU和網絡的使用率等信息。Metric Server組件是實現服務自動擴容不可或缺的組件。
kubectl apply -f https://ghproxy.com/https://raw.githubusercontent.com/Ghostwritten/resource/main/metrics/metrics.yaml等待 Metric 工作負載就緒
kubectl wait deployment -n kube-system metrics-server --for condition=Available=True --timeout=90sMetric Server 就緒后,我們通過 kubectl autoscale 命令來為 Deployment 創建自動擴容策略。但這篇不是重點。
8. helm 快速安裝 Prometheus-Operator
默認安裝方式:
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts $ helm upgrade prometheus prometheus-community/kube-prometheus-stack \ --namespace prometheus --create-namespace --install \ --set prometheus.prometheusSpec.podMonitorSelectorNilUsesHelmValues=false \ --set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=falseRelease "prometheus" does not exist. Installing it now. ...... STATUS: deployed但我本地的 linux 環境會有沒有“科學網絡”,所以部署實際會卡住很長一段時間,最后報:Error: failed pre-install: timed out waiting for the condition,查看 pod 報以下錯誤:
$ k get pods -n prometheus NAME READY STATUS RESTARTS AGE prometheus-kube-prometheus-admission-create-7494p 0/1 ImagePullBackOff 0 6m20s$ k get pods -n prometheus prometheus-kube-prometheus-admission-create-7494p -oyaml .......state:waiting:message: Back-off pulling image "registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.3.0"reason: ImagePullBackOff ........沒有真正的全球互聯網,我們無法拉取 registry.k8s.io。需要對重新定制自己的 prometheus helm charts
9. 定制 Prometheus-Operator helm charts
9.1 獲取鏡像方法
但由于隱形墻的原因,我們無法下載拉取以下:
- registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.3.0
- registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.8.0
所以,你可以獲取registry.k8s.io的方法:
- 購買國外 VPS 拉取鏡像推送至 DockerHub
- 通過配置代理拉取鏡像,需施展要魔法技能。
- 去 DockerHub、quay.io 尋找他人推送的對應版本的鏡像。
- 利用 Github Action 實現鏡像自動遷移。fork來自@togettoyou YYDS
這里我由于只是用于測試,直接從 DockerHub 獲取他人已經推送好的鏡像,當然,這種方法不敢保證別人已經做過改動,存在風險,生產謹慎使用。
9.2 定制內容
- 下載 kube-prometheus-stack-45.2.0.tgz
修改鏡像版本
- registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.3.0 改為docker.io/ghostwritten/kube-webhook-certgen:v1.3.0
- registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.8.0改為docker.io/ghostwritten/kube-state-metrics:v2.8.0
具體操作:第一步:cd kube-prometheus-stack目錄,vim values.yaml文件
1872 registry: registry.k8s.io 1873 repository: ingress-nginx/kube-webhook-certgen 1874 tag: v1.3.0修改為:
1872 registry: docker.io 1873 repository: ghostwritten/kube-webhook-certgen 1874 tag: v1.3.0第二步:vim charts/kube-state-metrics/values.yaml
3 image:4 repository: registry.k8s.io/kube-state-metrics/kube-state-metrics修改為:
3 image:4 repository: docker.io/ghostwritten/kube-state-metrics第三步:為了和官方 prometheus helm charts 做一個區分需要修改一下 helm charts的名字。打開vim Chart.yaml
50 name: kube-prometheus-stack修改為:
50 name: ghostwritten-kube-prometheus-stack9.3 打包
$ cd ../ $ helm package ./kube-prometheus-stack Successfully packaged chart and saved it to: /root/ghostwritten-kube-prometheus-stack-45.2.0.tgz9.4 推送 helm package 至 GitHub Package
登陸 github 創建一個Token,你可以在這個鏈接創建,并勾選 write:packages 權限。
點擊“Genarate token”按鈕生成 Token 并復制。
推送
$ helm push ghostwritten-kube-prometheus-stack-45.2.0.tgz oci://ghcr.io/ghostwritten/helm Pushed: ghcr.io/ghostwritten/helm/ghostwritten-kube-prometheus-stack:45.2.0 Digest: sha256:eecc4fcfc2dd3a65dedb692bfbfcd49d1e420e99e2b13aded22b136dae25e146查看位置 ghostwritten-kube-prometheus-stack-45.2.0.tgz 存放位置
9.5 推送 helm package 至私有 harbor
- Centos 部署 harbor 鏡像倉庫實踐
harbor 默認倉庫內沒有Helm Charts欄,需要執行以下命令即可:
docker-compose stop ./install.sh --with-chartmuseum拷貝證書:
scp -r /etc/docker/certs.d/harbor.ghostwritten.com root@192.168.10.29:/etc/containers/certs.d//etc/hosts 文件配置 192.168.10.81 harbor.ghostwritten.com
登陸
跟配置 Docker 倉庫一樣,配置 Helm 倉庫也得提前配置證書,首先進入 ca 簽名目錄
yum install ca-certificates cp /etc/containers/certs.d/harbor.ghostwritten.com/ca.crt /etc/pki/ca-trust/source/anchors/執行更新命令,使證書生效:
update-ca-trust extractharbor 界面新建一個項目,名字為 helm
將此項目添加 Helm 倉庫:
查看 helm 本地庫
helm repo list NAME URL prometheus-community https://prometheus-community.github.io/helm-charts harbor https://harbor.ghostwritten.com/chartrepo/helmhelm 默認不支持推送倉庫,需要安裝 helm-push 插件
$ helm plugin install https://github.com/chartmuseum/helm-push Downloading and installing helm-push v0.10.3 ... https://github.com/chartmuseum/helm-push/releases/download/v0.10.3/helm-push_0.10.3_linux_amd64.tar.gz Installed plugin: cm-push推送 ghostwritten-kube-prometheus-stack-45.2.0.tgz 至 harbor
$ helm cm-push ghostwritten-kube-prometheus-stack-45.2.0.tgz harbor Pushing ghostwritten-kube-prometheus-stack-45.2.0.tgz to harbor... Done.已上傳成功,效果圖如下:
10. helm 安裝定制化的 kube-prometheus-stack
我這里選擇從剛剛上傳的公共 github package上的ghostwritten-kube-prometheus-stack包進行安裝。
helm upgrade prometheus oci://ghcr.io/ghostwritten/helm/ghostwritten-kube-prometheus-stack \ --version 45.2.0 \ --namespace prometheus --create-namespace --install \ --set prometheus.prometheusSpec.podMonitorSelectorNilUsesHelmValues=false \ --set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false輸出:
Release "prometheus" does not exist. Installing it now. Pulled: ghcr.io/ghostwritten/helm/ghostwritten-kube-prometheus-stack:45.2.0 Digest: sha256:2d17d54b97cbd2ce45f34bf2d25b7d424cff43508054ea0232b7d2f485a5b7a2 NAME: prometheus LAST DEPLOYED: Tue Feb 28 14:32:22 2023 NAMESPACE: prometheus STATUS: deployed REVISION: 1 NOTES: ghostwritten-kube-prometheus-stack has been installed. Check its status by running:kubectl --namespace prometheus get pods -l "release=prometheus"Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.查看 helm 部署應用列表
$ helm list -n prometheus NAME NAMESPACE REVISION UPDATED STATUS CHARTAPP VERSION prometheus prometheus 1 2023-02-28 14:32:22.526037959 +0800 CST deployed ghostwritten-kube-prometheus-stack-45.2.0 v0.63.0查看 pod 以及其他資源對象
$ kubectl --namespace prometheus get pods -l "release=prometheus" NAME READY STATUS RESTARTS AGE prometheus-ghostwritten-ku-operator-7c89d9649c-hl5sx 1/1 Running 0 49s prometheus-kube-state-metrics-bf46f46cc-944cr 1/1 Running 0 49s prometheus-prometheus-node-exporter-jbv7n 1/1 Running 0 49s$ k get all -n prometheus NAME READY STATUS RESTARTS AGE pod/alertmanager-prometheus-ghostwritten-ku-alertmanager-0 2/2 Running 1 (88m ago) 88m pod/prometheus-ghostwritten-ku-operator-7c89d9649c-fvd4x 1/1 Running 0 88m pod/prometheus-grafana-6f77bc5bc9-mnsn5 3/3 Running 0 88m pod/prometheus-kube-state-metrics-bf46f46cc-dqbrm 1/1 Running 0 88m pod/prometheus-prometheus-ghostwritten-ku-prometheus-0 2/2 Running 0 88m pod/prometheus-prometheus-node-exporter-gkd29 1/1 Running 0 88mNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)AGE service/alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 88m service/prometheus-ghostwritten-ku-alertmanager ClusterIP 10.96.193.144 <none> 9093/TCP88m service/prometheus-ghostwritten-ku-operator ClusterIP 10.96.112.10 <none> 443/TCP88m service/prometheus-ghostwritten-ku-prometheus ClusterIP 10.96.110.97 <none> 9090/TCP88m service/prometheus-grafana ClusterIP 10.96.86.245 <none> 80/TCP88m service/prometheus-kube-state-metrics ClusterIP 10.96.205.51 <none> 8080/TCP88m service/prometheus-operated ClusterIP None <none> 9090/TCP88m service/prometheus-prometheus-node-exporter ClusterIP 10.96.154.79 <none> 9100/TCP88mNAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/prometheus-prometheus-node-exporter 1 1 1 1 1 <none> 88mNAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/prometheus-ghostwritten-ku-operator 1/1 1 1 88m deployment.apps/prometheus-grafana 1/1 1 1 88m deployment.apps/prometheus-kube-state-metrics 1/1 1 1 88mNAME DESIRED CURRENT READY AGE replicaset.apps/prometheus-ghostwritten-ku-operator-7c89d9649c 1 1 1 88m replicaset.apps/prometheus-grafana-6f77bc5bc9 1 1 1 88m replicaset.apps/prometheus-kube-state-metrics-bf46f46cc 1 1 1 88mNAME READY AGE statefulset.apps/alertmanager-prometheus-ghostwritten-ku-alertmanager 1/1 88m statefulset.apps/prometheus-prometheus-ghostwritten-ku-prometheus 1/1 88m11. 域名訪問
當然如果我們想要在外網訪問這兩個服務的話可以通過創建對應的 Ingress 對象或者使用 NodePort 類型的 Service,使用 NodePort 類型的服務,編輯prometheus-grafana 、 prometheus-k8sprometheus-ghostwritten-ku-prometheus 、prometheus-ghostwritten-ku-alertmanager這三個 Service,將服務類型(type)更改為 NodePort。但我更喜歡通過域名訪問。
編寫 prometheus-grafana-alertmanager-ingress.yaml
apiVersion: networking.k8s.io/v1 kind: Ingress metadata:name: grafana-ingresslabels:app: ghostwritten-kube-prometheus-stack-prometheusannotations:kubernetes.io/ingress.class: nginx spec:rules:- host: grafana.demo.comhttp:paths:- path: /pathType: Prefixbackend:service:name: prometheus-grafanaport:name: http-web--- apiVersion: networking.k8s.io/v1 kind: Ingress metadata:name: prometheus-ingresslabels:app: ghostwritten-kube-prometheus-stack-prometheusannotations:kubernetes.io/ingress.class: nginx spec:rules:- host: prometheus.demo.comhttp:paths:- path: /pathType: Prefixbackend:service:name: prometheus-ghostwritten-ku-prometheusport:name: http-web --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata:name: alertmanager-ingresslabels:app: ghostwritten-kube-prometheus-stack-prometheusannotations:kubernetes.io/ingress.class: nginx spec:rules:- host: alertmanager.demo.comhttp:paths:- path: /pathType: Prefixbackend:service:name: prometheus-ghostwritten-ku-alertmanagerport:name: http-web執行:
k apply -f prometheus-grafana-alertmanager-ingress.yamlwindows: C:\Windows\System32\drivers\etc\hosts 配置:
192.168.10.29 grafana.demo.com prometheus.demo.com alertmanager.demo.com訪問: http://prometheus.demo.com
訪問:http://alertmanager.demo.com
訪問:http://grafana.demo.com
因為我第一次登陸admin/admin, 并沒有登陸成功,通過grafana-cli 命令修改 admin 密碼為 admin:
再次admin/admin 登陸成功,直接跳轉修改密碼,我修改新的密碼為 12345678
終于可以正常訪問了。
12. 清理應用
刪除 prometheus 應用
k delete -f prometheus-grafana-alertmanager-ingress.yaml helm delete prometheus -n prometheus k delete ns prometheus強制刪除命名空間,創建 delete_ns.sh
#!/bin/bashNAMESPACE=$1 kubectl proxy & kubectl get namespace $NAMESPACE -o json |jq '.spec = {"finalizers":[]}' >temp.json curl -k -H "Content-Type: application/json" -X PUT --data-binary @temp.json 127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize bash delete_ns.sh prometheus參考:
- Prometheus Operator 初體驗
總結
以上是生活随笔為你收集整理的kind kubernetes 集群内如何通过 helm 部署定制化 Prometheus-Operator?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iptables防火墙与SNAT和DNA
- 下一篇: swiper轮播图插件的使用步骤