Kubernetes Manifest Generator

Turn an app name, image and port into a validated Deployment + Service manifest you can pipe straight into kubectl apply — resources, env vars, labels and probes included. Nothing is uploaded.

Try:
manifest.yaml

About this tool

Kubernetes Manifest Generator turns the handful of details you actually know about an app — its name, image, port — into a complete, validated manifest: an apps/v1 Deployment and a matching v1 Service, emitted as two YAML documents separated by --- and ready for kubectl apply -f -. Everything runs in your browser through WebAssembly, so image names, env vars, and internal hostnames never leave your machine.

The two resources are wired together for you: the pod template carries an app: <name> label, the Deployment selector and the Service selector both match it, and the Service targetPort points at the container port. That is the part people usually get subtly wrong by hand — a selector that matches nothing produces a Service with no endpoints and no error message.

Options

Example

Name web, image nginx:1.27, container port 8080, service port 80:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  labels:
    app: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: web
          image: nginx:1.27
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: web
  labels:
    app: web
spec:
  type: ClusterIP
  selector:
    app: web
  ports:
    - name: http
      port: 80
      targetPort: 8080
      protocol: TCP

FAQ

Can I apply the output directly with kubectl?

Yes. Copy the manifest into a file and run kubectl apply -f manifest.yaml, or paste it into kubectl apply -f -. Both documents are applied in order, so the Deployment and Service are created together.

Why is my Service not reaching any pods?

Almost always a selector mismatch — but not here: this tool derives the pod labels, the Deployment matchLabels, and the Service selector from the same App name, so they cannot drift. If endpoints are still empty, check that the container is actually listening on the container port you entered, since the Service targetPort is wired to it.

What resource quantities are accepted?

Kubernetes' own syntax. CPU takes plain numbers or millicores — 2, 0.5, 100m. Memory takes plain bytes or a binary/decimal suffix — 134217728, 128Mi, 512M, 1Gi. Anything else is rejected with a message rather than silently written into the manifest.

When should I set a nodePort?

Only when Service type is NodePort and you need a stable, known port — for example a firewall rule or an external load balancer already points at it. The value must be in the cluster's default 30000–32767 range. Otherwise leave it blank and let Kubernetes allocate one.

Does one probe path really configure both probes?

Yes. The path you enter is used for a livenessProbe (initialDelaySeconds: 15) and a readinessProbe (initialDelaySeconds: 5), both httpGet on the container port with periodSeconds: 10. Leave the field blank and neither probe is emitted. Tune the timings in the generated YAML if your app starts slowly.

Why are some values wrapped in quotes?

Because YAML would otherwise change their type. An app named 123, a label value of true, or an env var PORT=8080 are all strings to Kubernetes, so they are emitted double-quoted. Env values are always quoted for that reason. Unambiguous values such as nginx:1.27 and /healthz stay bare.

Developer & Automation Access

Run it from the terminal

Same engine as this page, headless — via the gizza CLI:

gizza tool k8s-manifest-scaffold "web" 'image=nginx:1.27'

New to the CLI? Get gizza →

Open it by URL

Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:

https://gizza.ai/tools/k8s-manifest-scaffold/?name=web&image=nginx%3A1.27&namespace=default&replicas=1&container_port=8080&service_port=80&service_type=ClusterIP&node_port=30080&image_pull_policy=IfNotPresent&cpu_request=100m&cpu_limit=500m&memory_request=128Mi&memory_limit=256Mi&env=LOG_LEVEL%3Dinfo%0APORT%3D8000&labels=tier%3Dbackend%2C%20team%3Dpayments&probe_path=%2Fhealthz

Machine-readable descriptor: tool.json — title + parameters JSON Schema for agents.