Ad Widget

Collapse

Мониторинг Rancher Node Status

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • SergeyL
    Member
    • Jan 2022
    • 89

    #1

    Мониторинг Rancher Node Status

    Доброго времени суток коллеги. Хочу мониторить статус своих Нод и передавать данные в Zabbix , т.к. у меня уже есть Rancher и он видит статус ноды, решил не плодить агентов в kubernetes, а обращаться к rancher, сканировать список Кластеров, а так же их Ноды и отправлять мне ИП ноды, которая не активна. Написал python скрипт(работает):
    Code:
    import requests
    import base64
    
    RANCHER_URL = ваши данные
    RANCHER_ACCESS_KEY = ваши данные
    RANCHER_SECRET_KEY = ваши данные
    
    def are_nodes_active(cluster_id):
    credentials = f'{RANCHER_ACCESS_KEY}:{RANCHER_SECRET_KEY}'
    base64_credentials = base64.b64encode(credentials.encode()).decode()
    
    headers = {
    'Content-Type': 'application/json',
    'Authorization': f'Basic {base64_credentials}',
    }
    
    try:
    nodes_response = requests.get(f'{RANCHER_URL}/clusters/{cluster_id}/nodes', headers=headers, verify=True)
    
    if nodes_response.status_code == 200:
    nodes = nodes_response.json()['data']
    active_nodes = [node for node in nodes if node['state'] == 'active']
    inactive_nodes = [node for node in nodes if node['state'] != 'active']
    return active_nodes, inactive_nodes
    else:
    print(f"Failed to get nodes in cluster {cluster_id}. Status Code:", nodes_response.status_code)
    return None, None
    
    except requests.exceptions.RequestException as e:
    print(f"An error occurred during the request: {e}")
    return None, None
    
    def get_clusters(headers):
    try:
    clusters_response = requests.get(f'{RANCHER_URL}/clusters', headers=headers, verify=True)
    
    if clusters_response.status_code == 200:
    clusters = clusters_response.json()['data']
    return clusters
    else:
    print("Failed to get clusters. Status Code:", clusters_response.status_code)
    return None
    
    except requests.exceptions.RequestException as e:
    print(f"An error occurred during the request: {e}")
    return None
    
    if __name__ == '__main__':
    headers = {
    'Content-Type': 'application/json',
    'Authorization': f'Basic {base64.b64encode((RANCHER_ACCESS_KEY + ":" + RANCHER_SECRET_KEY).encode()).decode()}',
    }
    
    clusters = get_clusters(headers)
    
    if clusters is not None:
    for cluster in clusters:
    cluster_id = cluster['id']
    print(f"Scanning cluster {cluster_id}...")
    active_nodes, inactive_nodes = are_nodes_active(cluster_id)
    if active_nodes is not None and inactive_nodes is not None:
    if not inactive_nodes:
    print(f"Cluster {cluster_id}: All nodes are active.")
    else:
    print(f"Cluster {cluster_id}: Some nodes are not active:")
    for node in inactive_nodes:
    print(f" Node ID: {node['id']}, IP: {node['ipAddress']}")
    ​

    Дальше хочу так же динамически запихнуть все это в Zabbix и настроить уведомления + возможно дашборды.
    Далее по плану сохранять результаты скрипта в JSON, создать Zabbix Trapper Item и передавать в него инфу с помощью Zabbix-Sender....

    Вопрос:
    Не придумываю ли я велосипед и возможно, кто то сможет подсказать другое решение, хотя бы, что касается Zabbix части.
    Спасибо.
  • Andrew Grekhov
    Member
    • Aug 2021
    • 45

    #2
    'результаты скрипта в JSON' согласен.
    Мне лично не нравится как в zabbix'е сделано оттображение графиков "Trapper Item". Я бы сделал вызов скрипта через UserRules в агенте.
    Потом сам сервер дёргает когда надо в "мастер ячейку", и далее куча зависимых item от неё с парсингом json.
    Про discavery сразу продумай, явно просится автоматизация.

    Comment

    Working...