Home/Technologies/Kubernetes
Technology · Cloud & data

Kubernetes and Docker, run as a paved road.

Containers, clusters, Helm and GitOps from engineers who operate them under our own products. The platform your teams deploy to without thinking about it.

KubernetesWhat we build with it
01Managed clusters as code
02The paved road for application teams
03GitOps delivery
04Ingress, service mesh and zero-trust networking
05Stateful workloads done carefully
06Migration onto containers
Usually runs with
  1. Docker
  2. Kubernetes
  3. Helm
  4. ArgoCD
  5. Terraform
  6. GitHub Actions
Why we use it

Docker gave us one artefact that runs the same on a laptop, in CI and in production.

Kubernetes gave us one API for putting that artefact somewhere, keeping it alive, scaling it and routing traffic to it — on AWS, Azure, Google Cloud or a rack in Türkiye, with the same manifests. It is part of the stack our own products run on — Loyalty & Retention, Sales Performance, Order & Supply Management and Workflow & Procurement — on clusters our DevOps & Cloud practice operates.

The value is not the scheduler. It is what a cluster makes cheap: rolling deploys with automatic rollback, horizontal scaling from a metric, self-healing on node failure, and one place — the manifest — where the whole shape of a service is written down and reviewed. Teams that have this can ship small changes often. Teams that do not ship big changes on weekends.

When we don’t: a single monolith with three engineers and steady traffic does not need a cluster; managed containers (ECS, Azure Container Apps, Cloud Run) or a PaaS such as Vercel carry it for a fraction of the platform work. We say so in the assessment, in writing, before anyone buys a control plane.

What we build with it

Six things we ship on Kubernetes.

01

Managed clusters as code

EKS, AKS and GKE clusters defined in Terraform — node pools, IAM or workload identity, networking, private endpoints — reproducible per environment and disposable when a client wants to prove it.

02

The paved road for application teams

A base Helm chart, a Dockerfile template per language, a pipeline that builds, scans, signs and deploys. A new service can reach production with dashboards and alerts already attached.

03

GitOps delivery

ArgoCD reconciling clusters from Git, so the desired state is reviewed in a pull request and drift is visible. Rollback is a revert, not a war room.

04

Ingress, service mesh and zero-trust networking

Ingress controllers, mTLS between services where the compliance posture requires it, network policies that default to deny, and egress that is allow-listed and logged.

05

Stateful workloads done carefully

Kafka, Redis and search clusters run on Kubernetes with operators, persistent volumes and rehearsed restores. PostgreSQL usually stays managed, and we explain why.

06

Migration onto containers

Containerising legacy Java, .NET and Node.js services during a cloud migration — one workload at a time, behind the same ingress, with rollback to the VM until the cutover is proven.

Fit

When to choose it.

Right fit

Choose Kubernetes when you run many services, several teams deploy independently, traffic varies enough that scaling by hand hurts, or you need the same platform across more than one cloud or an on-premise data centre. It fits estates where a platform team can own the cluster and application teams consume it through a paved road. It also fits regulated organisations that need network policy, admission control and an audit trail of every change as code.

Look elsewhere

Look elsewhere when there is one application and no platform team to run the cluster — the control plane becomes a second product nobody asked for. Look elsewhere when the workload is a website or an API that a managed container service or a PaaS runs happily, and when your organisation is not yet ready to invest in observability; Kubernetes without traces and dashboards is harder to operate than the VMs it replaced.

In practice

A deployment that can be rolled back and rolled forward safely.

values.yamlyaml
image: registry.odeontech.internal/loyalty-api:2.14.3
replicas: 3
# Pods only receive traffic once they can actually serve it
readinessProbe: { httpGet: { path: /ready, port: 8080 }, periodSeconds: 5 }
livenessProbe:  { httpGet: { path: /live,  port: 8080 }, periodSeconds: 10 }
resources:
  requests: { cpu: 250m, memory: 512Mi }
  limits:   { memory: 512Mi }
