Skip to main content
CloudCareerLabs Logo CloudCareerLabs
Kubernetes Engine

Kubernetes Manifest Builder.

Visually configure your deployment pods, statefulsets, and services, and get standard YAML definitions immediately.

Configure Resources

YAML manifest
k8s-manifest.yaml Syntactically Checked
 

Deep Dive: Desired State & Kubernetes Manifest Design Patterns

Written by Sachin Mehta, Principal Cloud Architect

What is a Kubernetes Manifest?

A Kubernetes manifest is a declarative configuration file, typically written in YAML, that defines the specifications for resources you want to create and manage in a cluster. Unlike imperative systems where you tell the server how to perform tasks, Kubernetes operates on a Desired State model. You submit the manifest detailing the final state, and the control plane (primarily the API Server and controller loops) works continuously to bring the cluster's actual state into alignment.

The 4 Key Fields of Every Kubernetes Manifest

No matter what resource type you are deploying—be it a simple Pod, a complex Deployment, or an Ingress rule—its YAML specification must include these four root parameters:

  • apiVersion: Specifies which version of the Kubernetes API schema should be used to parse this resource. For example, core pods use v1, while deployments use apps/v1.
  • kind: Declares the type of resource object you want to create (e.g., Pod, Service, Deployment, ConfigMap).
  • metadata: Holds details that uniquely identify the object, including its name, optional target namespace, and organizational labels.
  • spec: The core definition block that specifies the exact configuration parameters, container images, volume mounts, port mappings, and replica limits for the resource.

Deployments vs. StatefulSets: When to Use Which?

Selecting the appropriate workload controller is vital for application stability and performance:

Kubernetes Deployments

Best suited for stateless applications like web servers (Nginx) or API gateways. Pods are completely interchangeable; they do not require persistent individual identities. If a pod crashes or is evicted, it is replaced by a new pod with a random hash name and a new IP address, mounting shared or ephemeral filesystems.

Kubernetes StatefulSets

Required for stateful applications like databases (PostgreSQL, MongoDB) or message queues. StatefulSets guarantee that pods are created, updated, and deleted in strict order, keeping stable network identifiers (e.g., db-0, db-1) and mapping dedicated persistent volumes that remain bound to the specific pod slots.

How to Use the Kubernetes Manifest Generator

Creating deployment-ready Kubernetes configuration files takes just a few clicks:

  1. Select Resource Kind: Choose the controller type (Deployment or StatefulSet) depending on whether your workload is stateless or stateful.
  2. Configure Core Metadata: Enter the resource name, target replica count, container image coordinates (e.g. node:18-alpine), and target port.
  3. Bind Environment Variables (Optional): Enter a key and value pair to inject variable configurations directly into the container spec.
  4. Download or Copy manifest: As you type, the editor pane on the right updates instantly. Click Copy manifest to save it to your clipboard, or Download YAML to save a file named k8s-manifest.yaml locally.

Worked Example: Node.js Web App Deployment

Let's look at a common configuration generated for a Node.js API server running 3 replicas, listening on port 3000, with a database URL injected as an environment variable:

Generated Manifest Structure

apiVersion: apps/v1
kind: Deployment
metadata:
  name: node-api-deployment
  labels:
    app: node-api
spec:
  replicas: 3
  selector:
    matchLabels:
      app: node-api
  template:
    metadata:
      labels:
        app: node-api
    spec:
      containers:
      - name: node-api
        image: node:18-alpine
        ports:
        - containerPort: 3000
        env:
        - name: DATABASE_URL
          value: "postgresql://db.production.local:5432"
              

Common Manifest Validation Errors & How to Fix Them

Validation Error Root Cause Correction Method
"selector does not match template labels" The label selector in spec.selector.matchLabels doesn't match the labels in the pod template (spec.template.metadata.labels). Verify and update both label key-value pairs so they are identical.
"spec.template.spec.containers: Required value" The containers array is empty or the indentation is off, detaching the container list from the spec. Ensure containers: is nested under pod spec and starts with a hyphen (- name: ...).
"service type NodePort out of bounds" The nodePort assigned to the service falls outside the allowed range of 30000 to 32767. Let Kubernetes allocate the nodePort automatically, or select a value between 30000 and 32767.

Kubernetes Manifest FAQs

Q: What is the difference between apiVersion 'v1' and 'apps/v1'?

Core objects that were part of the initial launch of Kubernetes (like Pods, Services, ConfigMaps, and Secrets) belong to the core API group and use v1. Higher-level controllers (like Deployments, DaemonSets, and StatefulSets) belong to the apps group and use apps/v1.

Q: Can a single manifest file contain multiple Kubernetes resources?

Yes, you can define multiple resources in a single file by separating them with three hyphens (---) on a blank line. This is commonly used to package a Deployment and its corresponding ClusterIP Service together.

Production Manifest Best Practices

When moving configurations from local configuration generators to staging and production clusters, follow these three rules:

  1. Declare Explicit Resource Limits: Always define CPU and memory requests (guaranteed allocation) and limits (maximum bounds). This prevents a single misbehaving container from leaking memory and causing worker node eviction issues.
  2. Implement Health Probes: Use livenessProbes to check if the app has entered a deadlocked state and needs a restart, and readinessProbes to control when a newly started pod is ready to accept traffic.
  3. Match Labels Exactly: Ensure that the selectors in your Service or Deployment templates match the pod metadata labels exactly. A single mismatch will leave a service with empty endpoints, causing connection timeouts.