Skip to main content
Cloud DevOps Solutions
Get a quote Talk to an engineer

Containers and Kubernetes

Running Kubernetes in Production, Without the Operational Surprises

Kubernetes is an open-source system that schedules containers across a fleet of machines, restarts them when they fail and exposes them through stable networking. We design, harden and operate production clusters on EKS, AKS and GKE, covering access control, networking, autoscaling, upgrades and monitoring.

Key takeaways

  • Kubernetes is a platform for building platforms: powerful, but it only pays off when you have enough services and teams to justify the operational surface.
  • Most production incidents trace back to missing resource requests, absent disruption budgets, over-broad RBAC or skipped upgrades, not to Kubernetes itself.
  • Use a managed control plane (EKS, AKS or GKE) unless you have a hard on-premises or air-gapped requirement.
  • Everything that defines a cluster should live in version control and be applied by a pipeline or a GitOps controller.
  • Upgrade on a calendar, one minor version at a time, after scanning for removed APIs.

What teams use Kubernetes for

Many services, many teams

A shared scheduling layer with namespaces, quotas and policy lets independent teams deploy without stepping on each other.

Elastic, spiky workloads

Pod and node autoscaling absorb traffic peaks and scale back down, so capacity follows demand rather than the other way round.

Standardised delivery

One deployment model, one packaging format and one rollout strategy across every service, which makes onboarding and incident response simpler.

Portability across clouds

The same manifests and tooling run on EKS, AKS, GKE or on-premises, which reduces the cost of a future migration even though it never removes it.

Batch, data and ML jobs

Jobs, CronJobs and queue-driven workers share the same cluster as services and use spare capacity efficiently.

What Kubernetes is and why teams adopt it

Kubernetes is an open-source container orchestrator. You describe the state you want (this image, three replicas, this much memory, exposed on this port) and a set of controllers keep reality matching that description. If a node dies, pods are rescheduled. If load grows, you can add replicas or nodes. If a rollout goes wrong, you roll back to the previous ReplicaSet.

Teams adopt it for consistency more than for raw power. Once everything is a Kubernetes object, deployment, scaling, secrets, configuration and access follow one model, which is what makes a ten-team organisation manageable. Our Kubernetes consulting work starts from that view: the goal is a boring, predictable platform that product engineers rarely have to think about.

It is also a commitment. You are taking on networking, identity, storage, upgrades and a large add-on ecosystem. That is the right trade for many companies and the wrong one for some, and we say so early.

How we design a production cluster

Topology and environments

Start with the smallest number of clusters that meets your isolation needs. For most startups and scale-ups that is one non-production and one production cluster, with namespaces, quotas and network policy separating teams. Add clusters when you need regional presence, regulatory separation or a smaller blast radius for upgrades. Our write-up on multi-cluster strategy for dev, staging and prod covers the decision in more detail.

We build clusters on a managed control plane and define them in Terraform, so a cluster is a reviewed module rather than a hand-tuned snowflake. The cloud-specific differences (identity, networking, upgrade mechanics) are covered on our pages for Amazon EKS, Azure AKS and Google GKE.

Workload settings that matter most

Three settings account for a large share of avoidable incidents:

  • Requests and limits. Requests drive scheduling and autoscaling, so missing or inflated values either overpack nodes or waste money. We set them from observed usage rather than guesses. See our approach to requests, limits, HPA and PDB tuning.
  • Probes. Readiness probes decide whether traffic is sent to a pod, liveness probes decide whether it is restarted. A badly chosen liveness probe can turn a slow dependency into a restart storm.
  • PodDisruptionBudgets. Without them, a node drain during an upgrade can remove every replica of a service at once.
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: checkout-api
  namespace: shop
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: checkout-api

Security and access

Treat the cluster as a multi-tenant system even if all tenants are your own teams.

  • RBAC should grant namespaced roles to groups from your identity provider, not cluster-admin to individuals. Review it regularly; least-privilege RBAC is one of the first things we fix on inherited clusters.
  • Network policies turn the default allow-all pod network into an explicit allow-list. Start with a default deny per namespace and open only what services need (implementation guide).
  • Pod Security Standards stop privileged containers, host mounts and root users from reaching production unless deliberately allowed.
  • Secrets should come from a cloud secret manager or sealed, encrypted manifests, and etcd encryption should be enabled on your provider.
  • Images should be scanned in CI and signed or at least pinned by digest, from a registry you control.

Cost and capacity

Kubernetes cost problems are mostly capacity problems. Oversized requests leave nodes half empty; undersized ones cause throttling and evictions. We combine right-sized requests, the Horizontal Pod Autoscaler for replicas, and a node autoscaler (Karpenter on AWS, the cluster autoscaler or node auto-provisioning elsewhere) so nodes follow pod demand. Spot or preemptible capacity suits stateless, interruption-tolerant workloads; keep stateful and latency-critical services on on-demand nodes.

Add cost visibility by namespace and label early. Teams that can see their own spend tend to fix it themselves.

Day-2 operations

Upgrades

Kubernetes ships minor releases regularly, and each is supported for a limited window. Plan upgrades as a recurring calendar item: scan for removed APIs, upgrade the control plane, then add-ons, then nodes, one minor version at a time. Our upgrade planning and execution service produces a runbook and runs it with you.

