strimzi實戰之三:prometheus+grafana監控(按官方文件搞不定監控?不妨看看本文,已經踩過坑了)

程式設計師欣宸發表於2023-09-26

歡迎訪問我的GitHub

這裡分類和彙總了欣宸的全部原創(含配套原始碼):https://github.com/zq2599/blog_demos

本篇概覽

  • 由於整個系列的實戰都涉及到訊息生產和消費,所以我們們需要一套監控服務,用於觀察各種操作的效果,例如生產訊息是否成功、訊息是否被消費、有沒有發生堆積等
  • 因此,在前文完成了最基本的部署和體驗後,今天就一起來把監控服務部署好,為後續的實戰提供良好的後勤支撐
  • 今天的實戰,假設CentOS作業系統、kubernetes環境、pv這三樣都已提前裝好,我們要做的是:透過strimzi部署一套kafka服務,並且帶有prometheus和grafana來監控這個kafka
  • 如果您對安裝kubernetes和pv還不瞭解,請參考:《快速搭建雲原生開發環境(k8s+pv+prometheus+grafana)》,要注意的是,此文中雖然介紹瞭如何安裝prometheus+grafana,但是在本篇用不上,您在參考此文的時候,只看k8s+pv部分即可
  • 本篇的操作如下圖所示,綠色部分及其內部是我們們要做的事情,前面的幾個步驟假設您已經提前做好了
    在這裡插入圖片描述

本文適合的讀者

  • 第一種讀者:對欣宸的實戰系列有信心,打算按照本文去部署監控服務
  • 第二種讀者:對官方資料存在疑問,尋求輔助資訊加以對照
  • 第三中讀者:按照官方資料操作,結果難以成功(例如grafana上的資料始終為空)
  • 這裡提一下,本來欣宸也是按官方資料去部署監控的,然而遇到各種問題,要麼服務啟動失敗,要麼grafana沒有資料,反覆修改調整嘗試後才部署成功並且資料正常,因此寫下此文避免今後再次踩坑,也希望這點經驗能給更多人提供有價值的參考,畢竟網上的strimzi類原創並不多,涉及監控的就更少了

重點問題需要先澄清

  • 首先要搞清楚的是:我們們常說的prometheus-operator,到底是啥?
  • 如下圖,可見首先prometheus-operator是個github賬號,該賬號下面有兩個重要的倉庫:prometheus-operator和kube-prometheus
    在這裡插入圖片描述
  • 關於prometheus-operator和kube-prometheus這兩個倉庫的區別,繼續看官方描述,如下圖,prometheus-operator是基礎,透過CRD簡化了prometheus、alertmanager以及其他監控元件的部署,而kube-prometheus則是在prometheus-operator的基礎上增加了很多叢集監控的樣例,例如多例項、各種指標的exporter等等
    在這裡插入圖片描述
  • 簡單的說:prometheus-operator只提供監控服務用到各種要素,kube-prometheus在prometheus-operator的基礎上提供了具體的成果,即各種監控圖表
  • 如果您看過《快速搭建雲原生開發環境(k8s+pv+prometheus+grafana)》,會發現此文已介紹瞭如何部署prometheus+grafana,並且各種監控圖表一應俱全,其實那裡用的就是kube-prometheus
  • 現在相信您已經清楚了prometheus-operator和kube-prometheus的關係,然後重點來了:strimzi的官方資料中,搭建監控服務是基於prometheus-operator來做的
  • 也就是說,按照strimzi官方的資料部署好的監控服務中,只能看到strimzi相關的內容,例如訊息相關、kafka服務相關,至於kube-prometheus中提供的那些豐富的監控內容(例如宿主機、kubernetes等相關指標),都是不存在的...
  • 當然您可能會說:只要strimzi的exporter正常,完全可以自己部署kube-prometheus,再參考官方的指令碼去自己定做監控報表即可,確實,這樣做沒問題,但是對於本系列來說就超綱了,我們們只是想借助prometheus和grafana觀察strimzi的指標而已,其他的並非主題,能省就省吧...

官方操作速看

  1. 執行kubectl apply -f kafka-metrics.yaml,這裡麵包含了Exporter(用於暴露指標),檔案kafka-metrics.yaml可以在GitHub的釋出包中找到

  2. 執行以下命令,生成名為prometheus-operator-deployment.yaml的檔案

curl -s https://raw.githubusercontent.com/coreos/prometheus-operator/master/bundle.yaml | sed -e '/[[:space:]]*namespace: [a-zA-Z0-9-]*$/s/namespace:[[:space:]]*[a-zA-Z0-9-]*$/namespace: my-namespace/' > prometheus-operator-deployment.yaml
  1. 執行kubectl create -f prometheus-operator-deployment.yaml,完成prometheus-operator的部署
  2. 修改prometheus.yml檔案,這裡面是prometheus的配置資訊,現在要修改的是namespace,改成您自己的
sed -i 's/namespace: .*/namespace: my-namespace/' prometheus.yaml
  1. 修改檔案strimzi-pod-monitor.yaml,找到namespaceSelector.matchNames屬性,改成自己的namespace(漏掉這一步就是致命問題,會導致grafana不出資料,我漏過...)
  2. 執行以下操作
