• 使用 python 收集 kubernetes events 并写入 elasticsearch


    from kubernetes import client, config, watch
    from elasticsearch import Elasticsearch
    import arrow
    import sys
    import requests
    import json
    
    dingding_webhook = "https://oapi.dingtalk.com/robot/send?access_token=xxxxx"
    
    hosts = [
        '172.16.21.39:9200',
        '172.16.21.40:9200',
        '172.16.21.41:9200'
    ]
    
    def send_text(content):
        data = {
            "msgtype": "text",
            "text": {
                "content": content
            }
        }
        requests.post(url=dingding_webhook, json=data)
    
    
    now = arrow.now('Asia/Shanghai')
    index = "kube-events"
    index_today = "{}.{}".format(index, now.format("YYYY.MM.DD"))
    
    cluster_name = sys.argv[1]
    kube_config = sys.argv[2]
    
    with Elasticsearch(hosts=hosts, timeout=120) as es:
        if not es.indices.exists(index=index_today):
            es.indices.create(index=index_today)
    
        # Configs can be set in Configuration class directly or using helper utility
        config.load_kube_config(config_file=kube_config)
        v1 = client.CoreV1Api()
        w = watch.Watch()
    
        try:
            for event in w.stream(v1.list_event_for_all_namespaces):
                doc = {
                    "cluster_name": cluster_name,
                    "time_iso8601": arrow.Arrow.fromdatetime(event['object'].metadata.creation_timestamp).isoformat(),
                    "namespace": event['object'].metadata.namespace,
                    "type": event['object'].type,
                    "reason": event['object'].reason,
                    "message": event['object'].message
                }
                # print(json.dumps(doc))
                # if doc["type"] == "Warning":
                #     send_text('[ {} ]- {}'.format(cluster_name, doc["message"]))
                if es.exists(index=index_today, doc_type=index, id=event['object'].metadata.uid):
                    continue
                es.create(index=index_today, doc_type=index, body=doc, id=event['object'].metadata.uid)
        except Exception as e:
            pass
    
        w.stop()
    

    使用 supervisord 将程序后台运行。

    [program:ali-14]
    command = /usr/local/bin/python3.6 /ops/scripts/kube_events.py ali-14 /ops/k8s_config/ali-14
    autorestart = true
    redirect_stderr = true
    stdout_logfile = /ops/logs/ali-14.log
    stopasgroup = true
    [program:m7]
    command = /usr/local/bin/python3.9 /ops/scripts/kube_events.py m7 /ops/k8s_config/m7
    autorestart = true
    redirect_stderr = true
    stdout_logfile = /ops/logs/m7.log
    stopasgroup = true
    [program:cm]
    command = /usr/local/bin/python3.9 /ops/scripts/kube_events.py cm /ops/k8s_config/cm
    autorestart = true
    redirect_stderr = true
    stdout_logfile = /ops/logs/cm.log
    stopasgroup = true
    [program:meteo]
    command = /usr/local/bin/python3.6 /ops/scripts/kube_events.py meteo /ops/k8s_config/meteo
    autorestart = true
    redirect_stderr = true
    stdout_logfile = /ops/logs/meteo.log
    stopasgroup = true
    

    写入 ES 之后就可以通过 kibana 查看了。

  • 相关阅读:
    27 mysql主从出现错误
    Spring各个jar包作用
    SpringBoot 的启动banner生成网址
    Joda-Time 简介
    IDEA配置GIT
    iView 发布后台管理系统 iview-admin
    Springboot的默认定时任务——Scheduled注解
    如何使用java validation api进行参数校验----Hibernate-Validation
    Vue的安装及使用快速入门
    springboot整合shiro应用
  • 原文地址:https://www.cnblogs.com/keithtt/p/14714814.html
Copyright © 2020-2023  润新知