На одном проекте была проблемка с одним из каналов 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()