Модули Kubernetes Запускают уведомления о перезапуске на канале моей команды

#microsoft-teams #azure-aks

Вопрос:

Мои модули работают на кластере AKS. Всякий раз, когда мои модули перезапускались, я должен был получать уведомление на канале моей команды, есть ли какие-либо статьи или команды для настройки уведомления?

Комментарии:

1. Эй, Входящий Webhook позволяет любым внешним приложениям отправлять уведомления по каналам команд. Пожалуйста, обратитесь к — Веб- крючки и соединитель и создайте входящий веб-крючок

Ответ №1:

Для этого же вы можете использовать инструменты или приложения, такие как botkube : https://www.botkube.io/

Также проверьте Kubewatch : https://github.com/bitnami-labs/kubewatch

Вы также можете реализовать Grafana с помощью Prometheus и диспетчера оповещений для мониторинга и получения системы оповещений. : https://github.com/grafana-operator/grafana-operator

Однако, если вы не можете найти какие-либо инструменты или приложения, вы можете записать пользовательский сценарий python, node или любого языка, с которым вы хорошо знакомы, и отслеживать любое событие перезапуска модуля и отправлять событие slack hook.

Поделившись одним примером кода python с проверкой запуска или сбоя модуля и отправкой уведомления slack, вы можете обновить логику в соответствии с потребностями.

 from kubernetes import client, config, watch
import json
import requests
import time
logger = logging.getLogger('k8s_events')
logger.setLevel(logging.DEBUG)

# If running inside pod
#config.load_incluster_config()

# If running locally
config.load_kube_config()

v1 = client.CoreV1Api()
v1ext = client.ExtensionsV1beta1Api() 

w = watch.Watch()

mydict={}

webhook_url = '';

while True:
    pod_list= v1.list_namespaced_pod("default");
    for i in pod_list.items:
        for c in i.status.container_statuses:
            if(c.ready == True):
                if i.metadata.name in mydict:
                    print("Inside mydict If");
                    print("Pod updated : ",i.metadata.name);
                    print("My dict value : ",mydict);
                    mydict[i.metadata.name]['end_time'] = i.status.conditions[1].last_transition_time;
                    dt_started = mydict[i.metadata.name]['start_time'].replace(tzinfo=None);
                    dt_ended = mydict[i.metadata.name]['end_time'].replace(tzinfo=None);
                    duration = str((dt_ended - dt_started).total_seconds())   ' Sec';
                    fields =  [{"title": "Status", "value": "READY", "short": False }, {"title": "Pod name", "value": i.metadata.name, "short": False }, {"title": "Duration", "value": duration, "short": False }, {"title": "Service name", "value": c.name, "short": False } ]
                    if c.name not in ('conversation-auto-close-service-scheduler','admin-service-trail-fllow-up-scheduler','bot-trial-email-scheduler','conversation-service-scheduler','faq-service-scheduler','nlp-service-scheduler','refresh-add-on-scheduler','response-sheet-scheduler'):
                        text = c.name   " Pod is started"; 
                        data = {"text": text, "mrkdwn": True, "attachments" : [{"color": "#FBBC05", "title": "Pod Details", "fields" : fields, "footer": "Manvar", "footer_icon": "https://cdn.test.manvar.com/assets/manvar-icon.png"}, ], }
                        print("Final data to post: ",data);
                        response = requests.post(webhook_url, data=json.dumps(data),headers={'Content-Type': 'application/json'});
                        del mydict[i.metadata.name]
                        if response.status_code != 200:
                            raise ValueError('Request to slack returned an error %s, the response is:n%s' % (response.status_code, response.text));
                time.sleep(1);
            else:
                mydict[i.metadata.name] = {"start_time": i.status.conditions[0].last_transition_time,"end_time": i.status.conditions[1].last_transition_time};