From 97020c935f5a7d4814c71b62240444adca97f9bb Mon Sep 17 00:00:00 2001
From: dustoair <107600816+dustoair@users.noreply.github.com>
Date: Thu, 4 Aug 2022 18:45:01 +0800
Subject: [PATCH] open src
---
.gitignore | 12 +
.idea/.gitignore | 8 +
.../inspectionProfiles/profiles_settings.xml | 6 +
.idea/k8sZabbix.iml | 10 +
.idea/misc.xml | 4 +
.idea/modules.xml | 8 +
get_k8s.py | 140 ++
readme.md | 1376 +++++++++++++++++
requirements.txt | 2 +
9 files changed, 1566 insertions(+)
create mode 100644 .gitignore
create mode 100644 .idea/.gitignore
create mode 100644 .idea/inspectionProfiles/profiles_settings.xml
create mode 100644 .idea/k8sZabbix.iml
create mode 100644 .idea/misc.xml
create mode 100644 .idea/modules.xml
create mode 100644 get_k8s.py
create mode 100644 readme.md
create mode 100644 requirements.txt
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f4b7529
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,12 @@
+venv
+.idea
+big.txt
+big.txt.gz
+big.txt.gz.gpg
+big.txt.gpg
+big.txt.lzma
+big.txt.lzma.gpg
+big.txt.lzma.gpg.gpg
+big.txt.lzma.gpg.gpg.gpg
+dump.txt
+test.txt
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/k8sZabbix.iml b/.idea/k8sZabbix.iml
new file mode 100644
index 0000000..74d515a
--- /dev/null
+++ b/.idea/k8sZabbix.iml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..71daf0a
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..1c8354a
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/get_k8s.py b/get_k8s.py
new file mode 100644
index 0000000..d20a5db
--- /dev/null
+++ b/get_k8s.py
@@ -0,0 +1,140 @@
+#!/usr/bin/python3
+import json
+import datetime
+import sys
+import os
+import math
+import urllib3
+import requests
+import re
+
+urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
+
+zabbix_sender = "/usr/local/zabbix/bin/zabbix_sender"
+zabbix_server = "192.168.1.233"
+clientname = "k8s_master"
+
+# k8s的api地址
+url = "https://192.168.1.140:6443"
+
+# k8s的token
+token = "e11111111-k8s-token-111111w"
+
+
+def get_result(api_name):
+ headers = {"Authorization": "Bearer " + token}
+ json_data = requests.get(url + api_name, headers=headers, verify=False)
+ return json_data.json()
+
+
+# 时间转换,把所有服务的创建时间变成运行时间
+def Trantime(time_data):
+ time = re.match(r"(\d+)-(\d+)-(\d+).*?(\d+):(\d+):(\d+)", time_data)
+ total_send = round((datetime.datetime.now() - datetime.datetime(int(time.group(1)), int(time.group(2)),
+ int(time.group(3)), int(time.group(4)),
+ int(time.group(5)),
+ int(time.group(6)))).total_seconds())
+ return str(math.floor(total_send / 86400)).split(".")[0] + "d" + \
+ str(math.floor((total_send % 86400) / 3600)).split(".")[0] + "h"
+
+
+# 把所有的单位转换成b
+def Tranunit(unit_data):
+ unit = re.match(r"(\d+)(.*)", unit_data)
+ value = int(unit.group(1))
+ if unit.group(2) == "K":
+ return value * 1000
+ elif unit.group(2) == "Ki":
+ return value * 1024
+ elif unit.group(2) == "M":
+ return value * 1000 * 1000
+ elif unit.group(2) == "Mi":
+ return value * 1024 * 1024
+ elif unit.group(2) == "G":
+ return value * 1000 * 1000 * 1000
+ elif unit.group(2) == "Gi":
+ return value * 1024 * 1024 * 1024
+ elif unit.group(2) == "n":
+ return math.ceil(value / 1000 / 1000)
+ elif unit.group(2) == "m":
+ return value
+ else:
+ return value
+
+
+# 对数据进行zabbix_sender发送
+def send_data(data, dis_key, key):
+ result = json.dumps({"data": data}, sort_keys=True, ensure_ascii=False)
+ cmd = "{0} -z {1} -s {2} -k {3} -o '{4}'>/dev/null".format(zabbix_sender, zabbix_server, clientname, dis_key,
+ result)
+ os.system(cmd)
+ for i in data:
+ for value in i.keys():
+ if value != "{#NAME}":
+ cmd = "{0} -z {1} -s {2} -k {3}[{4}.{5}] -o '{6}'>/dev/null".format(zabbix_sender, zabbix_server,
+ clientname, key, i["{#NAME}"],
+ i[value][0], i[value][1])
+ os.system(cmd)
+ print(cmd)
+
+
+# 获取所有k8s节点的信息
+def get_node():
+ get_nodes = []
+ node_result = get_result("/api/v1/nodes")
+ node_use_result = get_result("/apis/metrics.k8s.io/v1beta1/nodes")
+ for j in node_use_result.get("items"):
+ for i in node_result.get("items"):
+ if i.get("metadata").get("name") == j.get("metadata").get("name"):
+ data = {"{#NAME}": i.get("metadata").get("name"),
+ "{#STATUS}": ["status", i.get("status").get("conditions")[-1].get("type") if
+ i.get("status").get("conditions")[-1].get("status") == "True" else "NotReady"],
+ "{#IP}": ["ip", i.get("status").get("addresses")[0].get("address")],
+ "{#KUBELET_VERSION}": ["version", i.get("status").get("nodeInfo").get("kubeletVersion")],
+ "{#OS_IMAGE}": ["os_image", i.get("status").get("nodeInfo").get("osImage")],
+ "{#CPU}": ["cpu", i.get("status").get("capacity").get("cpu")],
+ "{#MEMORY}": ["memory", Tranunit(i.get("status").get("capacity").get("memory"))],
+ "{#LIMIT_STORAGE}": ["storage",
+ Tranunit(i.get("status").get("capacity").get("ephemeral-storage"))],
+ "{#RUNTIME}": ["runtime", Trantime(i.get("metadata").get("creationTimestamp"))],
+ "{#USECPU}": ["usecpu", Tranunit(j.get("usage").get("cpu"))],
+ "{#USEMEMORY}": ["usememory", Tranunit(j.get("usage").get("memory"))]
+ }
+
+ get_nodes.append(data)
+ send_data(get_nodes, "getnode", "node")
+
+
+# 获取k8s组件的健康信息
+def get_health():
+ get_healths = []
+ health_result = get_result("/api/v1/componentstatuses")
+ for i in health_result.get("items"):
+ data = {}
+ data = {"{#NAME}": i.get("metadata").get("name"),
+ "{#STATUS}": ["status", i.get("conditions")[0].get("type")],
+ "{#MESSAGE}": ["message", i.get("conditions")[0].get("message")]
+ }
+ get_healths.append(data)
+ send_data(get_healths, "gethealth", "health")
+
+
+# 获取k8s的所有pod
+def get_pod():
+ get_pods = []
+ pod_result = get_result("/api/v1/pods")
+ for i in pod_result.get("items"):
+ data = {"{#NAME}": i.get("metadata").get("name"),
+ "{#RUNTIME}": ["runtime", Trantime(i.get("metadata").get("creationTimestamp"))],
+ "{#STATUS}": ["status", i.get("status").get("phase")],
+ "{#RESTARTCOUNT}": ["restartcount", i.get("status").get("containerStatuses")[0].get("restartCount")]
+ }
+
+ get_pods.append(data)
+ send_data(get_pods, "getpod", "pod")
+
+
+if __name__ == "__main__":
+ cmd = "{0}()".format(sys.argv[1])
+ eval(cmd)
+ print("采集完成")
diff --git a/readme.md b/readme.md
new file mode 100644
index 0000000..a391145
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,1376 @@
+获取k8s的api地址
+```bash
+cat /etc/kubernetes/kubelet.conf |grep server
+```
+
+在K8S 的Master主机执行命令,生成令牌:
+```bash
+kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
+```
+
+
+调用:
+```bash
+#!/usr/bin/bash
+/usr/bin/python3 get_k8s.py get_pod
+/usr/bin/python3 get_k8s.py get_health
+/usr/bin/python3 get_k8s.py get_node
+```
+
+
+xml模板:
+```xml
+
+
+ 4.2
+ 2020-06-12T08:42:43Z
+
+
+ 中间件模板
+
+
+
+
+ k8sTemplate
+ k8s监控模板
+
+
+
+ 中间件模板
+
+
+
+
+ component
+
+
+ health
+
+
+ k8s
+
+
+ node
+
+
+ pod
+
+
+
+ -
+ 获取k8s的脚本
+ 10
+
+
+ get_k8s
+ 180s
+ 90d
+ 0
+ 0
+ 1
+
+
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+ k8s
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+
+ 获取k8s的健康信息
+ 2
+
+
+ gethealth
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+
+ 30d
+
+
+
+ {#NAME}的健康信息
+ 2
+
+
+ health[{#NAME}.message]
+ 0
+ 7d
+ 0
+ 0
+ 1
+
+
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+ health
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+ {#NAME}的状态
+ 2
+
+
+ health[{#NAME}.status]
+ 0
+ 7d
+ 0
+ 0
+ 1
+
+
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+ health
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+ {k8sTemplate:health[{#NAME}.status].diff(Healthy)}=1
+ 0
+
+ {#NAME}监控状态异常
+ 0
+
+
+ 0
+ 3
+
+ 0
+ 1
+
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+
+ 获取所有NODE节点信息
+ 2
+
+
+ getnode
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+
+ 7d
+
+
+
+ 节点{#NAME}的CPU个数
+ 2
+
+
+ node[{#NAME}.cpu]
+ 0
+ 7d
+ 365d
+ 0
+ 3
+
+
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+ node
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+ 节点{#NAME}的IP
+ 2
+
+
+ node[{#NAME}.ip]
+ 0
+ 7d
+ 0
+ 0
+ 1
+
+
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+ node
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+ 节点{#NAME}的内存
+ 2
+
+
+ node[{#NAME}.memory]
+ 0
+ 7d
+ 365d
+ 0
+ 3
+
+ B
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+ node
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+ 节点{#NAME}的操作系统
+ 2
+
+
+ node[{#NAME}.os_image]
+ 0
+ 7d
+ 0
+ 0
+ 1
+
+
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+ node
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+ 节点{#NAME}运行时间
+ 2
+
+
+ node[{#NAME}.runtime]
+ 0
+ 7d
+ 0
+ 0
+ 1
+
+
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+ node
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+ 节点{#NAME}的状态
+ 2
+
+
+ node[{#NAME}.status]
+ 0
+ 7d
+ 0
+ 0
+ 1
+
+
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+ node
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+ 节点{#NAME}的硬盘大小
+ 2
+
+
+ node[{#NAME}.storage]
+ 0
+ 7d
+ 365d
+ 0
+ 3
+
+ B
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+ node
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+ 节点{#NAME}的已使用CPU数
+ 2
+
+
+ node[{#NAME}.usecpu]
+ 0
+ 7d
+ 365d
+ 0
+ 3
+
+ m
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+ 1000m等于1个CPU数,1000n*1000n的等于1m
+ 0
+
+
+ node
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+ 节点{#NAME}已使用内存
+ 2
+
+
+ node[{#NAME}.usememory]
+ 0
+ 7d
+ 365d
+ 0
+ 3
+
+ B
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+ node
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+ 节点{#NAME}的kubectl版本
+ 2
+
+
+ node[{#NAME}.version]
+ 0
+ 7d
+ 0
+ 0
+ 1
+
+
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+ node
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+ {#NAME}的CPU使用率
+ 15
+
+
+ usecpu[{#NAME}]
+ 60s
+ 90d
+ 365d
+ 0
+ 3
+
+ %
+
+
+ 0
+ 0
+
+ 0
+
+ last("node[{#NAME}.usecpu]")/(last("node[{#NAME}.cpu]")*1000)*100
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+ node
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+ {#NAME}的内存使用率
+ 15
+
+
+ usememory[{#NAME}]
+ 60s
+ 90d
+ 365d
+ 0
+ 3
+
+ %
+
+
+ 0
+ 0
+
+ 0
+
+ last("node[{#NAME}.usememory]")/last("node[{#NAME}.memory]")*100
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+ node
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+ {k8sTemplate:node[{#NAME}.status].diff(Ready)}=1
+ 0
+
+ 节点{#NODENAME}状态异常
+ 0
+
+
+ 0
+ 2
+
+ 0
+ 1
+
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+
+ 获取所有pod信息
+ 2
+
+
+ getpod
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+
+ 7d
+
+
+
+ pod_{#NAME}的重启次数
+ 2
+
+
+ pod[{#NAME}.restartcount]
+ 0
+ 90d
+ 365d
+ 0
+ 3
+
+
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+ pod
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+ pod_{#NAME}的运行时间
+ 2
+
+
+ pod[{#NAME}.runtime]
+ 0
+ 90d
+ 0
+ 0
+ 1
+
+
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+ pod
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+ pod_{#NAME}的状态
+ 2
+
+
+ pod[{#NAME}.status]
+ 0
+ 90d
+ 0
+ 0
+ 1
+
+
+
+
+ 0
+ 0
+
+ 0
+
+
+
+ 0
+
+
+
+
+
+
+ 0
+
+
+ pod
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+ {k8sTemplate:pod[{#NAME}.status].diff(Running)}=1
+ 0
+
+ pod节点{#NAME}状态异常
+ 0
+
+
+ 0
+ 4
+
+ 0
+ 1
+
+
+
+
+
+
+
+ 3s
+
+
+
+ 200
+ 1
+ 0
+
+
+ 0
+ 0
+ 0
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..5675524
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,2 @@
+urllib3
+requests
\ No newline at end of file