diff --git a/alerts/resource_alerts.libsonnet b/alerts/resource_alerts.libsonnet index 75abb51af..58e5b4e8c 100644 --- a/alerts/resource_alerts.libsonnet +++ b/alerts/resource_alerts.libsonnet @@ -36,18 +36,34 @@ local utils = import '../lib/utils.libsonnet'; } + if $._config.showMultiCluster then { expr: ||| - sum(namespace_cpu:kube_pod_container_resource_requests:sum{%(ignoringOverprovisionedWorkloadSelector)s}) by (%(clusterLabel)s) - (sum(kube_node_status_allocatable{%(kubeStateMetricsSelector)s,resource="cpu"}) by (%(clusterLabel)s) - max(kube_node_status_allocatable{%(kubeStateMetricsSelector)s,resource="cpu"}) by (%(clusterLabel)s)) > 0 + (sum(namespace_cpu:kube_pod_container_resource_requests:sum{%(ignoringOverprovisionedWorkloadSelector)s}) by (%(clusterLabel)s) - + sum(kube_node_status_allocatable{%(kubeStateMetricsSelector)s,resource="cpu"}) by (%(clusterLabel)s) > 0 and - (sum(kube_node_status_allocatable{%(kubeStateMetricsSelector)s,resource="cpu"}) by (%(clusterLabel)s) - max(kube_node_status_allocatable{%(kubeStateMetricsSelector)s,resource="cpu"}) by (%(clusterLabel)s)) > 0 + count by (cluster) (max by (cluster, node) (kube_node_role{role="control-plane"})) < 3) + or + (sum(namespace_cpu:kube_pod_container_resource_requests:sum{%(ignoringOverprovisionedWorkloadSelector)s}) by (%(clusterLabel)s) - + (sum(kube_node_status_allocatable{%(kubeStateMetricsSelector)s,resource="cpu"}) by (%(clusterLabel)s) - + max(kube_node_status_allocatable{%(kubeStateMetricsSelector)s,resource="cpu"}) by (%(clusterLabel)s)) > 0 + and + (sum(kube_node_status_allocatable{%(kubeStateMetricsSelector)s,resource="cpu"}) by (%(clusterLabel)s) - + max(kube_node_status_allocatable{%(kubeStateMetricsSelector)s,resource="cpu"}) by (%(clusterLabel)s)) > 0) ||| % $._config, annotations+: { description: 'Cluster {{ $labels.%(clusterLabel)s }} has overcommitted CPU resource requests for Pods by {{ $value }} CPU shares and cannot tolerate node failure.' % $._config, }, } else { expr: ||| - sum(namespace_cpu:kube_pod_container_resource_requests:sum{%(ignoringOverprovisionedWorkloadSelector)s}) - (sum(kube_node_status_allocatable{resource="cpu", %(kubeStateMetricsSelector)s}) - max(kube_node_status_allocatable{resource="cpu", %(kubeStateMetricsSelector)s})) > 0 + (sum(namespace_cpu:kube_pod_container_resource_requests:sum{%(ignoringOverprovisionedWorkloadSelector)s}) - + sum(kube_node_status_allocatable{resource="cpu", %(kubeStateMetricsSelector)s}) > 0 + and + count(max by (node) (kube_node_role{role="control-plane"})) < 3) + or + (sum(namespace_cpu:kube_pod_container_resource_requests:sum{%(ignoringOverprovisionedWorkloadSelector)s}) - + (sum(kube_node_status_allocatable{resource="cpu", %(kubeStateMetricsSelector)s}) - + max(kube_node_status_allocatable{resource="cpu", %(kubeStateMetricsSelector)s})) > 0 and - (sum(kube_node_status_allocatable{resource="cpu", %(kubeStateMetricsSelector)s}) - max(kube_node_status_allocatable{resource="cpu", %(kubeStateMetricsSelector)s})) > 0 + (sum(kube_node_status_allocatable{resource="cpu", %(kubeStateMetricsSelector)s}) - + max(kube_node_status_allocatable{resource="cpu", %(kubeStateMetricsSelector)s})) > 0) ||| % $._config, annotations+: { description: 'Cluster has overcommitted CPU resource requests for Pods by {{ $value }} CPU shares and cannot tolerate node failure.' % $._config, @@ -65,24 +81,39 @@ local utils = import '../lib/utils.libsonnet'; } + if $._config.showMultiCluster then { expr: ||| - sum(namespace_memory:kube_pod_container_resource_requests:sum{%(ignoringOverprovisionedWorkloadSelector)s}) by (%(clusterLabel)s) - (sum(kube_node_status_allocatable{resource="memory", %(kubeStateMetricsSelector)s}) by (%(clusterLabel)s) - max(kube_node_status_allocatable{resource="memory", %(kubeStateMetricsSelector)s}) by (%(clusterLabel)s)) > 0 + (sum(namespace_memory:kube_pod_container_resource_requests:sum{%(ignoringOverprovisionedWorkloadSelector)s}) by (%(clusterLabel)s) - + sum(kube_node_status_allocatable{resource="memory", %(kubeStateMetricsSelector)s}) by (%(clusterLabel)s) > 0 and - (sum(kube_node_status_allocatable{resource="memory", %(kubeStateMetricsSelector)s}) by (%(clusterLabel)s) - max(kube_node_status_allocatable{resource="memory", %(kubeStateMetricsSelector)s}) by (%(clusterLabel)s)) > 0 + count by (cluster) (max by (cluster, node) (kube_node_role{role="control-plane"})) < 3) + or + (sum(namespace_memory:kube_pod_container_resource_requests:sum{%(ignoringOverprovisionedWorkloadSelector)s}) by (%(clusterLabel)s) - + (sum(kube_node_status_allocatable{resource="memory", %(kubeStateMetricsSelector)s}) by (%(clusterLabel)s) - + max(kube_node_status_allocatable{resource="memory", %(kubeStateMetricsSelector)s}) by (%(clusterLabel)s)) > 0 + and + (sum(kube_node_status_allocatable{resource="memory", %(kubeStateMetricsSelector)s}) by (%(clusterLabel)s) - + max(kube_node_status_allocatable{resource="memory", %(kubeStateMetricsSelector)s}) by (%(clusterLabel)s)) > 0) ||| % $._config, annotations+: { description: 'Cluster {{ $labels.%(clusterLabel)s }} has overcommitted memory resource requests for Pods by {{ $value | humanize }} bytes and cannot tolerate node failure.' % $._config, }, - } else - { - expr: ||| - sum(namespace_memory:kube_pod_container_resource_requests:sum{%(ignoringOverprovisionedWorkloadSelector)s}) - (sum(kube_node_status_allocatable{resource="memory", %(kubeStateMetricsSelector)s}) - max(kube_node_status_allocatable{resource="memory", %(kubeStateMetricsSelector)s})) > 0 - and - (sum(kube_node_status_allocatable{resource="memory", %(kubeStateMetricsSelector)s}) - max(kube_node_status_allocatable{resource="memory", %(kubeStateMetricsSelector)s})) > 0 - ||| % $._config, - annotations+: { - description: 'Cluster has overcommitted memory resource requests for Pods by {{ $value | humanize }} bytes and cannot tolerate node failure.', - }, + } else { + expr: ||| + (sum(namespace_memory:kube_pod_container_resource_requests:sum{%(ignoringOverprovisionedWorkloadSelector)s}) - + sum(kube_node_status_allocatable{resource="memory", %(kubeStateMetricsSelector)s}) > 0 + and + count(max by (node) (kube_node_role{role="control-plane"})) < 3) + or + (sum(namespace_memory:kube_pod_container_resource_requests:sum{%(ignoringOverprovisionedWorkloadSelector)s}) - + (sum(kube_node_status_allocatable{resource="memory", %(kubeStateMetricsSelector)s}) - + max(kube_node_status_allocatable{resource="memory", %(kubeStateMetricsSelector)s})) > 0 + and + (sum(kube_node_status_allocatable{resource="memory", %(kubeStateMetricsSelector)s}) - + max(kube_node_status_allocatable{resource="memory", %(kubeStateMetricsSelector)s})) > 0) + ||| % $._config, + annotations+: { + description: 'Cluster has overcommitted memory resource requests for Pods by {{ $value | humanize }} bytes and cannot tolerate node failure.', }, + }, { alert: 'KubeCPUQuotaOvercommit', labels: { diff --git a/tests/tests.yaml b/tests/tests.yaml index 49a81c730..55f79c090 100644 --- a/tests/tests.yaml +++ b/tests/tests.yaml @@ -1323,3 +1323,107 @@ tests: description: 'Cluster has overcommitted memory resource requests for Namespaces.' runbook_url: "https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubememoryquotaovercommit" summary: "Cluster has overcommitted memory resource requests." + +- name: KubeCPUOvercommit alert (single-node) +- interval: 1m + input_series: + - series: 'namespace_cpu:kube_pod_container_resource_requests:sum{cluster="kubernetes", namespace="default"}' + values: '1x10' + - series: 'namespace_cpu:kube_pod_container_resource_requests:sum{cluster="kubernetes", namespace="kube-system"}' + values: '1x10' + - series: 'kube_node_status_allocatable{cluster="kubernetes", node="n1", resource="cpu", job="kube-state-metrics"}' + values: '1.9x10' # This value was seen on a 2x vCPU node + - series: 'kube_node_info{cluster="kubernetes", node="n1", job="kube-state-metrics"}' + values: '1x10' + alert_rule_test: + - eval_time: 9m + alertname: KubeCPUOvercommit + - eval_time: 10m + alertname: KubeCPUOvercommit + exp_alerts: + - exp_labels: + severity: warning + exp_annotations: + description: Cluster has overcommitted CPU resource requests for Pods by 0.385 CPU shares and cannot tolerate node failure. + runbook_url: https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubecpuovercommit + summary: Cluster has overcommitted CPU resource requests. + +- name: KubeCPUOvercommit alert (multi-node) +- interval: 1m + input_series: + - series: 'namespace_cpu:kube_pod_container_resource_requests:sum{cluster="kubernetes", namespace="default"}' + values: '2x10' + - series: 'namespace_cpu:kube_pod_container_resource_requests:sum{cluster="kubernetes", namespace="kube-system"}' + values: '2x10' + - series: 'kube_node_status_allocatable{cluster="kubernetes", node="n1", resource="cpu", job="kube-state-metrics"}' + values: '1.9x10' # This value was seen on a 2x vCPU node + - series: 'kube_node_status_allocatable{cluster="kubernetes", node="n2", resource="cpu", job="kube-state-metrics"}' + values: '1.9x10' + - series: 'kube_node_info{cluster="kubernetes", node="n1", job="kube-state-metrics"}' + values: '1x10' + - series: 'kube_node_info{cluster="kubernetes", node="n2", job="kube-state-metrics"}' + values: '1x10' + alert_rule_test: + - eval_time: 9m + alertname: KubeCPUOvercommit + - eval_time: 10m + alertname: KubeCPUOvercommit + exp_alerts: + - exp_labels: + severity: warning + exp_annotations: + description: Cluster has overcommitted CPU resource requests for Pods by 2.1 CPU shares and cannot tolerate node failure. + runbook_url: https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubecpuovercommit + summary: Cluster has overcommitted CPU resource requests. + +- name: KubeMemoryOvercommit alert (single-node) +- interval: 1m + input_series: + - series: 'namespace_memory:kube_pod_container_resource_requests:sum{cluster="kubernetes", namespace="default"}' + values: '1000000000x10' # 1 GB + - series: 'namespace_memory:kube_pod_container_resource_requests:sum{cluster="kubernetes", namespace="kube-system"}' + values: '1000000000x10' + - series: 'kube_node_status_allocatable{cluster="kubernetes", node="n1", resource="memory", job="kube-state-metrics"}' + values: '1000000000x10' + - series: 'kube_node_info{cluster="kubernetes", node="n1", job="kube-state-metrics"}' + values: '1x10' + alert_rule_test: + - eval_time: 9m + alertname: KubeMemoryOvercommit + - eval_time: 10m + alertname: KubeMemoryOvercommit + exp_alerts: + - exp_labels: + severity: warning + exp_annotations: + description: Cluster has overcommitted memory resource requests for Pods by 1.15G bytes and cannot tolerate node failure. + runbook_url: https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubememoryovercommit + summary: Cluster has overcommitted memory resource requests. + +- name: KubeMemoryOvercommit alert (multi-node) +- interval: 1m + input_series: + - series: 'namespace_memory:kube_pod_container_resource_requests:sum{cluster="kubernetes", namespace="default"}' + values: '2000000000x10' # 2 GB + - series: 'namespace_memory:kube_pod_container_resource_requests:sum{cluster="kubernetes", namespace="kube-system"}' + values: '2000000000x10' + - series: 'kube_node_status_allocatable{cluster="kubernetes", node="n1", resource="memory", job="kube-state-metrics"}' + values: '1000000000x10' + - series: 'kube_node_status_allocatable{cluster="kubernetes", node="n2", resource="memory", job="kube-state-metrics"}' + values: '1000000000x10' + - series: 'kube_node_info{cluster="kubernetes", node="n1", job="kube-state-metrics"}' + values: '1x10' + - series: 'kube_node_info{cluster="kubernetes", node="n2", job="kube-state-metrics"}' + values: '1x10' + alert_rule_test: + - eval_time: 9m + alertname: KubeMemoryOvercommit + - eval_time: 10m + alertname: KubeMemoryOvercommit + exp_alerts: + - exp_labels: + severity: warning + exp_annotations: + description: Cluster has overcommitted memory resource requests for Pods by 3G bytes and cannot tolerate node failure. + runbook_url: https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubememoryovercommit + summary: Cluster has overcommitted memory resource requests.