歡迎訪問我的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的指標而已,其他的並非主題,能省就省吧...
官方操作速看
- 動手前快速瀏覽官方操作指導,對基本操作有個大概瞭解(自己遇到的問題也在此指出,為您把坑提前避開)
- strimzi關於監控相關的資料連結如下圖紅色箭頭,地址是:https://strimzi.io/docs/operators/in-development/deploying.html#assembly-metrics-setup-str
-
執行kubectl apply -f kafka-metrics.yaml,這裡麵包含了Exporter(用於暴露指標),檔案kafka-metrics.yaml可以在GitHub的釋出包中找到
-
執行以下命令,生成名為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
- 執行kubectl create -f prometheus-operator-deployment.yaml,完成prometheus-operator的部署
- 修改prometheus.yml檔案,這裡面是prometheus的配置資訊,現在要修改的是namespace,改成您自己的
sed -i 's/namespace: .*/namespace: my-namespace/' prometheus.yaml
- 修改檔案strimzi-pod-monitor.yaml,找到namespaceSelector.matchNames屬性,改成自己的namespace(漏掉這一步就是致命問題,會導致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
- 部署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的神奇能力