kubectl describe pod pod_name
,便可以得到 pod 目前的一大堆資訊(ex. status),
管理員就必須再去從這一大包資訊中找出自己需要的。
但是用這種方式有幾個缺點 :
- 使用上較麻煩 : 若管理員只是想要簡單的檢查一下 k8s cluster 的資源(ex. cpu)使用情況,還要先進去 manager node 裡面下 kubectl 的指令。
- 不方便觀察 : 因為是全文字輸出在終端機上,所以要快速地觀察和比較資訊的變化會非常困難。
- 沒有通報功能 : 若 k8s cluster 出現了一些變化(ex. 有 pod 因某些原因掛掉了),k8s cluster 沒有辦法及時的通知管理員。
為了解決上述幾種缺點,於是就有了監控工具(ex. prometheus)的產生,它通常會在 node 上開一個 port 架設網頁,並藉由在 k8s cluster 內執行的 exporter 所產出的 metrics 來分析資料並做視覺化,管理員就可以藉由存取這個網頁來觀察 k8s cluster 狀態。
除此之外,它也有當發生異常狀況就寄送 e-mail 給管理員的功能。
然而,我們認為除了上述的方法監控 k8s,若是可以直接使用 telegram 和 k8s cluster 溝通(包含查詢 k8s cluster 狀態、主動發送警告給管理員)會有幾個優點 :
- 使用者體驗會更好,因為包含查詢 k8s cluster 狀態、telegram 發送警告,都可以直接藉由 telegram 聊天室傳達。
- 相對使用監控工具來說比較可以客製化要觀察的以及信件的內容。
除了監控的功能以外,若有需要常常在 k8s 中部署一些常用的系統(ex. wordpress),如果可以直接藉由 telegtam 快速地在 k8s 上部署也會很方便。
總結我們這個系統,可以在 telegram 聊天室輸入簡單的命令做到以下功能 :
- k8s cluster
- ex. microk8s
- install microk8s
snap install microk8s --classic
- my microk8s version
MicroK8s v1.26.5 revision 5395
- install microk8s
- ex. microk8s
- crontab
- python3
- mysql/mariadb
git clone https://github.com/tommygood/K8s-Telegram-Bot.git
- install the python plugins will be used
pip3 install python-telegram-bot python-daemon mysql-connector matplotlib kubernetes yaml configparser
- exporter
- kube-state-metrics
- export the all metrics of k8s cluster
- include the pod numbers, status and abnoraml reasons...
- install
cd microk8s/kube-state-metrics
kubectl apply -f .
- export the all metrics of k8s cluster
- node exporter
- export the metrics of each node
- include memory, cpu and storage status
- install
cd microk8s/node_exporter
kubectl apply -f .
- export the metrics of each node
- cAdvisor
- export the metrics of containers on each node
- include the usage of resource on containers
- install
- 不同 k8s 環境,設定會不同,通常預設會直接開在 node 上的 10250 or 10255 port
curl https://localhost:10250/metrics
- note : 需要去 cluster 中每一個 node 檢查
- export the metrics of containers on each node
- kube-state-metrics
- prometheus server
- configure the exporters' address in
/path/to/telegram_bot/microk8s/prometheus/prometheus-cm.yaml
-
edit
scrape_configs
:- job_name: 'exporter_name' static_configs: - targets: ['exporter_ip:exporter_port']
-
- install
cd microk8s/prometheus
kubectl apply -f .
- configure the exporters' address in
-
rewrite variable of
home_path
in all scripts (as use the python daemon)cd /path/to/telegram_bot
python3 setupEnv.py
-
set your config in
config.ini
(prometheus host, db etc.)vi /path/to/telegram_bot/config.ini
-
dump
schema.sql
into databasemysql -u root -p telegram_db < /path/to/telegram_bot/schema.sql
- start
Query
function with python daemon :python3 query.py
- start
Monitor
function with crontab :-
crontab -e
*/1 * * * * python3 /path/to/telegram_bot/monitor/podCreate.py >> /path/to/telegram_bot/log/crontab.log */60 * * * * python3 /path/to/telegram_bot/monitor/weirdPod.py >> /path/to/telegram_bot/log/crontab.log
-
目前有 8 種查詢的種類 : 在 call_prom.py
,不同功能用不同 function 區分。
使用情境:
-
nodeMemSecTotal
-
podMemUseInNode
-
eachConatinerMemUsage
-
nodeCpuSecTotal
-
conatinerCpuPerSecTotal
-
conatinerPerCpuUsage
-
runningPodNumInNamespace
-
weirdPodNumInNamespace
目前會依照 2 種不同的情況去監測,在 monitor
file 當中,要再設定 crontab 要多久執行一次。
-
weirdPod.py
-
podCreate.py
-
介紹
- 程式碼在
deployWordpress.py
- 當使用者透過 telegam bot 依序輸入 deployment 的 App name, namespace 的名稱, replicas 的數量後會呼叫
deployWordpress.py
進行部署 deployWordpress.py
包含建立 deployment 和 service- deployment
- 讀取
wp_deploy.yaml
,把 App name, namespace, replicas 改成使用者傳給 telegram bot 的資訊wp_deploy.yaml
: 包含 WordPress container 的設定
- 讀取
- service
- 讀取
wp_service.yaml
,找出未被使用的 nodePort 設為 service 的 nodePortwp_service.yaml
: 用 nodePort type 的 service 綁定剛剛建立的 deployment 的 pod
- 讀取
- deployment
- 部署 WordPress,完成後會回傳 WordPress 的網址
- 程式碼在
-
使用說明
-
table
-
all_user
: 記錄使用者資訊uid
: 使用者的 telegram idname
: 使用者的 telegram 名稱permission
: 使用者權限(1 ~ 3)- 1 : 可管理 cluster 內全部的 namespace
- 2 : 依照 table
all_namespace
,區分可以管理哪些 namespace - 3 : 無權限
-
all_namespace
: 記錄使用者可使用哪些 namespaceid
: 流水號uid
: 使用者的 telegram idname
: namespace 的名稱
-
all_command
: 記錄指令資訊name
: 指令名稱content
: 指令說明permission
: 指令權限
-
all_wordpress
: 記錄建立的 WordPress 資訊id
: 流水號uid
: 使用者的 telegram idapp_name
: deployment 的 App namenamespace
: namespace 的名稱replicas
: replicas 的數量
-
k8s_namespace
: 記錄 k8s cluster 中所有的 namespaceid
: 流水號namespace
: namespace 的名稱
-
- 使用說明
- 王冠權:架設 k8s、k8s 監控和自動通報
- 黃瑜楓:部署 WordPress on k8s、telegram-bot
- https://github.com/nalbury/promql-cli
- https://github.com/kubernetes/kube-state-metrics
- https://github.com/bibinwilson/kubernetes-node-exporter
- https://github.com/google/cadvisor/blob/master/docs/storage/prometheus.md
- https://ithelp.ithome.com.tw/articles/10248278
- https://gist.github.com/max-rocket-internet/6a05ee757b6587668a1de8a5c177728b
- https://sysdig.com/blog/prometheus-query-examples/