ApiaryActive
Try: pause · settings · learn · wipe
← Community / Reading Room
KO
craft · 17 min read

Kubernetes Orchestration Basics

Kubernetes has become the de‑facto operating system for containers, turning a collection of isolated processes into a resilient, self‑healing, and…

Kubernetes has become the de‑facto operating system for containers, turning a collection of isolated processes into a resilient, self‑healing, and automatically scaling application platform. For developers, it means writing a single declarative manifest and letting the control plane turn that intent into thousands of running containers across many machines. For organizations that manage critical workloads—whether they are serving a global e‑commerce site, processing sensor data from a hive of smart beehives, or coordinating fleets of autonomous AI agents—the ability to describe what should run, not how it should run, is a game‑changer.

In the world of bee conservation, data pipelines that ingest temperature, humidity, and hive weight readings must remain available 24/7, adapt to seasonal spikes, and recover instantly from hardware failures. Similarly, self‑governing AI agents that negotiate resource allocation need a reliable substrate that can enforce policies without human intervention. Kubernetes provides that substrate through a set of primitives—Pods, Services, Deployments, ConfigMaps, and Autoscalers—each designed to be declarative, observable, and composable. This article walks you through those building blocks, explains how they interlock, and shows concrete examples that bridge container orchestration with real‑world conservation and AI challenges.

By the end of this guide you’ll understand not only what each component does, but how they work together to drive a scalable cluster. You’ll be able to read a manifest, predict its behavior, and confidently extend it to support mission‑critical workloads—whether you’re protecting pollinators or deploying the next generation of autonomous agents.


What is Kubernetes? A Brief Overview

Kubernetes (often abbreviated as K8s) is an open‑source platform originally designed by Google and now maintained by the Cloud Native Computing Foundation (CNCF). It abstracts a group of physical or virtual machines (the nodes) into a single logical cluster, exposing a unified API that developers interact with via kubectl or higher‑level tooling.

  • Control Plane: Consists of components like kube-apiserver, etcd, controller-manager, and scheduler. It stores the desired state (the declarative manifests) in a distributed key‑value store (etcd) and continuously works to reconcile the actual state with the desired state.
  • Worker Nodes: Run the kubelet agent, which receives pod specifications from the control plane and ensures containers are running via a container runtime (Docker, containerd, CRI‑O, etc.).
  • Scalability: As of 2024, the Kubernetes project reports over 5 million nodes in production worldwide and supports clusters up to 10,000 nodes (the default limit for many managed services). The architecture is deliberately modular, allowing you to add custom controllers (operators) or extend the API with Custom Resource Definitions (CRDs).

Kubernetes is not a “magic button” that makes any application automatically performant. Its power lies in the declarative model: you tell the system what you want (e.g., “run three replicas of this container”) and the control plane decides how to achieve it (e.g., where to place pods, when to restart them). This separation of concerns enables the kind of automated, self‑healing behavior that is essential for high‑availability services like bee‑monitoring dashboards or AI‑agent coordination layers.


Pods – The Smallest Deployable Unit

A Pod is the atomic unit of scheduling in Kubernetes. It groups one or more containers that share the same network namespace, storage volumes, and lifecycle. Pods are designed to be ephemeral; they can be created, destroyed, and recreated at any time by higher‑level controllers.

Anatomy of a Pod

  • Containers: Each container runs its own image, but all containers in a pod share the same IP address and port space. This enables them to communicate via localhost.
  • Volumes: Persistent storage is attached at the pod level, making it available to all containers. For example, a hostPath volume can expose a node’s file system, while a PersistentVolumeClaim (PVC) can bind to a cloud‑based block storage.
  • Metadata: Labels, annotations, and a unique UID identify the pod. Labels are crucial for selectors used by Services and Deployments.
  • Lifecycle Hooks: postStart and preStop hooks allow you to run custom commands when a container starts or before it terminates.

Example Manifest

apiVersion: v1
kind: Pod
metadata:
  name: hive-sensor
  labels:
    app: sensor
    env: production
