Skip to content

Commit 4ba58f6

Browse files
relrodnigelgbanks
authored andcommitted
Revert "19446 Kubernetes CPU and Memory resource services: Support Pod-level limits and requests"
This reverts commit 02dbc44. Reason for revert: Generates crash on first check-cycle after upgrade Change-Id: I035f2ea3ea636d7eb1824d51c122fb4f2bc54e8c
1 parent 468fd2c commit 4ba58f6

15 files changed

Lines changed: 82 additions & 720 deletions

File tree

.werks/19446.md

Lines changed: 0 additions & 29 deletions
This file was deleted.

cmk/plugins/collection/checkman/kube_cpu

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@ description:
77
This check shows the CPU usage of a Kubernetes object, its requests utilization and its limits
88
utilization.
99

10-
Requests utilization is the CPU usage divided by the configured CPU requests of the Kubernetes
11-
object. For pods without pod-level requests, the sum of container requests is used. For pods with
12-
pod-level requests, the pod-level value takes precedence so long as the pod-level value is
13-
non-zero. Limits utilization is computed in the same manner. The utilization percentage values
14-
are omitted if any of the associated request/limit values are not configured. Moreover, limits
10+
Requests utilization is the CPU usage divided by the sum of all configured container CPU
11+
requests. Limits utilization is computed in the same manner. The utilization percentage values are
12+
omitted if any of the associated request/limit value are not configured. Moreover, limits
1513
utilization is omitted if any container has a limit of zero. The reason for omission is displayed
1614
in the check's details.
1715

cmk/plugins/collection/checkman/kube_memory

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,11 @@ description:
77
This check shows the memory usage of a Kubernetes object, its requests utilization and its limits
88
utilization.
99

10-
Requests utilization is the memory usage divided by the configured memory requests of the
11-
Kubernetes object. For pods without pod-level requests, the sum of container requests is used.
12-
For pods with pod-level requests, the pod-level value takes precedence so long as the pod-level
13-
value is non-zero. Limits utilization is computed in the same manner. The utilization percentage
14-
values are omitted if any of the associated request/limit values are not configured. Moreover,
15-
limits utilization is omitted if any container has a limit of zero. The reason for omission is
16-
displayed in the check's details.
10+
Requests utilization is the memory usage divided by the sum of all configured container memory
11+
requests. Limit utilization is computed in the same manner. The utilization percentage values are
12+
omitted if any of the associated request/limit value are not configured. Moreover, limits
13+
utilization is omitted if any container has a limit of zero. The reason for omission is displayed
14+
in the check's details.
1715

1816
The primary metric driving Kubernetes' memory-based restart decisions is
1917
container_memory_working_set_bytes. The plug-in reports this metric under the label "Usage".
@@ -35,7 +33,7 @@ description:
3533
The check requires that the special agent kube is configured.
3634

3735
For the Checkmk Openshift monitoring, the reported metric values will differ from the values
38-
reported on the Openshift dashboard as the included values describe a different quantity.
36+
reported on the Openshift dashboard as as the included values describe a different quantity.
3937

4038
discovery:
4139
One service is created per Kubernetes object.

cmk/plugins/kube/agent_handlers/common.py

Lines changed: 21 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -124,65 +124,28 @@ def kube_object_namespace_name(kube_object: KubeNamespacedObj) -> NamespaceName:
124124

125125

