Рестартим rabbitmq в k8s с помощью python

0
(0)

На одном проекте была проблемка с одним из каналов rabbitmq, там при достижении более 500 коннектов начинались задержки, точных подробностей увы уже не помню, но зато осталось workaround решение в виде небольшого python скрипта. На него сегодня и посмотрим.

Python
import requests
from kubernetes import client, config
import base64
import datetime

## Имя секреты с кредами для реббита в кубе
secret = "rabbitbroker"
rabbitmq_user = "user"
url = "https://domain/api/connections"

### Получаем пароль из секрета тут
def secret_rabbitmq_parser(secret):
    v1 = client.CoreV1Api()
    secret = v1.read_namespaced_secret(secret, "rabbitmq").data['rabbitmq-password']
    secret = base64.b64decode(secret).decode('utf-8')
    return secret

### Отправляем GET запрос 
def send_request(url, user, password):
    r = requests.get(url = url, auth=(user, password))
    return r.json()

### Собственно рестарт деплоймента раббита, простым проставлением аннотации
def restart_deployment(deployment_name, namespace):
    v1 = client.AppsV1Api()
    now = datetime.datetime.utcnow()
    now = str(now.isoformat("T") + "Z")
    body = {
        'spec': {
            'template':{
                'metadata': {
                    'annotations': {
                        'kubectl.kubernetes.io/restartedAt': now
                    }
                }
            }
        }
    }
    v1.patch_namespaced_deployment(deployment_name, namespace, body, pretty="true")

def main():
    ### Подгружаем кастомный kubeconfig
    config.load_kube_config(config_file='./kubeconfig')
    rabbitmq_password = secret_rabbitmq_parser(secret)
    data = send_request(url, rabbitmq_user, rabbitmq_password)
    ### В цикле пробигаем по connections из запроса в api rabbit
    for i in data:
        ### Получаем значение ключа user_provided_name
        app = i["user_provided_name"]
       ### Получаем кол-во коннектов
        app_channels = int(i["channels"])
        ### Если коннекты больше или равно 500 и в app нет строки exсept_this_word
        ### Выполняем рестарт
        if app_channels >= 500 and app.find("exсept_this_word") == -1:
            restart_deployment(app, "finstory")
            
if __name__ == "__main__":
    main()

Насколько статья полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Оставить комментарий