Observability

Metrics, logs and traces answer different questions. We typically deploy Prometheus and Grafana for metrics and alerting, a log pipeline (Loki or a managed equivalent) and OpenTelemetry for traces. Alert on symptoms users feel (error rate, latency, saturation), not every pod restart. See monitoring Kubernetes with Prometheus and Grafana.

Backup and recovery

Stateless workloads are rebuilt from Git. Persistent volumes, databases and cluster-scoped objects such as custom resources need explicit backup, and restores must be rehearsed, not assumed.

Common failure modes

  • No resource requests: noisy neighbours and unpredictable evictions.
  • Skipped upgrades: a forced multi-version jump under time pressure.
  • Cluster-admin everywhere: one leaked credential becomes a full compromise.
  • Ingress as a single point of failure: one replica, no disruption budget, no alerts.
  • Unbounded add-ons: twenty Helm charts nobody owns, each with its own upgrade path.

A production readiness audit checks for each of these against your real cluster.

When not to use Kubernetes

If you run a few services, have one small team and do not need custom scheduling, a managed container platform such as ECS on Fargate or Cloud Run will cost you less attention. If your workload is mostly event-driven functions, serverless may suit better. If you do move to Kubernetes later, start with one managed cluster and one deployment pipeline, and grow from there. When you are ready to talk specifics, book a consultation and we will give you a straight answer on fit.

Official documentation: kubernetes.io

How we work with Kubernetes

  1. 01

    Production readiness audit

    We review security, upgrade posture, resource settings, backups and observability, and agree a prioritised plan before touching anything.

  2. 02

    Cluster and environment design

    We decide cluster topology, node pools, networking model and account or subscription boundaries, expressed as Terraform.

  3. 03

    Harden access and workloads

    RBAC, Pod Security Standards, network policies and secrets handling are applied as code and tested.

  4. 04

    Set capacity and autoscaling

    Requests, limits, autoscalers and disruption budgets are tuned from real usage data.

  5. 05

    Deliver with GitOps

    Workloads and add-ons are reconciled from Git by Argo CD or Flux so every change is reviewed and reversible.

  6. 06

    Operate and upgrade

    We run monitoring, alerting and a version upgrade calendar, with runbooks your own engineers can follow.

Kubernetes compared with the alternatives

We recommend the tool that fits your team, not the one we know best. Here is when each option makes sense.

OptionChoose it when
KubernetesKubernetes is an open-source system that schedules containers across a fleet of machines, restarts them when they fail and exposes them through stable networking.
Amazon ECS on Fargate or Cloud RunChoose a managed container service when you run a handful of services, want no cluster to patch and do not need custom schedulers, operators or a service mesh.
AWS Lambda or Azure FunctionsChoose functions for event-driven, short-lived work where you would rather pay per invocation than manage any runtime.
HashiCorp NomadChoose Nomad if you want a simpler scheduler that also runs non-container workloads and your team already knows the HashiCorp stack.
Docker Compose on a single hostChoose this for early prototypes and internal tools where downtime tolerance is high and the operational overhead of a cluster is not justified.

Tools we use alongside Kubernetes

HelmArgo CDFluxTerraformPrometheusGrafanaOpenTelemetrycert-managerexternal-dnsKyvernoTrivyKarpenterIstiokubectl

Frequently asked questions

Do we actually need Kubernetes?
Not always. If you run fewer than a dozen services with predictable load and one team, a managed container service is usually cheaper and simpler. Kubernetes starts to pay off when you have many services, several teams, varied workload types or a need for fine-grained scheduling, and when you can staff the operational work or buy it in.
Should we use a managed Kubernetes service or run it ourselves?
Use managed. EKS, AKS and GKE run and patch the control plane for you, which removes the hardest part of operating a cluster. Self-managed clusters only make sense for on-premises, edge or air-gapped environments where no managed option exists.
What does a production-ready Kubernetes cluster need?
At minimum: least-privilege RBAC, resource requests and limits, PodDisruptionBudgets, network policies, a tested upgrade process, centralised logging and metrics with alerts, backups of anything stateful, and infrastructure defined as code. A readiness audit checks each of these against your actual workloads.
How often should we upgrade Kubernetes?
Roughly every few months, tracking the project's regular minor release cadence and the support window of your cloud provider. Upgrade one minor version at a time, scan for removed APIs first and rehearse in a non-production cluster. Falling behind turns routine upgrades into risky multi-version jumps.
How many clusters should we run?
Fewer than most teams assume. A common pattern is one non-production and one production cluster, separated by namespaces and policy, with extra clusters only for strong isolation, regulatory, regional or blast-radius reasons. Every cluster adds upgrade and monitoring work.
Can you take over a cluster someone else built?
Yes. We start read-only, audit what exists, document the risks in priority order and agree changes before making them. Most inherited clusters need the same handful of fixes: access control, resource settings, upgrades and observability.

Talk to an engineer about Kubernetes

Book a free 30-minute call. We review your current setup and tell you honestly whether and how we can help.

Written by Saddique Khan, DevOps / SRE / Cloud Consultant Engineer. Last updated 2026-10-09.