From cad7c23dac74b03816d487246575beb13dc1546a Mon Sep 17 00:00:00 2001 From: Udo Waechter Date: Sun, 18 Oct 2020 23:16:38 +0200 Subject: [PATCH] we're suddenly a python thing :) --- .project | 6 +++ .pydevproject | 5 +++ _scripts/get_resources.py | 73 +++++++++++++++++++++++++++++++++++ _scripts/kubernetes_units.txt | 20 ++++++++++ 4 files changed, 104 insertions(+) create mode 100644 .pydevproject create mode 100755 _scripts/get_resources.py create mode 100644 _scripts/kubernetes_units.txt diff --git a/.project b/.project index 9ae3f8e..97bb307 100644 --- a/.project +++ b/.project @@ -5,7 +5,13 @@ + + org.python.pydev.PyDevBuilder + + + + org.python.pydev.pythonNature diff --git a/.pydevproject b/.pydevproject new file mode 100644 index 0000000..2b04565 --- /dev/null +++ b/.pydevproject @@ -0,0 +1,5 @@ + + + Default + python interpreter + diff --git a/_scripts/get_resources.py b/_scripts/get_resources.py new file mode 100755 index 0000000..f35a176 --- /dev/null +++ b/_scripts/get_resources.py @@ -0,0 +1,73 @@ +#!/usr/bin/python3 +import kubernetes as k8s + +from pint import UnitRegistry +from collections import defaultdict + +__all__ = ["compute_allocated_resources"] + + +def compute_allocated_resources(): + ureg = UnitRegistry() + ureg.load_definitions('kubernetes_units.txt') + + Q_ = ureg.Quantity + data = {} + + # doing this computation within a k8s cluster + k8s.config.load_kube_config() + core_v1 = k8s.client.CoreV1Api() + +# print("Listing pods with their IPs:") +# ret = core_v1.list_pod_for_all_namespaces(watch=False) +# for i in ret.items: +# print("%s\t%s\t%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name)) + + for node in core_v1.list_node().items: + + stats = {} + node_name = node.metadata.name + allocatable = node.status.allocatable + max_pods = int(int(allocatable["pods"]) * 1.5) +# print("{} ALLOC: {} MAX_PODS: {}".format(node_name,allocatable,max_pods)) + field_selector = ("status.phase!=Succeeded,status.phase!=Failed," + + "spec.nodeName=" + node_name) + + stats["cpu_alloc"] = Q_(allocatable["cpu"]) + stats["mem_alloc"] = Q_(allocatable["memory"]) + + pods = core_v1.list_pod_for_all_namespaces(limit=max_pods, + field_selector=field_selector).items + + # compute the allocated resources + cpureqs, cpulmts, memreqs, memlmts = [], [], [], [] + for pod in pods: + for container in pod.spec.containers: + res = container.resources + reqs = defaultdict(lambda: 0, res.requests or {}) + lmts = defaultdict(lambda: 0, res.limits or {}) + cpureqs.append(Q_(reqs["cpu"])) + memreqs.append(Q_(reqs["memory"])) + cpulmts.append(Q_(lmts["cpu"])) + memlmts.append(Q_(lmts["memory"])) + + stats["cpu_req"] = sum(cpureqs) + stats["cpu_lmt"] = sum(cpulmts) + stats["cpu_req_per"] = (stats["cpu_req"] / stats["cpu_alloc"] * 100) + stats["cpu_lmt_per"] = (stats["cpu_lmt"] / stats["cpu_alloc"] * 100) + + stats["mem_req"] = sum(memreqs) + stats["mem_lmt"] = sum(memlmts) + stats["mem_req_per"] = (stats["mem_req"] / stats["mem_alloc"] * 100) + stats["mem_lmt_per"] = (stats["mem_lmt"] / stats["mem_alloc"] * 100) + + data[node_name] = stats + + return data + +if __name__ == "__main__": + # execute only if run as a script + print(compute_allocated_resources()) + + + \ No newline at end of file diff --git a/_scripts/kubernetes_units.txt b/_scripts/kubernetes_units.txt new file mode 100644 index 0000000..6a73f51 --- /dev/null +++ b/_scripts/kubernetes_units.txt @@ -0,0 +1,20 @@ +# memory units + +kmemunits = 1 = [kmemunits] +Ki = 1024 * kmemunits +Mi = Ki^2 +Gi = Ki^3 +Ti = Ki^4 +Pi = Ki^5 +Ei = Ki^6 + +# cpu units + +kcpuunits = 1 = [kcpuunits] +m = 1/1000 * kcpuunits +k = 1000 * kcpuunits +M = k^2 +G = k^3 +T = k^4 +P = k^5 +E = k^6