GoogleContainerTools/skaffold · error

found multiple namespaces in skaffold.yaml (not supported in

Error message

found multiple namespaces in skaffold.yaml (not supported in `skaffold apply`): %s, %s

What it means

getDefaultDeployer merges default namespaces across multiple skaffold configs for `skaffold apply`. When two configs resolve to different default namespaces (explicitly set or derived from their deployer configs), the merge is ambiguous and this error is returned with both namespace names.

Source

Thrown at pkg/skaffold/runner/deployer.go:282

				return nil, fmt.Errorf("found multiple log prefixes in skaffold.yaml (not supported in `skaffold apply`): %s, %s", logPrefix, d.Logs.Prefix)
			}
			logPrefix = d.Logs.Prefix
		}
		var currentDefaultNamespace *string
		var currentKubectlFlags latest.KubectlFlags
		if d.KubectlDeploy != nil {
			currentDefaultNamespace = d.KubectlDeploy.DefaultNamespace
			currentKubectlFlags = d.KubectlDeploy.Flags
		}
		if kFlags == nil {
			kFlags = &currentKubectlFlags
		}
		if err := validateKubectlFlags(kFlags, currentKubectlFlags); err != nil {
			return nil, err
		}
		if currentDefaultNamespace != nil {
			if defaultNamespace != nil && *defaultNamespace != *currentDefaultNamespace {
				return nil, fmt.Errorf("found multiple namespaces in skaffold.yaml (not supported in `skaffold apply`): %s, %s", *defaultNamespace, *currentDefaultNamespace)
			}
			defaultNamespace = currentDefaultNamespace
		}
	}
	if kFlags == nil {
		kFlags = &latest.KubectlFlags{}
	}
	k := &latest.KubectlDeploy{
		Flags:            *kFlags,
		DefaultNamespace: defaultNamespace,
	}
	dCtx := &deployerCtx{runCtx, latest.DeployConfig{StatusCheck: statusCheck, KubeContext: kubeContext, DeployType: latest.DeployType{KubectlDeploy: k}}}
	defaultDeployer, err := kubectl.NewDeployer(dCtx, labeller, k, runCtx.Artifacts(), "", selectors)
	if err != nil {
		return nil, fmt.Errorf("instantiating default kubectl deployer: %w", err)
	}
	return defaultDeployer, nil
}

View on GitHub (pinned to a1189de023)

Solutions

  1. Set the same `defaultNamespace` in every composed skaffold config
  2. Remove `defaultNamespace` from the configs and pass a single namespace via `--namespace` or `kubectl --context`
  3. Ensure all configs resolve against the same kube context so implicit namespaces match

Example fix

// config-a (before)
deploy:
  kubectl:
    defaultNamespace: frontend
// config-b (before)
deploy:
  kubectl:
    defaultNamespace: backend
// after
# remove both; run: skaffold apply --namespace frontend
Defensive patterns

Strategy: validation

Validate before calling

const ns = [...new Set(configs.map(c => c.deploy?.kubectl?.defaultNamespace).filter(Boolean))]
if (ns.length > 1) {
  throw new Error('conflicting defaultNamespace values: ' + ns.join(', '))
}

Prevention

When it happens

Trigger: Running `skaffold apply` with multiple skaffold configs whose resolved default namespaces differ — either explicit `deploy.kubectl.defaultNamespace` values or namespaces inferred from different kube contexts/kubectl flags per config.

Common situations: Multi-config apply where each service config targets a different namespace (e.g. dev vs prod); configs written for separate clusters with distinct implicit namespaces.

Related errors


AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05). Data as JSON: /api/errors/df041b984eaae9f7. Report an issue: GitHub.