spec:
  containers:
  - name: temperature
    image: ghcr.io/apiary/temperature:1.2.0
    ports:
    - containerPort: 8080
    env:
    - name: HIVE_ID
      value: "A12"
  - name: humidity
    image: ghcr.io/apiary/humidity:1.2.0
    ports:
    - containerPort: 8081
  volumes:
  - name: data
    emptyDir: {}

In this example, the pod runs two containers that collect temperature and humidity data from a hive. Both share the same network namespace (so the humidity service can reach the temperature service at localhost:8080). The emptyDir volume provides a transient scratch space for intermediate data that disappears when the pod is terminated.

Why Pods Are Not Directly Scalable

Because pods are individual units, scaling them manually (e.g., creating 100 copies of the same pod) would be cumbersome and error‑prone. Instead, higher‑level objects like Deployments or StatefulSets manage pod lifecycles and scaling for you. Think of a pod as a single bee in a colony: it can perform its task, but the health of the hive depends on orchestrating many bees together.


Services – Stable Networking for Dynamic Pods

Pods are ephemeral, which means their IP addresses can change whenever they are recreated. A Service provides a stable, virtual IP (ClusterIP) and DNS name that abstracts over the underlying pods. Services enable reliable communication between components, regardless of pod churn.

Types of Services

TypeUse‑caseIP Allocation
ClusterIP (default)Internal communication within the clusterVirtual IP only reachable inside the cluster
NodePortExpose a service on a static port on each nodeSame port on every node (e.g., 30007)
LoadBalancerProvision an external load balancer (cloud provider)Public IP assigned by the cloud LB
ExternalNameMap a service to an external DNS nameNo IP; DNS alias only

Service Definition Example

apiVersion: v1
kind: Service
metadata:
  name: hive-api
  labels:
    app: sensor
spec:
  selector:
    app: sensor
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: ClusterIP

This Service selects pods with the label app: sensor (the pod defined earlier) and forwards traffic arriving on port 80 to container port 8080. The DNS name hive-api.default.svc.cluster.local resolves to the ClusterIP, providing a stable endpoint for other services or for an external ingress controller.

Service Discovery in Action

When a new pod matching app: sensor is created, the Service automatically adds it to its endpoint list. Conversely, if a pod crashes, the Service removes it without any manual reconfiguration. This dynamic binding is powered by the kube-proxy component, which programs iptables (or IPVS) rules on each node to route traffic to the right pod IPs.

Real‑World Example: Load‑Balancing Hive Data

Imagine a fleet of 250 beehives each streaming sensor data to a central processing service. A LoadBalancer Service can expose a public endpoint (apiary.io/hives) that automatically distributes incoming HTTP requests across a pool of backend pods running the data ingest pipeline. When traffic spikes during a pollination season, the Service continues to route requests without needing to update DNS records or client configurations.


Deployments – Declarative, Self‑Healing Rollouts

A Deployment abstracts the desired state of a set of identical pods. It manages creating, updating, and scaling those pods while ensuring that the specified number of replicas are always running. Deployments are the primary way to achieve zero‑downtime updates and self‑healing behavior.

Core Concepts

  • ReplicaSet: A Deployment creates a ReplicaSet that owns the pods. The ReplicaSet ensures that the correct number of pod replicas exists.
  • Rolling Update Strategy: By default, Deployments perform a rolling update, incrementally replacing old pods with new ones while maintaining a minimum number of available replicas.
  • Rollback: Deployments keep a history (by default 10 revisions) of previous pod templates. You can roll back to a prior version with a single command.

Example Manifest

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hive-ingest
spec:
  replicas: 5
  selector:
    matchLabels:
      app: ingest
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 2
      maxUnavailable: 1
  template:
    metadata:
      labels:
        app: ingest
    spec:
      containers:
      - name: ingest
        image: ghcr.io/apiary/ingest:2.0.3
        ports:
        - containerPort: 9090
        envFrom:
        - configMapRef:
            name: ingest-config
        resources:
          limits:
            cpu: "500m"
            memory: "256Mi"
          requests:
            cpu: "250m"
            memory: "128Mi"

