https://www.cnblogs.com/keithtt/p/14714814.html

    1. from kubernetes import client, config, watch
    2. from elasticsearch import Elasticsearch
    3. import arrow
    4. import sys
    5. import requests
    6. import json
    7. dingding_webhook = "https://oapi.dingtalk.com/robot/send?access_token=xxxxx"
    8. hosts = [
    9. '172.16.21.39:9200',
    10. '172.16.21.40:9200',
    11. '172.16.21.41:9200'
    12. ]
    13. def send_text(content):
    14. data = {
    15. "msgtype": "text",
    16. "text": {
    17. "content": content
    18. }
    19. }
    20. requests.post(url=dingding_webhook, json=data)
    21. now = arrow.now('Asia/Shanghai')
    22. index = "kube-events"
    23. index_today = "{}.{}".format(index, now.format("YYYY.MM.DD"))
    24. cluster_name = sys.argv[1]
    25. kube_config = sys.argv[2]
    26. with Elasticsearch(hosts=hosts, timeout=120) as es:
    27. if not es.indices.exists(index=index_today):
    28. es.indices.create(index=index_today)
    29. # Configs can be set in Configuration class directly or using helper utility
    30. config.load_kube_config(config_file=kube_config)
    31. v1 = client.CoreV1Api()
    32. w = watch.Watch()
    33. try:
    34. ## 传参
    35. ## kwargs = {'filed_selector':'metadata.namespace=daiyi', 'resource_version';2934}
    36. ## for event in w.stream(v1.list_event_for_all_namespaces, **kwrags):
    37. for event in w.stream(v1.list_event_for_all_namespaces):
    38. doc = {
    39. "cluster_name": cluster_name,
    40. "time_iso8601": arrow.Arrow.fromdatetime(event['object'].metadata.creation_timestamp).isoformat(),
    41. "namespace": event['object'].metadata.namespace,
    42. "type": event['object'].type,
    43. "reason": event['object'].reason,
    44. "message": event['object'].message
    45. }
    46. # print(json.dumps(doc))
    47. # if doc["type"] == "Warning":
    48. # send_text('[ {} ]- {}'.format(cluster_name, doc["message"]))
    49. if es.exists(index=index_today, doc_type=index, id=event['object'].metadata.uid):
    50. continue
    51. es.create(index=index_today, doc_type=index, body=doc, id=event['object'].metadata.uid)
    52. except Exception as e:
    53. pass
    54. w.stop()

    使用 supervisord 将程序后台运行。

    1. [program:ali-14]
    2. command = /usr/local/bin/python3.6 /ops/scripts/kube_events.py ali-14 /ops/k8s_config/ali-14
    3. autorestart = true
    4. redirect_stderr = true
    5. stdout_logfile = /ops/logs/ali-14.log
    6. stopasgroup = true
    7. [program:m7]
    8. command = /usr/local/bin/python3.9 /ops/scripts/kube_events.py m7 /ops/k8s_config/m7
    9. autorestart = true
    10. redirect_stderr = true
    11. stdout_logfile = /ops/logs/m7.log
    12. stopasgroup = true
    13. [program:cm]
    14. command = /usr/local/bin/python3.9 /ops/scripts/kube_events.py cm /ops/k8s_config/cm
    15. autorestart = true
    16. redirect_stderr = true
    17. stdout_logfile = /ops/logs/cm.log
    18. stopasgroup = true
    19. [program:meteo]
    20. command = /usr/local/bin/python3.6 /ops/scripts/kube_events.py meteo /ops/k8s_config/meteo
    21. autorestart = true
    22. redirect_stderr = true
    23. stdout_logfile = /ops/logs/meteo.log
    24. stopasgroup = true

    写入 ES 之后就可以通过 kibana 查看了。
    python 搜集 kubernets event - 图1
    标签: kubernetes, elk