126126
def aggregate_resources(
127-
resource_type: Literal["memory", "cpu"], pods: Sequence[api.Pod]
127+
resource_type: Literal["memory", "cpu"], containers: Collection[api.ContainerSpec]
128128
) -> section.Resources:
129-
# requests
130-
total_request = 0.0 # sum of all requests (pod-level or container-level)
131-
count_unspecified_requests = 0 # containers without a request set
132-
count_total_requests = 0 # containers from pods using container-level requests
133-
count_pods_pod_level_request = 0 # pods with a non-zero pod-level request
134-
135-
# limits
136-
total_limit = 0.0 # sum of all limits (pod-level or container-level)
137-
count_unspecified_limits = 0 # containers without a limit set
138-
count_zeroed_limits = 0 # containers with limit==0 (unlimited)
139-
count_total_limits = 0 # containers from pods using container-level limits
140-
count_pods_pod_level_limit = 0 # pods with a non-zero pod-level limit
141-
142-
for pod in pods:
143-
pod_request = getattr(pod.spec.resources.requests, resource_type)
144-
pod_limit = getattr(pod.spec.resources.limits, resource_type)
145-
containers = pod.spec.containers
146-
147-
if pod_request is not None and pod_request: # also handles: 0 -> unlimited
148-
total_request += pod_request
149-
count_pods_pod_level_request += 1
150-
else:
151-
specified_requests = [
152-
request
153-
for c in containers
154-
if (request := getattr(c.resources.requests, resource_type)) is not None
155-
]
156-
total_request += sum(specified_requests)
157-
count_unspecified_requests += len(containers) - len(specified_requests)
158-
count_total_requests += len(containers)
159-
160-
if pod_limit is not None and pod_limit: # also handles: 0 -> unlimited
161-
total_limit += pod_limit
162-
count_pods_pod_level_limit += 1
163-
else:
164-
specified_limits = [
165-
limit
166-
for c in containers
167-
if (limit := getattr(c.resources.limits, resource_type)) is not None
168-
]
169-
total_limit += sum(specified_limits)
170-
count_unspecified_limits += len(containers) - len(specified_limits)
171-
count_zeroed_limits += sum(1 for x in specified_limits if x == 0)
172-
count_total_limits += len(containers)
129+
specified_requests = [
130+
request
131+
for c in containers
132+
if (request := getattr(c.resources.requests, resource_type)) is not None
133+
]
134+
specified_limits = [
135+
limit
136+
for c in containers
137+
if (limit := getattr(c.resources.limits, resource_type)) is not None
138+
]
139+
140+
count_total = len(containers)
173141

174142
return section.Resources(
175-
request=total_request,
176-
limit=total_limit,
177-
# requests
178-
count_unspecified_requests=count_unspecified_requests,
179-
count_total_requests=count_total_requests,
180-
count_pods_pod_level_request=count_pods_pod_level_request,
181-
# limits
182-
count_unspecified_limits=count_unspecified_limits,
183-
count_zeroed_limits=count_zeroed_limits,
184-
count_total_limits=count_total_limits,
185-
count_pods_pod_level_limit=count_pods_pod_level_limit,
143+
request=sum(specified_requests),
144+
limit=sum(specified_limits),
145+
count_unspecified_requests=count_total - len(specified_requests),
146+
count_unspecified_limits=count_total - len(specified_limits),
147+
count_zeroed_limits=sum(1 for x in specified_limits if x == 0),
148+
count_total=count_total,
186149
)
187150

188151

@@ -198,11 +161,11 @@ def thin_containers(pods: Collection[api.Pod]) -> section.ThinContainers:
198161

199162

200163
def collect_memory_resources_from_api_pods(pods: Sequence[api.Pod]) -> section.Resources:
201-
return aggregate_resources("memory", pods)
164+
return aggregate_resources("memory", [c for pod in pods for c in pod.spec.containers])
202165

203166

204167
def collect_cpu_resources_from_api_pods(pods: Sequence[api.Pod]) -> section.Resources:
205-
return aggregate_resources("cpu", pods)
168+
return aggregate_resources("cpu", [c for pod in pods for c in pod.spec.containers])
206169

207170

208171
def pod_resources_from_api_pods(pods: Sequence[api.Pod]) -> section.PodResources:

cmk/plugins/kube/from_json/pod/pod_spec.py

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from typing import Literal, NotRequired, TypedDict
77

88
from ...schemata import api
9-
from ..resources import JSONResourceRequirements
109
from .container_spec import containers_spec, JSONContainerSpec
1110
from .volume import JSONPodVolume, parse_pod_volumes
1211

@@ -21,30 +20,6 @@ class JSONPodSpec(TypedDict):
2120
priorityClassName: NotRequired[str]
2221
activeDeadlineSeconds: NotRequired[int]
2322
volumes: NotRequired[Sequence[JSONPodVolume]]
24-
resources: NotRequired[JSONResourceRequirements]
25-
26-
27-
def pod_resources(pod_spec: JSONPodSpec) -> api.ResourceRequirements:
28-
parsed_limits = api.ResourceRequirement()
29-
parsed_requests = api.ResourceRequirement()
30-
if resources := pod_spec.get("resources"):
31-
if limits := resources.get("limits"):
32-
parsed_limits = api.ResourceRequirement(
33-
memory=api.parse_resource_value(limits["memory"]) if "memory" in limits else None,
34-
cpu=api.parse_cpu_cores(limits["cpu"]) if "cpu" in limits else None,
35-
)
36-
if requests := resources.get("requests"):
37-
parsed_requests = api.ResourceRequirement(
38-
memory=api.parse_resource_value(requests["memory"])
39-
if "memory" in requests
40-
else None,
41-
cpu=api.parse_cpu_cores(requests["cpu"]) if "cpu" in requests else None,
42-
)
43-
44-
return api.ResourceRequirements(
45-
limits=parsed_limits,
46-
requests=parsed_requests,
47-
)
4823