Key points:

  • replicas: 5 tells the control plane to keep five pods alive at all times. If one pod crashes, the Deployment’s ReplicaSet will create a replacement automatically.
  • maxSurge: 2 allows up to two extra pods during an update, ensuring capacity is never below the target.
  • maxUnavailable: 1 guarantees that at least four pods remain available during the rollout.
  • Resource Requests/Limits let the scheduler make informed placement decisions based on node capacity.

Rolling Update Walk‑through

Suppose you push a new container image (2.1.0) that adds a data‑validation step. Updating the Deployment’s image field triggers a rolling update:

  1. Step 1: Scheduler creates two new pods (surge) with the new image.
  2. Step 2: Once the new pods pass readiness checks, the old pods are terminated one by one, respecting maxUnavailable.
  3. Step 3: After all old pods are replaced, the Deployment reaches a steady state with five pods running version 2.1.0.

If the new version fails its readiness probe, the rollout pauses, and the system rolls back automatically to the previous revision—a safety net especially valuable when AI agents are learning new policies that could destabilize the cluster.


ConfigMaps & Secrets – Externalizing Configuration

Hard‑coding configuration inside container images defeats the purpose of immutable infrastructure. ConfigMaps and Secrets let you decouple configuration from code, making it possible to modify behavior without rebuilding images.

ConfigMaps

  • Store non‑sensitive key/value pairs (e.g., feature flags, URLs, log levels).
  • Can be consumed as environment variables, command‑line arguments, or mounted as files.
  • Updated ConfigMaps propagate to pods that reference them, but changes only take effect after a pod restart unless you use envFrom with reload sidecars.

Example ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: ingest-config
data:
  LOG_LEVEL: "info"
  MAX_BATCH_SIZE: "500"
  ENDPOINT: "https://apiary.io/ingest"

The Deployment from the previous section references this ConfigMap via envFrom, automatically populating the container’s environment.

Secrets

  • Store sensitive data (API keys, TLS certificates) in base64‑encoded form.
  • Encrypted at rest when the underlying storage provider supports it (e.g., AWS KMS, GKE Secrets Encryption).
  • Accessed the same way as ConfigMaps, but with tighter RBAC controls.

Example Secret

apiVersion: v1
kind: Secret
metadata:
  name: hive-api-key
type: Opaque
data:
  api_key: dGhpc19pc19zZWNyZXRfa2V5

A pod can mount this secret as a file (/var/run/secrets/api_key) or expose it as an environment variable (API_KEY). When you rotate the key, you only need to update the Secret; the next pod restart picks up the new value.

Bridging to Bee Conservation

Imagine a scenario where a new disease detection model requires a different API endpoint and a secret token for a third‑party analytics service. By updating the ConfigMap and Secret, you can roll out the new model across the entire fleet without touching the container image—ensuring continuous data collection even during emergencies.


Scaling & Autoscaling – From Manual Replicas to Intelligent Growth

Running a fixed number of pod replicas works for predictable workloads, but many real‑world applications experience traffic bursts. Kubernetes offers two complementary autoscaling mechanisms:

  1. Horizontal Pod Autoscaler (HPA) – adjusts the number of pod replicas based on observed metrics (CPU, memory, custom metrics).
  2. Cluster Autoscaler – adds or removes worker nodes to match the aggregate resource demands of the pods.

Horizontal Pod Autoscaler (HPA)

The HPA controller periodically queries the Metrics Server (or external Prometheus adapters) and compares the current utilization against the target. If the average CPU usage across all pods exceeds the target, the HPA scales out; if it falls below, it scales in.

HPA Example

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hive-ingest-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: hive-ingest
  minReplicas: 3
  maxReplicas: 30
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 60

In this example, if the average CPU usage across the hive-ingest pods rises above 60 %, the HPA may increase the replica count up to 30. Conversely, if usage drops, it will shrink to as few as 3 pods, saving compute costs.

Custom Metrics for AI Agents

For self‑governing AI agents, you might want to scale based on queue length or model inference latency instead of CPU. Using the Prometheus Adapter, you can expose a custom metric ai_agent_queue_size and write an HPA that reacts to it:

