Kubernetes Fundamentals: Container Orchestration for IT Pros
Containers changed how applications are packaged, but managing hundreds of containers across multiple hosts requires orchestration. Kubernetes — originally developed by Google — has become the industry standard for deploying, scaling, and operating containerised workloads. This guide covers core concepts, managed offerings from the major cloud providers, resource planning, and honest guidance on when Kubernetes is and is not the right choice for your environment.
Why Container Orchestration Matters
Running a single Docker container on a developer's laptop is straightforward. Running fifty containers across a cluster of servers — ensuring they stay healthy, restart on failure, scale up during peak traffic, and communicate securely with each other — is a fundamentally different challenge. Container orchestration platforms automate these operational concerns: scheduling containers onto appropriate hosts, managing networking between them, mounting storage volumes, distributing configuration and secrets, and performing rolling updates without downtime. Without orchestration, teams end up writing brittle custom scripts that replicate functionality Kubernetes provides out of the box.
For Australian IT resellers and MSPs, Kubernetes proficiency is increasingly a market expectation. Clients running microservice architectures, SaaS products, or data-processing pipelines expect their infrastructure partners to design, deploy, and support Kubernetes environments. Even traditional workloads — web applications, APIs, background workers — benefit from Kubernetes' self-healing, auto-scaling, and declarative configuration model when the operational scale justifies the complexity.
Core Concepts: Pods, Services, and Deployments
The Pod is the smallest deployable unit in Kubernetes. A Pod encapsulates one or more containers that share the same network namespace (they can reach each other on localhost) and storage volumes. In most cases, a Pod runs a single application container, but sidecar patterns — adding a logging agent, a service mesh proxy, or a secrets-injector container alongside the main application — are common. Pods are ephemeral: they can be created, destroyed, and rescheduled at any time. You should never treat a Pod as a persistent entity; instead, rely on higher-level controllers to manage their lifecycle.
A Service provides a stable network endpoint for a set of Pods. Because Pods have transient IP addresses that change every time they are rescheduled, other components cannot rely on a Pod's IP directly. A Service uses label selectors to identify the Pods it fronts and provides a consistent ClusterIP (internal), NodePort, or LoadBalancer address. DNS-based service discovery allows other Pods to reach the service by name — for example, http://payment-api.production.svc.cluster.local. This abstraction decouples consumers from producers and supports rolling updates where old Pods are replaced by new ones without the consumer noticing any change.
A Deployment is the controller that manages the desired state of a set of Pods. You declare the container image, the number of replicas, resource requests and limits, environment variables, and health-check probes. Kubernetes then ensures that the actual state matches the desired state at all times. If a Pod crashes, the Deployment controller creates a replacement. If you update the container image, the Deployment performs a rolling update — creating new Pods with the updated image and draining traffic from old Pods — ensuring zero-downtime deployments. Rollbacks are a single command away: kubectl rollout undo deployment/my-app.
Namespaces, ConfigMaps, and Secrets
Namespaces partition a single Kubernetes cluster into virtual clusters. They provide a scope for names, resource quotas, and network policies, making it possible to run multiple teams or environments (dev, staging, production) on the same physical cluster with isolation. ConfigMaps store non-sensitive configuration data as key-value pairs or entire files and can be mounted into Pods as environment variables or volumes. Secrets are similar to ConfigMaps but are intended for sensitive data like passwords, tokens, and TLS certificates. While Kubernetes base64-encodes Secrets at rest by default, this is not encryption — enabling etcd encryption at rest or using an external secrets operator (such as HashiCorp Vault or AWS Secrets Manager) is recommended for production environments.
Managed Kubernetes: AKS, EKS, and GKE
Managed Kubernetes Offerings Compared
| Feature | Azure AKS | AWS EKS | Google GKE |
|---|---|---|---|
| Control plane cost | Free (standard tier); paid for uptime SLA tier | USD $0.10/hour per cluster | Free (Autopilot); USD $0.10/hour (Standard) |
| Node auto-scaling | Cluster autoscaler or KEDA | Cluster Autoscaler or Karpenter | Cluster Autoscaler or GKE Autopilot |
| Serverless Pods | ACI virtual nodes | Fargate profiles | GKE Autopilot (abstracts nodes entirely) |
| Networking model | Azure CNI or kubenet | VPC CNI (native AWS networking) | GKE VPC-native (alias IP ranges) |
| Australian regions | Australia East (Sydney), Australia Southeast (Melbourne) | ap-southeast-2 (Sydney) | australia-southeast1 (Sydney), australia-southeast2 (Melbourne) |
| Integrated CI/CD | Azure DevOps, GitHub Actions | AWS CodePipeline, third-party integrations | Cloud Build, Cloud Deploy |
Managed Kubernetes services handle the control plane — the API server, scheduler, controller manager, and etcd database — so your team focuses on deploying and operating workloads rather than maintaining the cluster infrastructure itself. This dramatically reduces the operational burden, but it does not eliminate it: you are still responsible for node operating system patches (unless using a serverless option like Fargate or Autopilot), Kubernetes version upgrades, monitoring, logging, network policies, and RBAC configuration. For Australian organisations, all three major providers offer regions in Sydney and (for Azure and GCP) Melbourne, supporting data-sovereignty requirements under Australian privacy legislation.
When Kubernetes Is Overkill
Kubernetes is a powerful platform, but it introduces significant complexity. For a simple web application with predictable traffic, a single virtual machine or a Platform-as-a-Service offering like Azure App Service, AWS Elastic Beanstalk, or Google Cloud Run may be far more appropriate. If your team consists of two or three developers and the application has a monolithic architecture with no plans to decompose into microservices, the operational overhead of maintaining a Kubernetes cluster — networking, ingress, certificate management, persistent storage, monitoring, upgrades — will likely exceed the benefits. Consider Kubernetes when you need to run multiple independent services that scale independently, when you have a dedicated platform or DevOps team to manage the cluster, or when your deployment frequency and scale justify the investment.
Resource Requirements and Capacity Planning
Every container in Kubernetes can specify resource requests (the minimum CPU and memory the scheduler guarantees) and resource limits (the maximum the container is allowed to consume). Requests drive scheduling: the scheduler places Pods on nodes that have enough unrequested capacity. Limits enforce boundaries: a container that exceeds its memory limit is killed (OOMKilled), and one that exceeds its CPU limit is throttled. Setting requests too low causes over-scheduling and contention; setting them too high wastes capacity. Right-sizing requires observation — tools like Kubernetes Vertical Pod Autoscaler (VPA) or Goldilocks analyse actual usage and recommend appropriate values.
At the cluster level, the Horizontal Pod Autoscaler (HPA) adjusts the number of Pod replicas based on CPU, memory, or custom metrics, while the Cluster Autoscaler adds or removes nodes to accommodate the current scheduling demand. Together, they create a system that scales both application instances and underlying infrastructure automatically. For cost-conscious Australian MSPs, combining the Cluster Autoscaler with spot or preemptible instances for non-critical workloads can reduce compute costs by 60-80% compared to on-demand pricing, though you must design workloads to tolerate interruption gracefully.
Essential Ecosystem Tools
A production Kubernetes environment relies on a supporting ecosystem of tools. Helm is the de facto package manager, providing charts that template Kubernetes manifests with configurable values. Prometheus and Grafana provide metrics collection and dashboarding. Cert-Manager automates TLS certificate provisioning from Let's Encrypt or internal CAs. An Ingress Controller (NGINX Ingress, Traefik, or cloud-native options like AWS ALB Ingress Controller) manages HTTP/HTTPS routing into the cluster. ArgoCD or Flux implement GitOps-based continuous deployment, synchronising the cluster state with a Git repository. Evaluating and selecting the right set of ecosystem tools is a significant part of any Kubernetes project and should not be underestimated in planning.
Pros
- Self-healing — automatically replaces failed Pods and reschedules workloads
- Declarative model — desired state is version-controlled and auditable
- Horizontal scaling — scale Pods and nodes independently based on demand
- Portability — run the same manifests on any compliant Kubernetes cluster
- Ecosystem — massive community, tooling, and third-party integrations
Cons
- Steep learning curve — the API surface is large and concepts are unfamiliar
- Operational overhead — even managed offerings require ongoing maintenance
- Networking complexity — service mesh, ingress, and network policies add layers
- Cost — a minimum viable cluster requires at least three nodes, adding baseline expense
- Overkill for simple workloads — adds unnecessary complexity if scale is low
Kubernetes is not a Platform as a Service. It is a platform for building platforms. The value comes when you invest in building the developer experience layer on top of it.