## Intro

Kubernetes Resource Quotas are a critical control for multi-tenant and shared clusters. They limit the total resource consumption of a namespace, preventing a single team or workload from starving others. When a quota is exceeded, pods fail to schedule, services may degrade, and troubleshooting can become confusing if you do not know where to look.

This guide provides a practical, step-by-step approach to diagnosing and resolving Kubernetes Resource Quota issues. It is intended for developers, DevOps consultants, and technical startup teams who need to move from an observed problem to a verified result quickly and safely.

We will cover version and environment inventory, safe configuration paths, verification and diagnostics, failure modes, recovery procedures, and an operations checklist. Each section includes concrete commands, expected outputs, and decision guidance. The goal is operational safety: observe before changing, limit the blast radius, use placeholders instead of secrets, verify the result, and document how to recover if the expected state is not reached.

## Version and Environment Inventory

Before troubleshooting any Resource Quota issue, you must know exactly what you are working with. Start by identifying the Kubernetes version, the quota configuration, and the current usage in the affected namespace. This establishes a baseline and prevents accidental changes to the wrong object.

### Determine Cluster and Client Version

Run:

kubectl version --short 
 Expected output (example):

Client Version: v1.27.3
Kustomize Version: v5.0.1
Server Version: v1.27.2 
 If your client is significantly older than the server, some Resource Quota fields may not be supported. Update kubectl to match the server minor version when possible.

### Inspect Existing Resource Quotas

List all ResourceQuota objects in the namespace:

kubectl get resourcequota -n my-namespace 
 Example output:

NAME AGE REQUEST LIMIT
compute-quota 5d requests.cpu: 2/4, requests.memory: 2Gi/8Gi, limits.cpu: 4/8, limits.memory: 4Gi/16Gi 
 The REQUEST and LIMIT columns show current usage and hard limits. If usage is near or at the limit, you likely have a quota issue.

For detailed view:

kubectl describe resourcequota compute-quota -n my-namespace 
 Example excerpt:

Name: compute-quota
Namespace: my-namespace
Resource Used Hard
-------- ---- ----
requests.cpu 2 4
requests.memory 2Gi 8Gi
limits.cpu 4 8
limits.memory 4Gi 16Gi 

### Check Namespace Labels and Annotations

 Resource Quotas can be scoped to specific priority classes or selectors. Verify namespace labels:

kubectl get namespace my-namespace --show-labels 
 Example:

NAME STATUS AGE LABELS
my-namespace Active 12d team=backend, environment=production 

### Identify Pods and Their Resource Requests/Limits

 A common cause of quota exhaustion is a pod that requests more resources than expected. List pods with their resource requests and limits using a custom column:

kubectl get pods -n my-namespace -o custom-columns='NAME:.metadata.name,CPU_REQ:.spec.containers[*].resources.requests.cpu,MEM_REQ:.spec.containers[*].resources.requests.memory,CPU_LIM:.spec.containers[*].resources.limits.cpu,MEM_LIM:.spec.containers[*].resources.limits.memory' 
 Example output:

NAME CPU_REQ MEM_REQ CPU_LIM MEM_LIM
web-6c9d8f7b5d-abcde 250m 256Mi 500m 512Mi
worker-7f8b9c6d5e-fghij 500m 512Mi 1 1Gi 
 Compare these values with the quota usage. If a pod was recently created or updated, it may have pushed usage over the limit.