# Never lose the last healthy replica during a rollout or a node drain
strategy: { rollingUpdate: { maxUnavailable: 0, maxSurge: 1 } }
podDisruptionBudget: { minAvailable: 2 }
+ autoscaling: { min: 3, max: 12, targetCPU: 65 }
topologySpreadConstraints: zone
Reference architecture

A cluster the way we hand it over.

Delivery
GitHub ActionsImage scan & signingArgoCDPreview environments
Cluster
Ingress & TLSNetwork policyAdmission controlAutoscaling
Workloads
Stateless servicesKafka consumersCron & batch jobsStateful operators
Foundations
TerraformEKS / AKS / GKEManaged PostgreSQLOpenTelemetry · Prometheus · Grafana
Our standards

What the clusters we hand over have.

  • Everything as code. Cluster, node pools, namespaces, RBAC and add-ons in Terraform; workloads in Helm or Kustomize; both reviewed in pull requests. No kubectl apply from a laptop into production.
  • Small, reproducible images. Multi-stage Dockerfiles, distroless or slim bases, non-root users, pinned digests and an SBOM per build. Images are scanned in CI and signed before a cluster will admit them.
  • Requests and limits on every pod, with memory limits equal to requests so the scheduler’s picture matches reality. Vertical recommendations reviewed regularly, at a rhythm agreed with you; nobody guesses capacity.
  • Probes that tell the truth. Readiness reflects real dependencies, liveness reflects only the process, and startup probes cover slow JVMs — because a wrong probe turns a slow database into a restart storm.
  • Observability from the first deploy: OpenTelemetry traces, Prometheus metrics and structured logs shipped by default, with SLO dashboards and alerting on symptoms users feel.
  • Network policy default-deny per namespace, secrets from a vault or the cloud’s secret manager via CSI, and admission policies that reject privileged pods and unsigned images.
  • Disruption budgets, spread constraints and rehearsed node drains — a cluster upgrade or a spot reclaim is routine, tested in staging on the same versions first.
  • A runbook and a cost report. Upgrade, rollback, scale, restore and on-call procedures in writing; per-namespace cost visible from the first deploy so rightsizing is a habit, not a project.
Typical pairings

What usually ships alongside the cluster.

  • Terraform modules for the cluster and its landing zone, with a documented environment promotion path
  • A base Helm chart and Dockerfile templates for each language your teams use
  • CI pipelines that build, test, scan, sign and publish images, and an ArgoCD application set that deploys them
  • Grafana dashboards, alert rules and SLO definitions exported as code
  • Load-test results that established the autoscaling thresholds
  • Runbooks for upgrades, rollback, incident response and disaster recovery, rehearsed in a game day with your team
Usually runs with
DockerKubernetesHelmArgoCDTerraformGitHub ActionsPrometheusGrafanaOpenTelemetryAWSAzureGoogle Cloud
FAQ

Frequently asked questions

Maybe not, and we would rather say so early. The assessment we start with scores your workloads on service count, team structure, traffic shape and compliance needs. Below a certain size the honest answer is a managed container service or a PaaS; above it, a cluster with a paved road can pay for itself in deploy frequency and recovery time.
Managed — EKS, AKS or GKE — in almost every case. Running your own control plane buys little and costs an on-call rota. We self-manage only where a data-residency rule or an on-premise requirement leaves no choice, and then with the same automation.
Usually not. We keep PostgreSQL and MongoDB on managed services with automated backups and failover, and run only the stateful systems that have mature operators — Kafka, Redis, search — inside the cluster, with rehearsed restores.
Yes. We start with a read-only audit: versions, add-ons, RBAC, network policy, image provenance, cost and what is not in code. You receive a ranked list of risks and a plan to bring the cluster under GitOps without a big-bang migration.
By doing them often and in the same way each time. Minor versions are rehearsed in staging on the same add-on set, applied with disruption budgets in place, and scheduled at a rhythm agreed with you, to keep a cluster within support.
Related

Neighbouring stacks and the services that use them.

Want deploys to be the least interesting event of the day?

Tell us how many services you run and how you deploy them today. A Kubernetes engineer reads it and replies in writing with how we would approach it.

✓ No pitch deck✓ Reply from an AI-native engineer✓ Written follow-up