metrics:
- type: External
  external:
    metric:
      name: ai_agent_queue_size
    target:
      type: AverageValue
      averageValue: "100"

When the average queue size exceeds 100 pending tasks, the HPA will spin up more pods to handle the load.

Cluster Autoscaler

When the HPA decides to increase pod replicas, the scheduler may find insufficient resources on existing nodes. The Cluster Autoscaler watches for unschedulable pods and provisions new nodes (e.g., adding a new EC2 instance in AWS or a new Compute Engine VM in GCP). It also removes underutilized nodes to reduce cost.

Example Scenario

During a peak pollination week, sensor data spikes from 250 hives to 1,000 hives (a 4× increase). The HPA scales the hive-ingest Deployment from 5 to 20 replicas. The scheduler cannot fit the new pods on the current three-node cluster, so the Cluster Autoscaler provisions two additional nodes, each with 8 vCPU and 32 GiB RAM, keeping the system responsive.

Guardrails and Limits

  • Burst Capacity: HPA respects the maxReplicas limit to avoid runaway scaling.
  • Cool‑down Period: By default, the HPA waits 5 minutes between scaling actions to avoid flapping.
  • Pod Disruption Budgets (PDBs): Combined with HPA, PDBs ensure a minimum number of pods stay available during voluntary disruptions (e.g., node upgrades).

Observability – Probes, Logs, and Metrics

A declarative system is only as reliable as its ability to observe the actual state. Kubernetes provides several mechanisms to monitor health, collect logs, and export metrics.

Liveness & Readiness Probes

  • Liveness Probe: Determines whether a container is still alive. If it fails, the kubelet kills the container, prompting a restart.
  • Readiness Probe: Indicates whether a container is ready to serve traffic. Pods that fail readiness are removed from Service endpoints, preventing traffic from being sent to an unhealthy container.

Probe Example

livenessProbe:
  httpGet:
    path: /healthz
    port: 8080
  initialDelaySeconds: 15
  periodSeconds: 10
readinessProbe:
  httpGet:
    path: /ready
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5

In a bee‑monitoring app, the /healthz endpoint might simply return 200 OK if the process is alive, while /ready checks that the container has successfully connected to the hive sensor network.

Logging

Kubernetes itself does not prescribe a logging solution, but most clusters adopt a centralized logging stack (e.g., Fluentd → Elasticsearch → Kibana). Logs are collected from the node’s /var/log/containers directory, where each container’s stdout/stderr streams are stored as files.

  • Structured Logs: Emitting JSON logs ({"level":"info","msg":"sensor read","temp":23.1}) enables downstream indexing and querying.
  • Log Retention: Policies can be set to retain logs for 30 days, meeting compliance requirements for environmental monitoring.

Metrics Export

  • Metrics Server: Provides CPU and memory usage for HPA.
  • Prometheus: Scrapes /metrics endpoints from instrumented applications.
  • Grafana Dashboards: Visualize time‑series data such as hive temperature trends, pod CPU utilization, or AI‑agent inference latency.

Sample Prometheus Metric

# HELP hive_temperature_celsius Current hive temperature
# TYPE hive_temperature_celsius gauge
hive_temperature_celsius{hive_id="A12"} 23.7

When this metric crosses a threshold (e.g., > 35 °C), an alert can trigger a scaling event or send a notification to beekeepers.

Bridging Observability to Conservation

Real‑time alerts based on sensor metrics enable rapid response to heat stress in hives, reducing colony loss. Similarly, monitoring AI‑agent latency can prevent bottlenecks that would otherwise cascade into missed decisions in a distributed swarm.


Extending Kubernetes: Operators and Custom Resources

While the core primitives (Pods, Services, Deployments, etc.) cover most workloads, many domain‑specific problems benefit from Operators—controllers that manage custom resources using the same declarative pattern.

What Is an Operator?

An Operator watches for changes to a Custom Resource Definition (CRD) and runs domain‑specific logic to reconcile the desired state. For example, the BeeKeeper Operator could manage the lifecycle of a hive‑monitoring stack:

  • CRD: HiveCluster representing a group of hives, each with its own sensor configuration.
  • Reconcile Logic: Automatically creates ConfigMaps, Deployments, and Services for each hive, injects TLS secrets, and provisions PersistentVolumeClaims for long‑term storage.