kubectl apply -f prometheus-additional.yaml
kubectl apply -f strimzi-pod-monitor.yaml
kubectl apply -f prometheus-rules.yaml
kubectl apply -f prometheus.yaml
  1. 部署grafana
kubectl apply -f grafana.yaml
  • 上述步驟是對官方操作的簡單介紹,接下來就是我這邊逐步詳細的操作過程,可以確保成功的那種,為了避免官方檔案變化導致部署問題,相關檔案我都存入了自己的倉庫
  • 現在相信您對整個部署過程已經有了大致瞭解,接下來我們們開始吧

實際操作之一:建立名稱空間

  • 這裡就隨意些吧,我的名稱空間是aabbcc
kubectl create namespace aabbcc

實際操作之二:建立strimzi的資源

kubectl create -f 'https://strimzi.io/install/latest?namespace=aabbcc' -n aabbcc

實際操作之三:部署kafka+zookeeper+exporter

  • 執行以下命令,會下載一個名為kafka-metrics.yaml 的配置檔案,並在kubernets建立檔案中配置的資源,包括kafka叢集及其exporter的部署(exporter的作用是向prometheus暴露監控資料),注意namespace
kubectl create -f 'https://gitee.com/zq2599/blog_download_files/raw/master/strimzi/prometheus/kafka-metrics.yaml?namespace=aabbcc' -n aabbcc
  • 等待容器啟動完畢,如下圖所示,kafka叢集和exporter都已經就緒,接下來該部署prometheus了
    在這裡插入圖片描述

實際操作之四:部署prometheus+grafana

  • 為了部署prometheus+grafana,這邊要準備七個檔案,接下來會詳細說明
  • 首先是準備好prometheus-operator的資原始檔,執行以下命令,注意將aabbcc改成您自己的namespace(因為檔案bundle.yaml很大,導致此命令會耗時三分鐘左右,請耐心等待)
curl –connect-timeout 300 -m 300 -s https://raw.githubusercontent.com/coreos/prometheus-operator/master/bundle.yaml | sed -e '/[[:space:]]*namespace: [a-zA-Z0-9-]*$/s/namespace:[[:space:]]*[a-zA-Z0-9-]*$/namespace: aabbcc/' > prometheus-operator-deployment.yaml
  • 執行完上面的命令後,在本地得到了名為prometheus-operator-deployment.yaml的檔案,此檔案是用來建立prometheus-operator的,稍後會用到
  • 記得開啟檔案prometheus-operator-deployment.yaml檢視一下,如果裡面內容為空(網路問題所致),就需要重新執行上一步操作,請務必要檢查,因為太容易出錯了!!!
  • 第二個檔案是prometheus的資原始檔,執行以下命令,注意將aabbcc改成您自己的namespace
curl -s https://gitee.com/zq2599/blog_download_files/raw/master/strimzi/prometheus/prometheus.yaml | sed -e 's/namespace: .*/namespace: aabbcc/' > prometheus.yaml
  • 執行完上面的命令後,在本地得到了名為prometheus.yaml的檔案,此檔案是用來建立prometheus的,稍後會用到
  • 第三個檔名為strimzi-pod-monitor.yaml,下載地址:https://gitee.com/zq2599/blog_download_files/raw/master/strimzi/prometheus/strimzi-pod-monitor.yaml
  • 第三個檔案strimzi-pod-monitor.yaml下載後,要做的修改如下圖黃色箭頭所示,每個namespaceSelector.matchNames的值都要該成您自己的namespace,一共有四處,請務必要修改正確(我最初操作時grafana一直沒有資料,最終發現是漏了這一步導致的)
    在這裡插入圖片描述
  • 第四個檔名為grafana-service-nodeport.yaml,下載地址:https://gitee.com/zq2599/blog_download_files/raw/master/strimzi/prometheus/grafana-service-nodeport.yaml ,這個是定義了外部訪問grafana頁面的埠,我這裡配置的是31330埠,您可以按照自己的實際情況去修改
  • 另外還有三個檔案,它們不需要做任何修改,直接下載到本地即可,下載命令如下
wget https://gitee.com/zq2599/blog_download_files/raw/master/strimzi/prometheus/prometheus-additional.yaml
wget https://gitee.com/zq2599/blog_download_files/raw/master/strimzi/prometheus/prometheus-rules.yaml 
wget https://gitee.com/zq2599/blog_download_files/raw/master/strimzi/prometheus/grafana.yaml
  • 至此,我們們本地一共生成了七個檔案,這裡用表格對其做說明,請檢查確認,以免遺漏
編號 檔名 作用 是否需要修改
1 prometheus-operator-deployment.yaml 建立prometheus-operator
2 prometheus.yaml 建立prometheus
3 strimzi-pod-monitor.yaml prometheus採集pod指標的規則
4 prometheus-additional.yaml 可以在此增加prometheus的採集job
5 prometheus-rules.yaml 告警規則
6 grafana.yaml 建立grafana
7 grafana-service-nodeport.yaml grafana的服務配置檔案,埠是31330
  • 至此,所有檔案都準備好了,先執行以下命令建立prometheus-operator,再次提醒,檢查prometheus-operator-deployment.yaml的內容,很有可能因為網路問題導致此檔案為空,需要重新下載
kubectl create -f prometheus-operator-deployment.yaml
  • 執行以下命令完成prometheus和grafana的建立
kubectl apply -f prometheus-additional.yaml

kubectl apply -f strimzi-pod-monitor.yaml

kubectl apply -f prometheus-rules.yaml

kubectl apply -f prometheus.yaml

kubectl apply -f grafana.yaml

kubectl create clusterrolebinding kube-state-metrics-admin-binding \
--clusterrole=cluster-admin  \
--user=system:serviceaccount:default:prometheus-server

kubectl apply -f grafana-service-nodeport.yaml
  • 上述命令要注意的是:prometheus-operator-deployment.yaml檔案太大了,不能用kubectl apply命令,只能用kubectl create命令
  • 至此,prometheus+grafana已部署完成,接下來我們們登入grafana,匯入dashboard

實際操作之五:在grafana建立資料來源

  • dashboard就是grafana上的各種監控圖表,strimzi為我們提供了幾個樣例,我們們直接匯入即可
  • 假設我的kubernetes宿主機的IP地址是192.168.0.1,那麼grafana地址就是:192.168.0.1:31330
  • 開啟頁面後,grafana要求輸入賬號密碼,預設的賬號和密碼都是admin
  • 登入後,點選下圖黃色箭頭位置,將prometheus設定為grafana的資料來源
    在這裡插入圖片描述
  • 型別選擇prometheus
    在這裡插入圖片描述
  • prometheus地址如下圖黃色箭頭所示http://prometheus-operated:9090,最後點選底部的Save & Test按鈕,就完成了資料來源的新增,接下來可以新增dashboard(圖表)了
    在這裡插入圖片描述

在grafana建立dashboard

  • 現在,我們們只需要在grafana上新增dashboard,就能在頁面上監控kafka的各項資料了
  • 如下圖,點選黃色箭頭所指的Import按鈕
    在這裡插入圖片描述
  • 此時會出現匯入dashboard的表單,我們們只要把strimzi提供的dashboard資料貼上到下圖黃色箭頭所指區域即可
    在這裡插入圖片描述
  • strimzi提供了豐富的dashboard配置,我已蒐集好放在倉庫中,地址:https://gitee.com/zq2599/blog_download_files/tree/master/strimzi/grafana/dashboard ,如下圖,開啟紅框中的檔案,將其內容複製到上圖grafana頁面中黃色箭頭指向的位置
    在這裡插入圖片描述
  • 注意選擇資料來源
    在這裡插入圖片描述
  • 配置完成後,就能看到kafka監控資訊了
    在這裡插入圖片描述

驗證

  • 接下來我們們生產和消費一些訊息,看看grafana顯示的資料是否符合預期
  • 執行以下命令,進入生產訊息的互動模式,輸入一些訊息(每次回車都會傳送一條)
kubectl -n aabbcc \
run kafka-producer \
-ti \
--image=quay.io/strimzi/kafka:0.32.0-kafka-3.3.1 \
--rm=true \
--restart=Never \
-- bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9092 --topic my-topic
  • 生產訊息的資訊很快就在grafa圖表中體現出來,如下圖
    在這裡插入圖片描述
  • 再開啟一個控制檯,執行以下命令訊息訊息
kubectl -n aabbcc \
run kafka-consumer \
-ti \
--image=quay.io/strimzi/kafka:0.32.0-kafka-3.3.1 \
--rm=true \
--restart=Never \
-- bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9092 --topic my-topic --from-beginning
  • 數十秒後,grafana上就會看見消費訊息的指標資料,如下圖右側
    在這裡插入圖片描述

關於prometheus的儲存

  • 細心的您可能會發現:prometheus採集的資料並沒有儲存在外部,而是儲存在容器內部,這樣一旦pod被殺,資料就會丟失,情況確實如此
  • prometheus的儲存屬於prometheus-operator鄰域的配置,篇幅所限就不在本篇細說了,這裡給出一些參考資訊,您可以自己動手試試,如下圖,在prometheus.yaml檔案中,紅色箭頭所指位置可以新增pvc,這樣就能使用當前kubernetes環境的pv了,grafana的儲存配置亦是如此
    在這裡插入圖片描述

kafka檢視

  • 除了strimzi提供的grafana圖表,我們還可以使用grabana官網上的kafka圖示,最具代表性的應該是Kafka Exporter Overview,匯入方法很簡單,如下圖,在匯入表單上輸入ID號7589即可(記得點選Load按鈕,資料來源繼續選prometheus)
    在這裡插入圖片描述

  • 此dashboard的效果如下
    在這裡插入圖片描述

  • 至此,strimzi中部署監控的實戰已經完成,希望本篇能給您一些參考,助您順利完成部署,歡迎您繼續關注《strimzi實戰》系列,接下來會解鎖更多strimzi的神奇能力

歡迎關注部落格園:程式設計師欣宸

學習路上,你不孤單,欣宸原創一路相伴...

相關文章