Skip to main content

Overview

The Visual Builder is a form-driven manifest generator built into the Niro dashboard. It lets you describe a workload in plain terms and generates the corresponding Kubernetes YAML (Deployment, Service, Ingress, HPA, PVC, etc.). You don’t need to know Kubernetes YAML syntax to use the builder. The generated manifests are valid, production-ready Kubernetes resources that follow Niro’s policy rules.

What the builder generates

Given your inputs, the builder produces a multi-document YAML file containing:
ResourceWhen generated
NamespaceAlways (if the namespace doesn’t exist)
ConfigMapIf you specify config values
SecretIf you specify secret values or use a private registry
Deployment (or StatefulSet)Always — the main workload
ServiceIf you enable networking
IngressIf you enable HTTP routing
HorizontalPodAutoscalerIf you enable auto-scaling
PersistentVolumeClaimIf you enable storage
The builder also injects imagePullSecrets automatically when you select a registry credential.

Builder sections

Workload

The core of every deployment. Image Enter the full image reference: registry/repo:tag. For private images, select a registry credential and the pull secret is injected automatically. The builder flags the latest-image-tag policy rule if you use a mutable tag. Use an explicit version tag like v1.2.3 or a digest sha256:... for reproducibility. Container configuration
  • Name — the Deployment and Service name (must be a valid DNS label)
  • Command — overrides ENTRYPOINT (equivalent to command: in pod spec)
  • Args — overrides CMD (equivalent to args: in pod spec)
  • Ports — container port(s) to expose. Used to generate the Service and Ingress
Environment variables Add key-value pairs that are injected as env entries in the container spec. Values are stored as literals. Use Secrets if you need to reference Kubernetes Secrets or ConfigMaps. Resources
FieldDescriptionExample
CPU requestsMinimum guaranteed CPU100m (0.1 core)
CPU limitsMaximum CPU the container can use500m
Memory requestsMinimum guaranteed memory128Mi
Memory limitsMaximum memory512Mi
Missing requests and limits triggers the missing-requests and missing-limits policy rules. Set at least requests to ensure the Kubernetes scheduler can place your pod correctly.
Health probes Configure liveness and/or readiness probes:
Probe typeConfiguration
HTTPPath + port + initial delay + period
TCPPort + initial delay + period
ExecCommand array + initial delay + period
Missing probes trigger the missing-probes policy rule. A readiness probe prevents traffic from reaching a pod that isn’t ready; a liveness probe restarts a pod that is stuck.

Networking

Enable a Service to expose the workload inside the cluster (or externally):
  • ClusterIP — accessible only within the cluster (default)
  • NodePort — accessible on each node’s IP at a fixed port
  • LoadBalancer — requests an external load balancer from the cloud provider
Enable an Ingress to route HTTP(S) traffic by hostname and path. Requires a running Ingress controller (Traefik is bundled with k3s).

Scaling

Set a fixed replica count, or enable a HorizontalPodAutoscaler:
FieldDescription
ReplicasStatic replica count (default: 1)
Min replicasHPA lower bound
Max replicasHPA upper bound
Target CPU utilizationPercentage of requested CPU that triggers scale-up
Target memory utilizationPercentage of requested memory that triggers scale-up
A single replica is flagged by the single-replica policy rule, which escalates to high severity on production clusters. Add replicas and a Pod Disruption Budget for production workloads.

Storage

Add a PersistentVolumeClaim for stateful workloads:
FieldDescription
Sizee.g. 5Gi, 20Gi
Access modeReadWriteOnce (single node) or ReadWriteMany (requires shared storage provider)
Mount pathWhere inside the container the volume is mounted
Storage classLeave empty to use the cluster’s default StorageClass

Secrets

Reference existing Kubernetes resources as environment variables: envFrom — inject all keys from a ConfigMap or Secret:
# Generated pod spec fragment
envFrom:
  - secretRef:
      name: my-app-secrets
  - configMapRef:
      name: my-app-config
secretKeyRef / configMapKeyRef — inject a specific key with a custom env var name:
# Generated pod spec fragment
env:
  - name: DATABASE_URL
    valueFrom:
      secretKeyRef:
        name: db-credentials
        key: url
The referenced Secret or ConfigMap must exist in the same namespace as the app. You can create and manage them from the cluster Config panel before deploying the app.

Policy findings

As you fill in the builder form, Niro evaluates your configuration against the policy rules in real time and shows inline findings:
  • Missing resource limits or requests → missing-requests / missing-limits
  • Missing health probes → missing-probes
  • Mutable image tag → latest-image-tag
  • Single replica (on a production cluster) → single-replica
  • Known-private registry without credentials → public-image-no-credential
  • Privileged container or allow privilege escalation → privileged-container
All findings are advisory. You can deploy despite findings, but they’ll continue to surface at runtime and in PR reviews.

Editing an existing deployment

Open the deployment in the Apps list and click Edit. The builder reopens with the form populated from the last saved values. After editing:
  • Re-apply to push the changes directly to the cluster
  • Commit to repo to open a new PR with the updated manifests
Niro stores the builder form data (not just the generated YAML), so reopening and editing always shows the same fields you filled in — not a reverse-engineered representation of the YAML.

Importing existing YAML

If you have existing Kubernetes manifests, use Import from the Apps page to scan a repo folder and convert them to Niro-managed deployments. Imported deployments start as read-only; you can convert them to builder-managed deployments to enable visual editing.
Last modified on June 12, 2026