{
  "slug": "k8s-manifest-scaffold",
  "name": "gizza-ai/k8s-manifest-scaffold",
  "version": "0.1.0",
  "title": "Kubernetes Deployment + Service YAML Generator — gizza.ai",
  "description": "Fill in a name, image and ports to generate a Kubernetes Deployment plus matching Service, with resources, env, labels and probes.",
  "tags": [
    "kubernetes yaml generator",
    "deployment and service manifest",
    "k8s manifest scaffold",
    "kubectl apply template",
    "kubernetes deployment yaml",
    "nodeport service yaml",
    "liveness readiness probe yaml"
  ],
  "category": "utilities",
  "urls": {
    "page": "https://gizza.ai/tools/k8s-manifest-scaffold/",
    "markdown": "https://gizza.ai/tools/k8s-manifest-scaffold/index.md",
    "descriptor": "https://gizza.ai/tools/k8s-manifest-scaffold/tool.json",
    "deep_link_example": "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"
  },
  "cli": "gizza tool k8s-manifest-scaffold \"web\" 'image=nginx:1.27'",
  "tool": {
    "description": "Generate a ready-to-apply Kubernetes manifest — a Deployment and a matching Service as two YAML documents separated by '---' — from a name and an image. replicas (0-100, default 1), container_port (default 8080) and service_port (default 80) set the pod and Service ports, with the Service targetPort wired to the container port; service_type picks ClusterIP (default), NodePort or LoadBalancer, and node_port (30000-32767) pins a nodePort for NodePort Services. Optional namespace, image_pull_policy (IfNotPresent/Always/Never), cpu_request/cpu_limit/memory_request/memory_limit quantities, env as KEY=value lines, extra key=value labels, and probe_path to add matching liveness and readiness HTTP probes. Names, namespaces, ports, quantities, env names, labels and the probe path are all validated, ambiguous values are quoted so YAML keeps them as strings, and the same inputs always produce the same bytes. Runs locally.",
    "parameters": {
      "additionalProperties": false,
      "properties": {
        "container_port": {
          "default": 8080,
          "description": "Port the container listens on (containerPort), 1-65535. Also the Service targetPort and the probe port. Default 8080.",
          "maximum": 65535,
          "minimum": 1,
          "type": "integer"
        },
        "cpu_limit": {
          "description": "CPU limit as a Kubernetes quantity, e.g. \"500m\". Omitted when blank.",
          "type": "string"
        },
        "cpu_request": {
          "description": "CPU request as a Kubernetes quantity, e.g. \"100m\", \"0.5\" or \"2\". Omitted when blank.",
          "type": "string"
        },
        "env": {
          "description": "Container environment as KEY=value lines, one per line, e.g. \"LOG_LEVEL=info\\nPORT=8000\". Blank and '#' comment lines are skipped, a leading 'export ' is dropped, quoted values are unquoted, and every value is emitted as a quoted string.",
          "type": "string"
        },
        "image": {
          "description": "Container image reference, e.g. \"nginx:1.27\" or \"ghcr.io/acme/api:v1.2.3\".",
          "type": "string"
        },
        "image_pull_policy": {
          "default": "IfNotPresent",
          "description": "When the kubelet pulls the image: 'IfNotPresent' (default), 'Always' or 'Never'.",
          "enum": [
            "IfNotPresent",
            "Always",
            "Never"
          ],
          "type": "string"
        },
        "labels": {
          "description": "Extra key=value labels, newline- or comma-separated, e.g. \"tier=backend,team=payments\". Merged after the standard 'app' label on both resources and the pod template; the key 'app' is reserved.",
          "type": "string"
        },
        "memory_limit": {
          "description": "Memory limit as a Kubernetes quantity, e.g. \"256Mi\". Omitted when blank. The whole resources: block is dropped when all four resource fields are blank.",
          "type": "string"
        },
        "memory_request": {
          "description": "Memory request as a Kubernetes quantity, e.g. \"128Mi\", \"512M\" or \"1Gi\". Omitted when blank.",
          "type": "string"
        },
        "name": {
          "description": "Name for both the Deployment and the Service, also used as the 'app' selector label, e.g. \"web\". Lowercase letters, digits, '-' and '.', max 63 characters (RFC 1123).",
          "type": "string"
        },
        "namespace": {
          "description": "metadata.namespace for both resources, e.g. \"prod\". Omitted from the manifest when blank.",
          "type": "string"
        },
        "node_port": {
          "description": "Fixed nodePort, 30000-32767. Only valid when service_type is 'NodePort'; leave unset to let Kubernetes pick one.",
          "maximum": 32767,
          "minimum": 30000,
          "type": "integer"
        },
        "probe_path": {
          "description": "HTTP path for a liveness and readiness probe on the container port, e.g. \"/healthz\". Blank emits neither probe.",
          "type": "string"
        },
        "replicas": {
          "default": 1,
          "description": "Deployment replica count, 0-100 (0 scales down to no pods). Default 1.",
          "maximum": 100,
          "minimum": 0,
          "type": "integer"
        },
        "service_port": {
          "default": 80,
          "description": "Port the Service exposes, 1-65535. Default 80.",
          "maximum": 65535,
          "minimum": 1,
          "type": "integer"
        },
        "service_type": {
          "default": "ClusterIP",
          "description": "How the Service is exposed: 'ClusterIP' (in-cluster only, default), 'NodePort' (a port on every node) or 'LoadBalancer' (a cloud load balancer).",
          "enum": [
            "ClusterIP",
            "NodePort",
            "LoadBalancer"
          ],
          "type": "string"
        }
      },
      "required": [
        "name",
        "image"
      ],
      "type": "object"
    }
  }
}