Skip to content

get the infomation and some alert message in some event of k8s cluster with telegram bot

Notifications You must be signed in to change notification settings

NCNU-OpenSource/K8s-Telegram-Bot

Repository files navigation

K8s-Telegram-Bot

Background

在管理 k8s cluster 的時候,若是沒有使用監控的工具(ex. prometheus),就往往會需要進去 manager node 用 kubectl 下指令去觀察,比如說

kubectl describe pod pod_name ,便可以得到 pod 目前的一大堆資訊(ex. status), 管理員就必須再去從這一大包資訊中找出自己需要的。
但是用這種方式有幾個缺點 :

  1. 使用上較麻煩 : 若管理員只是想要簡單的檢查一下 k8s cluster 的資源(ex. cpu)使用情況,還要先進去 manager node 裡面下 kubectl 的指令。
  2. 不方便觀察 : 因為是全文字輸出在終端機上,所以要快速地觀察和比較資訊的變化會非常困難。
  3. 沒有通報功能 : 若 k8s cluster 出現了一些變化(ex. 有 pod 因某些原因掛掉了),k8s cluster 沒有辦法及時的通知管理員。

為了解決上述幾種缺點,於是就有了監控工具(ex. prometheus)的產生,它通常會在 node 上開一個 port 架設網頁,並藉由在 k8s cluster 內執行的 exporter 所產出的 metrics 來分析資料並做視覺化,管理員就可以藉由存取這個網頁來觀察 k8s cluster 狀態。
除此之外,它也有當發生異常狀況就寄送 e-mail 給管理員的功能。

然而,我們認為除了上述的方法監控 k8s,若是可以直接使用 telegram 和 k8s cluster 溝通(包含查詢 k8s cluster 狀態、主動發送警告給管理員)會有幾個優點 :

  1. 使用者體驗會更好,因為包含查詢 k8s cluster 狀態、telegram 發送警告,都可以直接藉由 telegram 聊天室傳達。
  2. 相對使用監控工具來說比較可以客製化要觀察的以及信件的內容。

除了監控的功能以外,若有需要常常在 k8s 中部署一些常用的系統(ex. wordpress),如果可以直接藉由 telegtam 快速地在 k8s 上部署也會很方便。

Introduction

總結我們這個系統,可以在 telegram 聊天室輸入簡單的命令做到以下功能 :

  1. 監控 k8s cluster 狀態(主動查看、被動通知)。 image

  2. 快速部署 container 在 k8s 上(我們以 wordpress 作為範例)。 image

Prerequisite

  1. k8s cluster
    • ex. microk8s
      • install microk8s
        • snap install microk8s --classic
      • my microk8s version
        • MicroK8s v1.26.5 revision 5395
  2. crontab
  3. python3
  4. mysql/mariadb

Installation

  1. git clone https://github.com/tommygood/K8s-Telegram-Bot.git
  2. install the python plugins will be used
    • pip3 install python-telegram-bot python-daemon mysql-connector matplotlib kubernetes yaml configparser
  3. exporter
    1. 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 .
    2. node exporter
      • export the metrics of each node
        • include memory, cpu and storage status
      • install
        • cd microk8s/node_exporter
        • kubectl apply -f .
    3. 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 檢查
  4. 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 .

Configuration

  1. rewrite variable of home_path in all scripts (as use the python daemon)

    • cd /path/to/telegram_bot
    • python3 setupEnv.py
  2. set your config in config.ini (prometheus host, db etc.)

    • vi /path/to/telegram_bot/config.ini
  3. dump schema.sql into database

    • mysql -u root -p telegram_db < /path/to/telegram_bot/schema.sql

Usage

  • 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 區分。