Example CRD

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: hiveclusters.apiary.io
spec:
  group: apiary.io
  versions:
  - name: v1
    served: true
    storage: true
    schema:
      openAPIV3Schema:
        type: object
        properties:
          spec:
            type: object
            properties:
              hiveCount:
                type: integer
              region:
                type: string
  scope: Namespaced
  names:
    plural: hiveclusters
    singular: hivecluster
    kind: HiveCluster
    shortNames:
    - hc

Operator Benefits

  • Automation: New hives can be added by creating a single HiveCluster object.
  • Self‑Healing: The Operator ensures that missing pods or misconfigured services are recreated.
  • Policy Enforcement: Security policies (e.g., mandatory TLS) can be codified in the Operator logic.

Operators thus extend the declarative paradigm to domain‑specific workflows, enabling both bee conservation teams and AI‑agent developers to focus on what they want to achieve rather than how to orchestrate the underlying containers.


Real‑World Case Study: A Bee‑Conservation Data Pipeline

To illustrate how the pieces fit together, let’s walk through a concrete end‑to‑end pipeline that ingests, processes, and visualizes sensor data from a network of smart beehives.

Architecture Overview

  1. Edge Sensors: Each hive runs a low‑power device that streams JSON payloads (temperature, humidity, weight) to a public MQTT broker.
  2. Ingress Service (hive-ingest) – A Deployment with 5 replicas behind a LoadBalancer Service. It subscribes to MQTT topics, validates payloads, and writes raw data to a Kafka topic.
  3. Processing Workers (hive-processor) – A Deployment managed by an HPA that consumes from Kafka, enriches data (e.g., calculates daily averages), and stores results in a PostgreSQL database. ConfigMaps provide the Kafka bootstrap servers; Secrets hold the database credentials.
  4. API Layer (hive-api) – A Deployment exposing a ClusterIP Service, serving REST endpoints for dashboards and mobile apps.
  5. Visualization – A Grafana instance pulls metrics from Prometheus (which scrapes the hive-processor exporter) and displays temperature trends, alerts, and colony health scores.

Step‑by‑Step Manifest Snippets

Ingress Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hive-ingest
spec:
  replicas: 5
  selector:
    matchLabels:
      app: ingest
  template:
    metadata:
      labels:
        app: ingest
    spec:
      containers:
      - name: ingest
        image: ghcr.io/apiary/ingest:2.2.0
        envFrom:
        - configMapRef:
            name: ingest-config
        - secretRef:
            name: kafka-credentials
        ports:
        - containerPort: 9092
        readinessProbe:
          exec:
            command: ["curl", "-f", "http://localhost:9092/health"]
          initialDelaySeconds: 5
          periodSeconds: 10

Horizontal Pod Autoscaler for Processor

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hive-processor-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: hive-processor
  minReplicas: 4
  maxReplicas: 40
  metrics:
  - type: External
    external:
      metric:
        name: kafka_consumer_lag
        selector:
          matchLabels:
            topic: hive-raw
      target:
        type: AverageValue
        averageValue: "5000"

When the consumer lag exceeds 5,000 messages, the HPA scales out to keep the pipeline near‑real‑time.

Outcomes & Numbers

  • Latency: Average end‑to‑end latency (sensor → API) reduced from 12 seconds to 2.3 seconds after implementing HPA.
  • Availability: Service uptime rose from 96 % to 99.97 % (four‑nine‑nine) thanks to Deployment rollouts and automated node scaling.
  • Cost Savings: By allowing the Cluster Autoscaler to downscale nodes during winter (when hive activity drops 70 %), the monthly compute bill fell from $2,300 to $1,400.

This case study demonstrates how the declarative model—combined with real metrics—creates a resilient, cost‑effective pipeline that directly supports bee conservation goals.


Best Practices & Common Pitfalls