4924

5025
def pod_spec(spec: JSONPodSpec) -> api.PodSpec:
@@ -58,5 +33,4 @@ def pod_spec(spec: JSONPodSpec) -> api.PodSpec:
5833
priority_class_name=spec.get("priorityClassName"),
5934
active_deadline_seconds=spec.get("activeDeadlineSeconds"),
6035
volumes=parse_pod_volumes(volumes) if (volumes := spec.get("volumes")) else None,
61-
resources=pod_resources(spec),
6236
)

cmk/plugins/kube/schemata/api.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,6 @@ class PodSpec(BaseModel):
767767
priority_class_name: str | None = None
768768
active_deadline_seconds: int | None = None
769769
volumes: Sequence[Volume] | None = None
770-
resources: ResourceRequirements
771770

772771

773772
@enum.unique

cmk/plugins/kube/schemata/section.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -200,17 +200,10 @@ class Resources(Section):
200200

201201
request: float
202202
limit: float
203-
204-
# requests
205203
count_unspecified_requests: int
206-
count_total_requests: int
207-
count_pods_pod_level_request: int
208-
209-
# limits
210204
count_unspecified_limits: int
211205
count_zeroed_limits: int
212-
count_total_limits: int
213-
count_pods_pod_level_limit: int
206+
count_total: int
214207

215208

216209
class AllocatableResource(Section):

cmk/plugins/lib/kube_resources.py

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -36,42 +36,25 @@ def parse_performance_usage(string_table: StringTable) -> PerformanceUsage:
3636

3737

3838
def count_overview(resources: Resources, requirement: RequirementType) -> str:
39-
if requirement == "request":
40-
specified = resources.count_total_requests - resources.count_unspecified_requests
41-
total = resources.count_total_requests
42-
pod_level = resources.count_pods_pod_level_request
43-
else:
44-
specified = (
45-
resources.count_total_limits
46-
- resources.count_unspecified_limits
47-
- resources.count_zeroed_limits
48-
)
49-
total = resources.count_total_limits
50-
pod_level = resources.count_pods_pod_level_limit
51-
52-
container_part = f"{specified}/{total} containers with {requirement}s"
53-
if pod_level == 0:
54-
return container_part
55-
56-
pod_part = f"{pod_level} pod{'s' if pod_level > 1 else ''} with pod-level {requirement}s"
57-
if total == 0:
58-
return pod_part
59-
60-
return f"{container_part}, {pod_part}"
39+
ignored = (
40+
resources.count_unspecified_requests
41+
if requirement == "request"
42+
else resources.count_unspecified_limits + resources.count_zeroed_limits
43+
)
44+
return (
45+
f"{resources.count_total - ignored}/{resources.count_total} containers with {requirement}s"
46+
)
6147

6248

6349
def parse_resources(string_table: StringTable) -> Resources:
6450
"""Parses limit and request values into Resources
6551
>>> parse_resources([['{"request": 209715200.0,'
6652
... '"limit": 104857600.0,'
6753
... '"count_unspecified_requests": 0,'
68-
... '"count_total_requests": 1,'
69-
... '"count_pods_pod_level_request": 0,'
7054
... '"count_unspecified_limits": 0,'
7155
... '"count_zeroed_limits": 1,'
72-
... '"count_total_limits": 1,'
73-
... '"count_pods_pod_level_limit": 0}']])
74-
Resources(request=209715200.0, limit=104857600.0, count_unspecified_requests=0, count_total_requests=1, count_pods_pod_level_request=0, count_unspecified_limits=0, count_zeroed_limits=1, count_total_limits=1, count_pods_pod_level_limit=0)
56+
... '"count_total": 1}']])
57+
Resources(request=209715200.0, limit=104857600.0, count_unspecified_requests=0, count_unspecified_limits=0, count_zeroed_limits=1, count_total=1)
7558
"""
7659
return Resources.model_validate_json(string_table[0][0])
7760

tests/unit/cmk/plugins/collection/agent_based/test_kube_cpu.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,10 @@ class ResourcesFactory(ModelFactory):
4444
RESOURCES_SECTION = Resources(
4545
request=0.18,
4646
limit=0.36,
47+
count_total=2,
4748
count_zeroed_limits=0,
4849
count_unspecified_limits=0,
4950
count_unspecified_requests=0,
50-
count_total_requests=2,
51-
count_total_limits=2,
52-
count_pods_pod_level_request=0,
53-
count_pods_pod_level_limit=0,
5451
)
5552

5653

0 commit comments

Comments
 (0)