使用情境:

  1. nodeMemSecTotal

    • 介紹
      • k8s cluster 中的所有 node 的各別可被使用的 memory 的百分比
    • 理由
      • 當 node 的 memory 不夠時,如果還繼續在此 node 上部屬 pod,可能會造成 pod eviction。
        • pod eviction : 當 k8s cluster 中的 node 資源不夠時,pod 會被從此 node 中移除。
      • 此時可以考慮多新增幾台 node 到 k8s cluster 中,或是降低 replica 的數量等方式解決。
    • 輸出範例
      • 可以藉由 instance(node metric) ip 區別是哪一台 node
  2. podMemUseInNode

    • 介紹
      • 各個 node 上部屬的全部的 pod 所 request 的 memory 和 node 的 memory 的百分比
    • 理由
      • 因為 node 上除了 k8s 相關的物件,還會有別的程式佔掉記憶體,而此功能就可以讓使用者較直觀的觀察 pod 和 node 的 memory 關係。
    • 輸出範例
  3. eachConatinerMemUsage

    • 介紹
      • 各個 container 佔用了多少其限制的 memory 的百分比
    • 理由
      • 如果 container 佔用的 memory 百分比太高,可能是特殊狀況(被植入挖礦軟體),或是單純該應用程式就會佔用較多的 memory,此時管理者可以因應狀況處理。
      • 如果 container 佔用的 memory 百分比太低,可以考慮把其 request 的 memory 降低以節省空間。
    • 輸出範例
      • 會顯示是哪一個 pod
  4. nodeCpuSecTotal

    • 介紹
      • k8s cluster 中所有 node 的各別已使用的 cpu 的百分比
    • 理由
      • 當 node 的 cpu 使用量過高,可能造成系統的速度變得非常慢,或是 pod eviction。
      • 當 cpu 使用量過高,可以用不同方式解決(ex. 把一些高 cpu 使用量的 pod 移到別台 node)
    • 輸出範例
      • 可以藉由 instance(node metric) ip 區別是哪一台 node
  5. conatinerCpuPerSecTotal

    • 介紹
      • k8s cluster 中所有的 container 正在使用的所有 node 的 cpu 的百分比
    • 理由
      • 藉由觀察 cluster 內全部的 container 使用的 cpu 百分比,可以決定是否要不要再此 k8s cluster 新增 or 刪除 node 數量來達到資源最有效的運用
    • 輸出範例
      • image
  6. conatinerPerCpuUsage

    • 介紹
      • 不同 container 使用了多少其限制的 cpu 的百分比
    • 理由
      • 藉由觀察單個 container 的 cpu 使用率,可以去決定是否要把此 container 的 cpu request 調整,讓全部 container 能使用的 cpu 資源最大化。
    • 輸出範例
  7. runningPodNumInNamespace

    • 介紹
      • 各個 namespace 不同時間有多少 pod 同時執行
    • 理由
      • 有時 pod 可能因為 auto scaling 而自動被建立或刪除,所以管理員可以藉由掌握不同時間段的 pod 數量,進而得知資源被使用的情形(ex. 哪些 pod 比較常被使用),再去判斷此 pod 是否需要轉移到資源較好的 node 上部屬會較穩定。
        • auto scaling : k8s 可以有偵測到 pod 的資源若超過一定的使用上限時就會增加 pod 的 replica,藉以讓 pod 正常運作,因為有更多資源可以分配
    • 輸出範例
      • 會顯示是哪一個 namespace
  8. weirdPodNumInNamespace

    • 介紹
      • 各個 namespace 不正常 pod 的數量
    • 理由
      • 當有 pod 的狀態不正常,k8s 會嘗試重啟 pod,可能會成功或失敗。
      • 可以觀察不同時間段各個 namespace 有多少不正常運作的 pod,再去找出造成 pod 不正常的真正原因(ex. namespace 限制的資源不夠),避免再次發生。
    • 輸出範例
      • 會顯示是哪一個 namespace

自動監測通報

目前會依照 2 種不同的情況去監測,在 monitor file 當中,要再設定 crontab 要多久執行一次。

  1. weirdPod.py

    • 介紹
      • 監測是否有狀態不正常的 pod,我設定一小時執行一次。
    • 理由
      • pod 可能因為某些原因(ex. eviction)造成其狀態不正常,無法正常執行。
      • 所以需要檢查 k8s cluster 內是否有不正常運作的 pod,並印出該 pod 資訊和造成其不正常的原因
      • 因為可能需要一些時間排錯,所以不用短時間一直重複檢查
    • 輸出範例
  2. podCreate.py

    • 介紹
      • 監測是否有新的 pod 被建立,我設定每一分鐘偵測一次
    • 理由
      • 藉由得到哪些 pod 被建立的資訊,管理員可以更掌握 cluster 的資訊(ex. pod 建立超過一定量是否會讓 node 資源不夠)
    • 輸出範例

部署 WordPress

  • 介紹

    • 程式碼在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 的 nodePort
          • wp_service.yaml : 用 nodePort type 的 service 綁定剛剛建立的 deployment 的 pod
    • 部署 WordPress,完成後會回傳 WordPress 的網址
  • 使用說明

    • 必須按照步驟依序輸入 deployment 的 App Name, namepsace 的名稱, replicas 數量
    • 如果部署過程中要取消或重新部屬,可以輸入 /clear 清除記錄
    • 部署步驟
      I. /cw 開始部署 WordPress
      II. /app App名稱 輸入 deployment 的 App name
      III. /ns namespace名稱 WordPress 要建在哪個 namespace 下
      IV. /rs replicas數量 deployment 的 replicas 數量(1~3)
      V. 部署完成

資料庫

  • schema

  • table

    • all_user : 記錄使用者資訊

      • uid : 使用者的 telegram id
      • name : 使用者的 telegram 名稱
      • permission : 使用者權限(1 ~ 3)
        • 1 : 可管理 cluster 內全部的 namespace
        • 2 : 依照 table all_namespace,區分可以管理哪些 namespace
        • 3 : 無權限
    • all_namespace : 記錄使用者可使用哪些 namespace

      • id : 流水號
      • uid : 使用者的 telegram id
      • name : namespace 的名稱
    • all_command : 記錄指令資訊

      • name : 指令名稱
      • content : 指令說明
      • permission : 指令權限
    • all_wordpress : 記錄建立的 WordPress 資訊

      • id : 流水號
      • uid : 使用者的 telegram id
      • app_name : deployment 的 App name
      • namespace : namespace 的名稱
      • replicas : replicas 的數量
    • k8s_namespace : 記錄 k8s cluster 中所有的 namespace

      • id : 流水號
      • namespace : namespace 的名稱

telegram_bot

  • 使用說明
    • 所有指令最前面都要加 /
    • 一開始要先輸入 /au 註冊後才可使用所有功能,使用者預設權限是3(最小)
    • 輸入 /gu 可以查看自己的使用者資訊(id,名稱,權限)
    • 輸入 /ac 可以查看自己的權限可使用的指令與說明

Notes

Job Assignment

  • 王冠權:架設 k8s、k8s 監控和自動通報
  • 黃瑜楓:部署 WordPress on k8s、telegram-bot

Reference

About

get the infomation and some alert message in some event of k8s cluster with telegram bot

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages