Kubernetes Resource Requests Checker
Check Kubernetes manifests for missing CPU, memory, and ephemeral-storage requests, limit mismatches, QoS clues, and scheduler footprint gaps.| {{ header }} | Copy |
|---|---|
| {{ cell }} | |
|
No manifest rows available
Paste valid workload YAML or JSON, or load the sample manifest to build this table.
|
{{ result.patchText }}
Kubernetes scheduling is not based on the busiest moment a container might reach. The scheduler starts with the resource requests written into the Pod specification, then decides whether a node has enough allocatable capacity for the declared demand. That makes request hygiene a manifest-review problem as much as a runtime-monitoring problem.
Requests and limits answer different questions. A CPU request is the share of CPU capacity reserved for placement and relative allocation. A memory request is the memory amount the scheduler reserves when it fits the Pod onto a node. A limit is a boundary enforced after the workload is running or a policy requirement imposed by the namespace. Treating a limit as a request can hide scheduler risk; treating a request as a safe production size can hide runtime risk.
| Resource field | Primary question | Review concern |
|---|---|---|
| CPU request | How much CPU capacity should placement reserve? | Missing requests can make a node look less full than it will be under load. |
| Memory request | How much memory should placement reserve? | Too little memory request can increase eviction exposure during node pressure. |
| CPU limit | Should CPU use be capped by policy? | Required in some quota models, but a poor default for some latency-sensitive services. |
| Memory limit | What memory boundary should trigger runtime enforcement? | A limit below the request is invalid for a readiness review and can lead to restarts. |
| Ephemeral-storage request or limit | How much local node storage should logs, cache, and writable layers reserve? | Often overlooked until namespace quota or node eviction exposes the gap. |
Container shape changes the scheduler footprint. App containers run together, so their requests add up. Init containers run before the app containers, so the largest init-container request for a resource can outweigh the steady-state app sum. A one-time database migration or cache warmup step can therefore make a Pod harder to place than the long-running service appears to be.
Quota and admission policy add another layer. A namespace ResourceQuota can reject Pods that omit required requests or limits, while LimitRange rules may inject defaults or impose minimum and maximum values. Pod-level CPU and memory budgets are available on newer Kubernetes clusters, but support and policy acceptance still vary enough that many reviews keep container-level fields as the portable default.
Complete fields are not the same as correct sizing. Good requests come from usage history, load tests, Vertical Pod Autoscaler output, Kubernetes Resource Recommender runs, startup behavior, and platform policy. A manifest can pass a field-coverage review and still reserve too little memory, throttle CPU poorly, or exceed the namespace budget once replica count is included.
How to Use This Tool:
Use this checker before a Helm chart merge, pull-request review, namespace quota rollout, production-readiness pass, or cleanup of older Kubernetes manifests.
- Enter a Review label that identifies the workload, chart, pull request, or namespace slice being checked.
- Choose Review target. CPU and memory requests required checks the baseline scheduler inputs. Requests plus memory limits adds memory boundaries. Quota-ready requests and limits expects CPU and memory requests plus CPU and memory limits.
- Set Pod-level budgets to match the cluster policy you want to evaluate. The portable default is Require container-level fields. Advisory mode keeps pod-level evidence visible without clearing container gaps. Accept mode lets pod-level CPU and memory budgets cover matching field gaps.
- Paste, drop, or browse Manifest YAML or JSON. The checker reads Pods, workload Pod templates, Lists, multi-document YAML, app containers, init containers, and ephemeral containers.
- Open Advanced for narrow policy cases. Enable Ephemeral-storage audit when the cluster enforces local ephemeral-storage requests or limits, and adjust Visible row limit when a large manifest needs more rows on screen.
- Clear any Review manifest input problem before using the result. Invalid YAML, unsupported objects, or manifests with no workload containers cannot produce a reliable resource audit.
- Read Container Request Audit first, then use Scheduler Footprint, Remediation Queue, Quota Readiness Brief, Resource Coverage Chart, and Resource Patch Snippets for follow-up work.
Treat Resource Patch Snippets as placement scaffolding. The placeholders show where requests and limits belong, but the numeric values must come from workload measurements and platform policy.
Interpreting Results:
Container Request Audit is the fastest row-level status check. Blocker means a required field is missing, a quantity cannot be parsed, or a limit is lower than its matching request. Review usually means evidence exists but still needs a policy decision, such as pod-level budget coverage in advisory mode. Ready means the selected field requirements are covered for that row.
- Scheduler Footprint: Compare effective CPU, memory, and ephemeral-storage requests against namespace quota and node allocatable capacity. A large init container can raise this number above the app-container sum.
- Remediation Queue: Fix blockers before warnings. Missing CPU requests, invalid quantity strings, and inverted request/limit pairs require different action.
- Quota Readiness Brief: Use this as a policy-readiness summary for the selected target, not as proof that the request values are properly sized.
- Resource Coverage Chart: Red segments mark missing required coverage, green marks present fields, and blue marks pod-level budget evidence where that mode is active.
Quantity displays include normalized units so close-looking values can be compared. 0.5 CPU and 500m CPU represent the same amount, while 512Mi and 512M are different memory amounts after conversion.
A clean result should still be checked against production signals. Compare requests with p95 usage, startup spikes, garbage-collection behavior, cache growth, replica count, ResourceQuota rules, LimitRange defaults, and any platform requirement for CPU or memory limits.
Technical Details:
Kubernetes resource quantities are normalized before meaningful comparison. CPU values are represented as millicpu in the review logic: a plain 1 means one CPU, 500m means half a CPU, 1000u also becomes 1m, and nanocpu values are reduced to millicpu. Memory and ephemeral-storage quantities are converted to mebibytes, with binary suffixes such as Mi and decimal suffixes such as M kept distinct.
Effective scheduling demand is resource-specific. For each resource, app-container requests are summed because app containers run at the same time. Init-container requests are compared by maximum because regular init containers run sequentially. The Pod's effective request for that resource is the larger of those two values.
Formula Core
The scheduler footprint shown for each workload follows the effective request rule for CPU, memory, and ephemeral storage.
For CPU, two app containers requesting 250m and 500m produce a 750m app sum. If the largest init-container CPU request is 1000m, the effective CPU request is 1 CPU. If the largest init request is 200m, the effective CPU request remains 750m.
Rule Core
| Review setting | Required coverage | Blocking or review condition |
|---|---|---|
| CPU and memory requests required | CPU request and memory request for each checked container. | Missing base requests are blockers; parsed limits below requests are blockers. |
| Requests plus memory limits | CPU request, memory request, and memory limit. | Missing memory limit, invalid quantity, or memory limit below request becomes review work. |
| Quota-ready requests and limits | CPU request, memory request, CPU limit, and memory limit. | Any required CPU or memory gap is surfaced, plus invalid or inverted request/limit pairs. |
| Ephemeral-storage audit | Ephemeral-storage request, and ephemeral-storage limit when quota-ready mode is selected. | Missing ephemeral-storage fields are advisory or warning findings depending on the selected target. |
| Pod-level budgets accepted | Pod-level CPU and memory requests or limits can cover matching container-level gaps. | Pod-level evidence does not cover ephemeral storage and still depends on cluster support. |
| Area | Rule | Practical effect |
|---|---|---|
| CPU quantities | Plain numbers are CPU cores; m, u, and n suffixes are normalized to millicpu. |
0.5 and 500m compare as the same request. |
| Memory and storage quantities | Binary and decimal byte suffixes are converted to MiB before comparison. | 512Mi is larger than 512M, even though the labels look similar. |
| Limit relationship | When both quantities parse, limit < request is invalid for the review. |
The maximum boundary should not be lower than the amount being reserved. |
| QoS class | Guaranteed needs equal non-zero CPU and memory request/limit pairs; BestEffort has no CPU or memory request or limit. | QoS affects eviction order under node pressure, but it does not prove the workload is well sized. |
The audit is a manifest and policy-readiness check. It does not contact a Kubernetes cluster, evaluate live admission controllers, estimate true peak demand, or confirm how much capacity a namespace has left after other workloads are counted.
Limitations and Privacy Notes:
The pasted manifest is parsed in the browser, and the result tables are generated there. That keeps the review local to the page, but manifests can still reveal system design through image names, namespaces, labels, environment references, and resource choices.
- The checker validates field coverage, quantity parsing, request/limit relationships, QoS clues, and scheduler footprint. It does not run
kubectlor call the Kubernetes API. - Browsed YAML or JSON files must be under 2 MB. For larger reviews, check a rendered namespace slice or split the manifests by chart, workload, or pull request.
- Pod-level CPU and memory resources depend on Kubernetes version, feature gates, operating system support, and admission policy.
- If the full YAML parser cannot load, the fallback parser is intentionally limited. Reload the page or use valid JSON when a syntax warning looks suspicious.
Worked Examples:
A Deployment with an api container requesting 250m CPU and 256Mi memory, plus a processor container requesting 500m CPU and 384Mi memory, shows 750m CPU and 640Mi memory in Scheduler Footprint. With CPU and memory requests required, those rows can be Ready if no invalid limit relationship is present.
A migration init container requesting 1 CPU while the app containers sum to 750m raises the effective CPU request to 1 CPU. Use the larger value when comparing the manifest against node allocatable capacity or namespace quota.
A background processor with a memory request of 512Mi and a memory limit of 256Mi should appear as a Blocker in Remediation Queue. The fix is to raise the limit to at least the request, or lower the request only after measured usage supports the change.
A manifest that declares only pod-level CPU and memory budgets changes meaning with Pod-level budgets. Advisory mode keeps the container rows under review, while accept mode can count those pod-level fields as coverage for CPU and memory when the cluster supports them.
FAQ:
Should every workload have CPU limits?
Not always. The quota-ready target checks CPU limits because some namespace policies require them, but many teams avoid CPU limits for latency-sensitive services unless the platform requires a hard cap.
Why is BestEffort treated as risky?
BestEffort means the checked Pod has no CPU or memory request or limit. Kubernetes gives BestEffort Pods the weakest eviction position when a node is under resource pressure.
Can pod-level resources replace container requests?
Only when the cluster and admission policy support that model. The checker can count pod-level CPU and memory budgets in accept mode, but container-level fields remain the safer portable default.
Why did a valid-looking manifest show no containers?
The source may be a Kubernetes object without a Pod spec, a custom resource the checker does not understand, or YAML with syntax problems. Check Review manifest input, then paste the rendered Pod template if needed.
Are the patch snippets safe to apply directly?
No. Resource Patch Snippets include placeholders for usage-backed CPU, memory, and storage values. Replace every placeholder with measured Kubernetes quantities before applying a manifest.
Glossary:
- Request
- The amount of CPU, memory, or storage Kubernetes uses when deciding whether a workload can fit.
- Limit
- A maximum boundary enforced by the runtime or required by namespace policy.
- QoS class
- Kubernetes classification for eviction behavior: Guaranteed, Burstable, or BestEffort.
- Init container
- A container that runs before app containers and can raise the effective scheduler footprint.
- Pod-level resources
- CPU and memory resource budgets declared for the whole Pod rather than each individual container.
- Ephemeral storage
- Local temporary storage used by logs, writable layers, scratch files, generated files, and caches.
References:
- Resource Management for Pods and Containers, Kubernetes documentation, last modified April 13, 2026.
- Init Containers, Kubernetes documentation, last modified September 18, 2024.
- Pod Quality of Service Classes, Kubernetes documentation, last modified April 5, 2026.
- Resource Quotas, Kubernetes documentation, last modified November 20, 2025.
- Assign Pod-level CPU and memory resources, Kubernetes documentation, last modified April 8, 2026.