<style>
.eno-quiz-widget{margin:2rem 0;padding:1.5rem;border-radius:12px;background:var(--eno-surface-lowest,#f7f7f8);border:1px solid var(--eno-border-soft,#e2e2e6);font-family:var(--eno-font-body,Inter,sans-serif)}
.eno-quiz-widget .eno-quiz-kicker{font-family:var(--eno-font-label,"JetBrains Mono",monospace);font-size:.75rem;letter-spacing:.05em;text-transform:uppercase;color:var(--eno-text-muted,#5f5f68);margin:0 0 .5rem}
.eno-quiz-widget .eno-quiz-question{font-family:var(--eno-font-heading,"Hanken Grotesk",sans-serif);font-size:1.0625rem;font-weight:600;margin:0 0 1rem;color:var(--eno-text-strong,#1a1a1f)}
.eno-quiz-widget .eno-quiz-options{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.5rem}
.eno-quiz-widget .eno-quiz-option{display:block;width:100%;min-height:44px;text-align:left;padding:.625rem .875rem;border-radius:8px;border:1.5px solid var(--eno-border-soft,#e2e2e6);background:#fff;font-size:.9375rem;cursor:pointer;transition:border-color var(--eno-motion-base,180ms ease-out),background var(--eno-motion-base,180ms ease-out)}
.eno-quiz-widget .eno-quiz-option:hover{border-color:var(--eno-primary,#0059bb)}
.eno-quiz-widget .eno-quiz-option:focus-visible{outline:none;box-shadow:0 0 0 3px rgb(0 89 187 / 0.15)}
.eno-quiz-widget .eno-quiz-option[aria-pressed="true"]{border-color:var(--eno-primary,#0059bb);background:rgb(0 89 187 / 0.06)}
.eno-quiz-widget .eno-quiz-option[data-correct="true"].eno-quiz-revealed{border-color:var(--eno-success,#17803a);background:rgb(23 128 58 / 0.08)}
.eno-quiz-widget .eno-quiz-option[data-correct="false"].eno-quiz-revealed.eno-quiz-was-selected{border-color:var(--eno-error,#ba1a1a);background:var(--eno-error-soft,#ffdad6)}
.eno-quiz-widget .eno-quiz-option-icon{display:inline-block;width:1.1em;margin-right:.4em;font-weight:700}
.eno-quiz-widget .eno-quiz-submit{margin-top:1rem;min-height:44px;padding:.5rem 1.25rem;border-radius:8px;border:none;background:var(--eno-primary,#0059bb);color:#fff;font-weight:600;font-size:.9375rem;cursor:pointer;transition:opacity var(--eno-motion-base,180ms ease-out)}
.eno-quiz-widget .eno-quiz-submit:disabled{opacity:.5;cursor:not-allowed}
.eno-quiz-widget .eno-quiz-submit:focus-visible{outline:none;box-shadow:0 0 0 3px rgb(0 89 187 / 0.15)}
.eno-quiz-widget .eno-quiz-explanation{margin-top:1rem;padding:.875rem 1rem;border-radius:8px;font-size:.9375rem;line-height:1.5;display:none}
.eno-quiz-widget .eno-quiz-explanation.eno-quiz-visible{display:block}
.eno-quiz-widget .eno-quiz-explanation.eno-quiz-correct{background:rgb(23 128 58 / 0.08);color:var(--eno-success,#17803a)}
.eno-quiz-widget .eno-quiz-explanation.eno-quiz-incorrect{background:var(--eno-error-soft,#ffdad6);color:var(--eno-error,#ba1a1a)}
@media (prefers-reduced-motion: reduce){.eno-quiz-widget *{transition:none!important}}
</style><div class="eno-quiz-widget" role="group" aria-label="Quick check question">
Quick check 1 of 2

What is the primary purpose of Kubernetes Resource Quotas?

- To limit the number of nodes in a cluster
- To limit the total resource consumption of a namespace
- To restrict access to the Kubernetes API
- To enforce network policies

<button type="button" class="eno-quiz-submit" disabled>Submit</button>
<div class="eno-quiz-explanation">Resource Quotas are used to manage resource usage of tenant workloads, limiting the total amount of resources a namespace can consume.</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
  document.querySelectorAll('.eno-quiz-widget:not([data-eno-quiz-bound])').forEach(function (widget) {
    widget.setAttribute('data-eno-quiz-bound', '1');
    var options = Array.prototype.slice.call(widget.querySelectorAll('.eno-quiz-option'));
    var submitBtn = widget.querySelector('.eno-quiz-submit');
    var explanation = widget.querySelector('.eno-quiz-explanation');
    var selected = null;
    options.forEach(function (opt) {
      opt.addEventListener('click', function () {
        if (widget.hasAttribute('data-eno-quiz-answered')) return;
        options.forEach(function (o) { o.setAttribute('aria-pressed', 'false'); });
        opt.setAttribute('aria-pressed', 'true');
        selected = opt;
        submitBtn.disabled = false;
      });
    });
    submitBtn.addEventListener('click', function () {
      if (!selected || widget.hasAttribute('data-eno-quiz-answered')) return;
      widget.setAttribute('data-eno-quiz-answered', '1');
      submitBtn.disabled = true;
      var correct = selected.getAttribute('data-correct') === 'true';
      options.forEach(function (o) {
        o.classList.add('eno-quiz-revealed');
        if (o === selected) o.classList.add('eno-quiz-was-selected');
        var icon = o.querySelector('.eno-quiz-option-icon');
        if (o.getAttribute('data-correct') === 'true') icon.textContent = '\u2713';
        else if (o === selected) icon.textContent = '\u2717';
      });
      explanation.classList.add('eno-quiz-visible', correct ? 'eno-quiz-correct' : 'eno-quiz-incorrect');
    });
  });
});
</script>

## Safe Configuration Path

When you need to adjust quotas or resource requests, follow a safe configuration path. This minimizes disruption and allows for quick rollback if needed.

### Never Edit Live Manifests Directly

Use version-controlled manifests. For example, a ResourceQuota definition might be:

apiVersion: v1
kind: ResourceQuota
metadata:
 name: compute-quota
 namespace: my-namespace
spec:
 hard:
 requests.cpu: "4"
 requests.memory: 8Gi
 limits.cpu: "8"
 limits.memory: 16Gi 
 Store this in Git and apply changes via a deployment pipeline or kubectl apply.

### Make Incremental Changes

If you need to increase a quota, raise it by a small amount and observe. For example, to increase CPU requests from 4 to 5 cores, modify the manifest:

requests.cpu: "5" 
 Apply the change:

kubectl apply -f resourcequota.yaml 
 Verify:

kubectl get resourcequota compute-quota -n my-namespace 
 The REQUEST column should now show the new hard limit.

### Use kubectl patch for Quick Adjustments

For a temporary change, you can patch directly:

kubectl patch resourcequota compute-quota -n my-namespace --type='json' -p='[{"op": "replace", "path": "/spec/hard/requests.cpu", "value": "5"}]' 
 Verify with:

kubectl get resourcequota compute-quota -n my-namespace -o jsonpath='{.spec.hard.requests.cpu}' 
 Expected output:

5 

### Adjusting Pod Resource Requests

 If the issue is a pod requesting too much, reduce its requests rather than increasing the quota. Edit the deployment:

kubectl edit deployment web -n my-namespace 
 Find the container spec and change:

resources:
 requests:
 cpu: "250m"
 memory: "256Mi" 
 Save and exit. The deployment will roll out a new pod with lower requests, freeing quota for other workloads.

## Verification and Diagnostics

After making changes, verify that the issue is resolved and understand why it happened. This section covers diagnostic commands and interpretation of results.

### Check Recent Events

Kubernetes events often contain quota-related messages. List events sorted by time:

kubectl get events -n my-namespace --sort-by=.lastTimestamp 
 Example of a quota exceeded event:

LAST SEEN TYPE REASON OBJECT MESSAGE
2m Warning FailedCreate replicaset/web-... (combined from similar events): Error creating: pods "web-..." is forbidden: exceeded quota: compute-quota, requested: requests.cpu=250m,requests.memory=256Mi, used: requests.cpu=4000m,requests.memory=8192Mi, limited: requests.cpu=4,requests.memory=8Gi 
 This clearly shows the quota name, the resource requested, current usage, and the hard limit.

### Check Pod Status and Descriptions

When a pod cannot be created due to quota, it will not appear in get pods because it was never admitted. Instead, check the replicaset or deployment status:

kubectl get deployment web -n my-namespace 
 Output may show:

NAME READY UP-TO-DATE AVAILABLE AGE
web 2/3 3 2 1h 
 Describe the deployment to see conditions:

kubectl describe deployment web -n my-namespace 
 Look for a condition like:

ReplicaFailure True FailedCreate 
 Then inspect the replicaset events as above.

### Use kubectl describe on ResourceQuota

This gives a snapshot of usage vs hard limits:

kubectl describe resourcequota compute-quota -n my-namespace 
 If usage equals hard for a resource, that resource is saturated. You must either reduce requests or increase the quota.

### Check API Server Logs for Admission Denials

If you have access to the Kubernetes API server logs, search for the namespace and quota name:

grep "exceeded quota" /var/log/kubernetes/kube-apiserver.log | tail -20 
 This can provide additional context, especially if events have aged out.

<style>
.eno-quiz-widget{margin:2rem 0;padding:1.5rem;border-radius:12px;background:var(--eno-surface-lowest,#f7f7f8);border:1px solid var(--eno-border-soft,#e2e2e6);font-family:var(--eno-font-body,Inter,sans-serif)}
.eno-quiz-widget .eno-quiz-kicker{font-family:var(--eno-font-label,"JetBrains Mono",monospace);font-size:.75rem;letter-spacing:.05em;text-transform:uppercase;color:var(--eno-text-muted,#5f5f68);margin:0 0 .5rem}
.eno-quiz-widget .eno-quiz-question{font-family:var(--eno-font-heading,"Hanken Grotesk",sans-serif);font-size:1.0625rem;font-weight:600;margin:0 0 1rem;color:var(--eno-text-strong,#1a1a1f)}
.eno-quiz-widget .eno-quiz-options{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.5rem}
.eno-quiz-widget .eno-quiz-option{display:block;width:100%;min-height:44px;text-align:left;padding:.625rem .875rem;border-radius:8px;border:1.5px solid var(--eno-border-soft,#e2e2e6);background:#fff;font-size:.9375rem;cursor:pointer;transition:border-color var(--eno-motion-base,180ms ease-out),background var(--eno-motion-base,180ms ease-out)}
.eno-quiz-widget .eno-quiz-option:hover{border-color:var(--eno-primary,#0059bb)}
.eno-quiz-widget .eno-quiz-option:focus-visible{outline:none;box-shadow:0 0 0 3px rgb(0 89 187 / 0.15)}
.eno-quiz-widget .eno-quiz-option[aria-pressed="true"]{border-color:var(--eno-primary,#0059bb);background:rgb(0 89 187 / 0.06)}
.eno-quiz-widget .eno-quiz-option[data-correct="true"].eno-quiz-revealed{border-color:var(--eno-success,#17803a);background:rgb(23 128 58 / 0.08)}
.eno-quiz-widget .eno-quiz-option[data-correct="false"].eno-quiz-revealed.eno-quiz-was-selected{border-color:var(--eno-error,#ba1a1a);background:var(--eno-error-soft,#ffdad6)}
.eno-quiz-widget .eno-quiz-option-icon{display:inline-block;width:1.1em;margin-right:.4em;font-weight:700}
.eno-quiz-widget .eno-quiz-submit{margin-top:1rem;min-height:44px;padding:.5rem 1.25rem;border-radius:8px;border:none;background:var(--eno-primary,#0059bb);color:#fff;font-weight:600;font-size:.9375rem;cursor:pointer;transition:opacity var(--eno-motion-base,180ms ease-out)}
.eno-quiz-widget .eno-quiz-submit:disabled{opacity:.5;cursor:not-allowed}
.eno-quiz-widget .eno-quiz-submit:focus-visible{outline:none;box-shadow:0 0 0 3px rgb(0 89 187 / 0.15)}
.eno-quiz-widget .eno-quiz-explanation{margin-top:1rem;padding:.875rem 1rem;border-radius:8px;font-size:.9375rem;line-height:1.5;display:none}
.eno-quiz-widget .eno-quiz-explanation.eno-quiz-visible{display:block}
.eno-quiz-widget .eno-quiz-explanation.eno-quiz-correct{background:rgb(23 128 58 / 0.08);color:var(--eno-success,#17803a)}
.eno-quiz-widget .eno-quiz-explanation.eno-quiz-incorrect{background:var(--eno-error-soft,#ffdad6);color:var(--eno-error,#ba1a1a)}
@media (prefers-reduced-motion: reduce){.eno-quiz-widget *{transition:none!important}}
</style><div class="eno-quiz-widget" role="group" aria-label="Quick check question">
Quick check 2 of 2

What does the `.status.allocatable` field on a Node describe?

- The total capacity of the node
- The amount of resources available to Pods on that node
- The resource requests of all Pods on the node
- The resource limits of all Pods on the node

<button type="button" class="eno-quiz-submit" disabled>Submit</button>
<div class="eno-quiz-explanation">The `.status.allocatable` field describes the amount of resources that are available to Pods on that node, accounting for system daemons.</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
  document.querySelectorAll('.eno-quiz-widget:not([data-eno-quiz-bound])').forEach(function (widget) {
    widget.setAttribute('data-eno-quiz-bound', '1');
    var options = Array.prototype.slice.call(widget.querySelectorAll('.eno-quiz-option'));
    var submitBtn = widget.querySelector('.eno-quiz-submit');
    var explanation = widget.querySelector('.eno-quiz-explanation');
    var selected = null;
    options.forEach(function (opt) {
      opt.addEventListener('click', function () {
        if (widget.hasAttribute('data-eno-quiz-answered')) return;
        options.forEach(function (o) { o.setAttribute('aria-pressed', 'false'); });
        opt.setAttribute('aria-pressed', 'true');
        selected = opt;
        submitBtn.disabled = false;
      });
    });
    submitBtn.addEventListener('click', function () {
      if (!selected || widget.hasAttribute('data-eno-quiz-answered')) return;
      widget.setAttribute('data-eno-quiz-answered', '1');
      submitBtn.disabled = true;
      var correct = selected.getAttribute('data-correct') === 'true';
      options.forEach(function (o) {
        o.classList.add('eno-quiz-revealed');
        if (o === selected) o.classList.add('eno-quiz-was-selected');
        var icon = o.querySelector('.eno-quiz-option-icon');
        if (o.getAttribute('data-correct') === 'true') icon.textContent = '\u2713';
        else if (o === selected) icon.textContent = '\u2717';
      });
      explanation.classList.add('eno-quiz-visible', correct ? 'eno-quiz-correct' : 'eno-quiz-incorrect');
    });
  });
});
</script>

## Failure Modes and Recovery

Understanding common failure modes helps you recover faster. Here are scenarios and recommended recovery steps.

### Failure Mode 1: New Pods Fail to Schedule

Symptom: Deployment shows fewer replicas than desired, and events show exceeded quota .

Diagnosis: Quota for one or more resources is exhausted.

Recovery:

- Identify the exhausted resource from events or describe quota.

- If possible, reduce the resource requests of the new pod or other pods in the namespace to free up quota.

- Alternatively, increase the quota hard limit for that resource, but only after confirming cluster capacity.

- Verify the deployment scales up: kubectl rollout status deployment/web -n my-namespace

### Failure Mode 2: Existing Pods Evicted or Terminated

Symptom: Pods are being killed, and the node shows pressure.

Diagnosis: This is usually not a ResourceQuota issue but a node-level resource pressure. However, if a quota is set for requests.storage and a persistent volume claim exceeds it, new PVCs will be rejected.

Recovery:

- Check node conditions: kubectl describe node <node-name> | grep -A5 Conditions

- If storage quota exceeded, delete unused PVCs or increase the quota.

- If node pressure, cordon and drain the node, or add capacity.

### Failure Mode 3: Quota Not Enforced

Symptom: Resource usage exceeds quota limits without rejection.

Diagnosis: The ResourceQuota object might be misconfigured or not applied to the namespace. Check that the namespace has the correct labels if using quota selectors.

Recovery:

- Verify quota exists: kubectl get resourcequota -n my-namespace

- Check if quota has spec.scopeSelector or spec.scopes that exclude certain pods.

- Ensure the quota is not in a different namespace.

- Reapply the quota manifest if missing.

### Failure Mode 4: Pods with Priority Classes

Symptom: High-priority pods are evicted or cannot be created.

Diagnosis: Quotas can be scoped to priority classes. If a quota has scopeSelector matching a high-priority class, it may be limited.

Recovery:

- Review the quota: kubectl get resourcequota compute-quota -n my-namespace -o yaml

- If necessary, adjust the quota or pod priority.

### Recovery Verification

After any recovery action, always verify:

kubectl get resourcequota -n my-namespace
kubectl get pods -n my-namespace
kubectl get events -n my-namespace --sort-by=.lastTimestamp | tail -10 
 Ensure usage is within limits and no new quota errors appear.

## Operations Checklist

Use this checklist to ensure a systematic approach to Resource Quota troubleshooting and recovery.

<div class="my-stack-md overflow-x-auto">
<table class="min-w-[42rem] border-collapse text-left">
<thead><tr><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Step</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Action</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Command / Verification</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Expected Result</th></tr></thead>
<tbody><tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">1</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Identify cluster version</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">kubectl version --short</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Client and server versions compatible</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">2</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">List quotas in namespace</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">kubectl get resourcequota -n my-namespace</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Quota object exists with hard limits</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">3</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Check current usage</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">kubectl describe resourcequota compute-quota -n my-namespace</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Used values less than or equal to hard limits</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">4</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Inspect recent events</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">kubectl get events -n my-namespace --sort-by=.lastTimestamp</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">No recent <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">exceeded quota</code> warnings</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">5</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Review pod resource requests</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">kubectl get pods -n my-namespace -o custom-columns=...</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Sum of requests below quota hard limit</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">6</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">If quota exhausted, identify which resource</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">From describe or events</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Specific resource (cpu, memory, storage) identified</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">7</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Decide: reduce requests or increase quota</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Analyze workload requirements</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Minimal change that resolves issue</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">8</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Apply change via version control or patch</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">kubectl apply -f manifest.yaml</code> or <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">kubectl patch ...</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Change accepted without errors</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">9</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Verify quota updated</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">kubectl get resourcequota -n my-namespace</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">New hard limit reflected</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">10</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Monitor deployment rollout</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">kubectl rollout status deployment/web -n my-namespace</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Deployment successfully rolled out</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">11</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Confirm no new quota events</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">kubectl get events -n my-namespace --sort-by=.lastTimestamp</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">No <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">exceeded quota</code> events in last 5 minutes</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">12</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Document change and rollback plan</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Update runbook or incident notes</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Recovery steps recorded</td></tr></tbody>
</table>
</div>

## Conclusion

Kubernetes Resource Quota troubleshooting requires a methodical approach: understand your environment, make minimal changes, verify thoroughly, and be prepared to recover. By following the steps in this guide, you can quickly diagnose quota-related issues and restore service without causing additional disruption.

Always remember to observe before changing, protect sensitive values, and document your actions. With the right commands and a systematic checklist, Resource Quota problems become manageable rather than mysterious. As a next step, run the first three diagnostic commands in your own cluster to establish a baseline, and practice adjusting a quota in a non-production namespace.