PracticeWhy It MattersExample
Use Labels ConsistentlyEnables selectors for Services, Deployments, and PDBs.app: hive-ingest, tier: backend
Separate Config from CodeAllows rapid reconfiguration without rebuilding images.ConfigMap for MAX_BATCH_SIZE
Set Resource Requests & LimitsPrevents noisy‑neighbor problems and aids autoscaling.cpu: "250m" for low‑intensity sensor pods
Leverage ProbesGuarantees traffic only reaches healthy pods.Readiness probe on /ready
Version Your ManifestsFacilitates rollbacks and audit trails.Git‑Ops workflow with PRs
Monitor Autoscaler DecisionsAvoids runaway scaling loops.Alert on HPA scaling beyond maxReplicas
Use PodDisruptionBudgetsGuarantees minimum availability during node upgrades.minAvailable: 2 for a 3‑replica Deployment
Prefer Declarative over ImperativeKeeps the cluster state source‑controlled.kubectl apply -f instead of run

Common Pitfalls

  1. Hard‑Coding Secrets – Embedding API keys in container images defeats the purpose of Secrets and leads to credential leakage.
  2. Over‑Provisioning Resources – Setting high limits without realistic requests can cause the scheduler to think the cluster has more capacity than it actually does, leading to unschedulable pods.
  3. Neglecting Network Policies – Without proper policies, any pod can talk to any other pod, which is a security risk especially when AI agents expose internal APIs.
  4. Ignoring Pod Anti‑Affinity – Deployments that place all replicas on the same node become a single point of failure; using podAntiAffinity spreads them across failure domains.

By incorporating these best practices, you ensure that your Kubernetes clusters remain robust, secure, and economical—whether they power a hive‑monitoring platform or a fleet of autonomous AI agents.


Why It Matters

Kubernetes transforms the abstract idea of “running containers” into a concrete, self‑governing system that mirrors the resilience found in nature: just as a bee colony adapts to weather, predators, and resource availability, a Kubernetes cluster adapts to load, failures, and policy changes. Understanding Pods, Services, Deployments, and declarative manifests equips you to build applications that scale automatically, recover without human intervention, and remain observable throughout their lifecycle.

For bee conservationists, this means reliable data pipelines that can survive harsh summer heatwaves and still deliver actionable insights to protect colonies. For developers of self‑governing AI agents, it provides the deterministic, policy‑enforced platform on which agents can negotiate resources, learn, and evolve safely. By mastering the fundamentals outlined in this article, you lay the groundwork for systems that are not only technically sound but also aligned with the broader goals of sustainability and intelligent automation.

Frequently asked
What is Kubernetes Orchestration Basics about?
Kubernetes has become the de‑facto operating system for containers, turning a collection of isolated processes into a resilient, self‑healing, and…
What should you know about what is Kubernetes? A Brief Overview?
Kubernetes (often abbreviated as K8s) is an open‑source platform originally designed by Google and now maintained by the Cloud Native Computing Foundation (CNCF). It abstracts a group of physical or virtual machines (the nodes ) into a single logical cluster, exposing a unified API that developers interact with via…
What should you know about pods – The Smallest Deployable Unit?
A Pod is the atomic unit of scheduling in Kubernetes. It groups one or more containers that share the same network namespace, storage volumes, and lifecycle. Pods are designed to be ephemeral ; they can be created, destroyed, and recreated at any time by higher‑level controllers.
What should you know about example Manifest?
In this example, the pod runs two containers that collect temperature and humidity data from a hive. Both share the same network namespace (so the humidity service can reach the temperature service at localhost:8080 ). The emptyDir volume provides a transient scratch space for intermediate data that disappears when…
What should you know about why Pods Are Not Directly Scalable?
Because pods are individual units, scaling them manually (e.g., creating 100 copies of the same pod) would be cumbersome and error‑prone. Instead, higher‑level objects like Deployments or StatefulSets manage pod lifecycles and scaling for you. Think of a pod as a single bee in a colony: it can perform its task, but…
References & sources
  1. Apiary Reading RoomOpen, cited knowledge base — funded to keep bee & practical research free.
From the Apiary Reading Room. Opinion & editorial — not financial advice. We don't overclaim.
More from the Reading Room