Running Kubernetes in a local cluster and running it in production are two fundamentally different engineering challenges. A 2026 arXiv paper on ARBITER — a system designed for SLO-oriented autonomous Kubernetes remediation — found that clusters lacking foundational readiness hygiene generated cascading alert storms that overwhelmed even automated repair agents (arXiv:2607.19182). Meanwhile, a companion study on multi-tenant Kubernetes use cases across AI, secure computing, and data service workloads (arXiv:2608.00742) documented that teams operating without structured production standards repeatedly re-learned the same painful lessons. This checklist is designed so you don't have to.
1. Resource Requests and Limits Are Non-Negotiable
The single most common root cause of production Kubernetes incidents is missing or incorrect resource requests and limits. Without them:
- The Kubernetes scheduler cannot make informed placement decisions
- A single runaway pod can exhaust node resources and evict neighbors
- Horizontal Pod Autoscaler (HPA) has no baseline to scale against
- Quality of Service (QoS) class falls to BestEffort — the first to be evicted under memory pressure
What to set: Every container should specify both resources.requests and resources.limits for CPU and memory. For most web workloads, set limits to 2–3× the measured P99 consumption. For memory in particular, set limits equal to requests to guarantee a Guaranteed QoS class for critical services.
Tooling: Use kubectl top pods and kubectl top nodes during load testing to observe actual consumption, then set requests accordingly. VPA (Vertical Pod Autoscaler) in recommendation mode can automate this baseline.
2. Health Probes Must Reflect Real Readiness
Liveness, readiness, and startup probes are how Kubernetes decides whether a pod is fit to serve traffic. Incorrect probes cause two equally damaging failure modes: healthy pods getting killed unnecessarily, or sick pods continuing to receive traffic.
- Startup probe — use for containers with slow initialization (database connection pools, JVM warmup). Set a generous
failureThreshold × periodSecondswindow so the pod isn't killed before it's ready. - Liveness probe — should check the absolute minimum: is the process alive and not deadlocked? Do not check downstream dependencies here. A liveness probe that fails because a database is temporarily unavailable will restart every pod in the deployment simultaneously, turning a database outage into a full application outage.
- Readiness probe — this is where dependency checks belong. A pod that cannot reach its database should fail readiness and be removed from the service endpoint — but it should not be restarted.
Image: D2iQ-Platform-Applications — Jordanaragon (CC BY-SA 4.0), via Wikimedia Commons
3. RBAC: Start with Least Privilege, Stay There
Role-Based Access Control is enabled by default in modern Kubernetes distributions, but "enabled" does not mean "configured correctly." Common mistakes that cost teams dearly in production:
- Binding workload service accounts to
cluster-admin— this is the Kubernetes equivalent of running your web server as root. Any compromised workload becomes a full cluster compromise. - Sharing service accounts across workloads — each deployment should have a dedicated service account with only the API permissions it actually needs.
- Leaving default service account tokens mounted — Kubernetes automounts the default service account token in every pod unless you opt out. Add
automountServiceAccountToken: falseto pods and service accounts that do not need API access.
Audit existing permissions with kubectl auth can-i --list --as=system:serviceaccount:<ns>:<sa> for each service account, and use tools like rbac-lookup or rakkess to get a readable matrix of what each identity can do.
4. Namespace Segmentation and Network Policies
By default, all pods in a Kubernetes cluster can communicate with all other pods across all namespaces. This flat network model is convenient for development and catastrophic for production multi-tenancy.
- Namespace segmentation — run production, staging, and development workloads in separate namespaces at minimum. Prefer separate clusters for hard security boundaries, especially for regulated workloads.
- Default deny NetworkPolicy — deploy a default-deny-all ingress policy in every namespace, then explicitly allow only the traffic that each workload legitimately needs.
- Ingress controller isolation — run a dedicated ingress controller per security tier rather than sharing one across namespaces with different trust levels.
The 2026 multi-tenant Kubernetes study specifically highlighted network policy misconfiguration as the leading cause of unintended cross-tenant data exposure in shared clusters (arXiv:2608.00742).
5. Observability: You Cannot Fix What You Cannot See
A cluster without structured observability is a cluster you are flying blind. Production-grade observability in Kubernetes requires three pillars:
Metrics: Deploy Prometheus (or a managed equivalent) to scrape cluster and workload metrics. Critical metrics to alert on: pod restarts (CrashLoopBackOff), pending pods (scheduling failures), memory approaching limits (before OOMKill), HPA at maximum replicas (scaling ceiling hit), and PersistentVolume capacity.
Logs: Aggregate container logs centrally with a log shipper (Fluent Bit is the standard choice for low overhead). Structure logs as JSON from application code — it makes filtering and alerting orders of magnitude easier than parsing unstructured text.
Traces: Instrument services with OpenTelemetry and export traces to a compatible backend (Jaeger, Tempo, or a managed service). Distributed tracing is the only practical way to debug latency issues that span multiple microservices. A 2026 paper on lazy-loading container images with Seekable OCI (arXiv:2607.06868) measured startup time reductions of over 60% using range-request indexed layers — a reminder that even container image pull latency is measurable and optimizable once you have tracing in place.
6. Pod Disruption Budgets and Anti-Affinity for Availability
Kubernetes drains nodes for cluster upgrades, node auto-scaling events, and spot instance reclamation. Without Pod Disruption Budgets (PDBs), a cluster upgrade can take down your entire deployment simultaneously.
- PodDisruptionBudget — set
minAvailableormaxUnavailablefor every critical deployment. A PDB ofminAvailable: 1ensures Kubernetes never drains all pods of a deployment at once. - Pod anti-affinity rules — use
podAntiAffinitywithtopologyKey: kubernetes.io/hostnameto spread replicas across nodes. This prevents a single node failure from taking down all instances of a service. - Topology spread constraints — the modern, more flexible replacement for anti-affinity; use it to spread pods across zones as well as nodes for multi-AZ deployments.
| Configuration Area | Development Cluster | Production Cluster |
|---|---|---|
| Resource requests/limits | Optional | Required on every container |
| Health probes | Liveness only (optional) | Liveness + Readiness + Startup |
| Service accounts | Default (shared) | Dedicated per workload, least privilege |
| Network policy | None (allow-all) | Default-deny with explicit allows |
| Pod disruption budget | Not needed | Required for critical deployments |
| Observability stack | Basic logging | Metrics + logs + traces (full stack) |
| Pod anti-affinity | Not configured | Spread across nodes and zones |
| Image tag policy | latest acceptable | Immutable digest or pinned semver tags only |
Frequently Asked Questions
Do I need a separate cluster for staging and production?
For most teams, yes. Namespace separation within a single cluster provides logical isolation but not strong security or resource isolation boundaries. A misconfigured namespace-scoped role, a runaway workload that exhausts cluster-wide resources, or a botched cluster upgrade can affect all namespaces simultaneously. If budget allows, separate clusters with identical configuration managed via GitOps (ArgoCD or Flux) is the industry-standard recommendation for production workloads handling sensitive data or requiring strong reliability guarantees.
How do I handle secrets — should I use Kubernetes Secrets?
Native Kubernetes Secrets are base64-encoded, not encrypted, and are accessible to anyone with appropriate RBAC permissions in the namespace. For production use, layer at least one of the following on top: enable etcd encryption at rest (supported by most managed Kubernetes providers), use a secrets manager integration (AWS Secrets Manager, HashiCorp Vault, or Azure Key Vault) via the Secrets Store CSI driver, or use sealed-secrets to store encrypted secret manifests safely in Git. Never store secrets as environment variables baked into container images.
What is the most important thing to test before a production deployment?
Run a controlled node drain in a staging environment that mirrors production topology. This single test will reveal whether your PodDisruptionBudgets are actually configured, whether your readiness probes accurately reflect dependency health, whether your HPA responds fast enough under load during pod churn, and whether your CI/CD pipeline can roll back cleanly if a deployment fails. Most Kubernetes production incidents we see in post-mortems could have been caught by this one test in staging.
Bottom Line: Kubernetes production readiness is not a single checklist item to tick before go-live — it is an ongoing operational posture. We recommend starting with the four highest-leverage areas: resource limits, probe configuration, RBAC least privilege, and a default-deny network policy. With those four in place, even imperfect observability will start giving you something actionable to work with. Build from there iteratively, validating each change in staging before rolling it to production.
Sources & References:
ARBITER: Guarded Agentic Control for SLO-Oriented Kubernetes Remediation (arXiv:2607.19182, 2026)
Multi-tenant Kubernetes Use Cases for AI, Secure Computing and Data Services, and More (arXiv:2608.00742, 2026)
Seekable OCI: Lazy-Loading Container Images via Range-Request Indexing (arXiv:2607.06868, 2026)
Disclaimer: This article is for informational purposes only. Technology landscapes change rapidly; verify information with official sources before making technical decisions.