GoogleContainerTools/skaffold · error

can't merge defaultNamespace property from kustomize into ku

Error message

can't merge defaultNamespace property from kustomize into kubectl deployer, property is already set with different value

What it means

Older schemas allowed both a kustomize and a kubectl deployer; upgrades merge kustomize settings into the kubectl deployer. If both define defaultNamespace with different values, the merge is ambiguous and the upgrade fails with this error rather than silently picking one.

Source

Thrown at pkg/skaffold/schema/v2beta29/upgrade.go:327

			}
			if strings.Contains(old.Path, "/deploy/kpt") {
				log.Entry(context.TODO()).Warn("skip migrating kpt deploy sections. Please migrate these over manually")
			}
		}
	}
}

func mergeKustomizeIntoKubectlDeployer(newPL *next.Pipeline, oldPL *Pipeline) error {
	kustomizeD := &next.KubectlDeploy{}
	pkgutil.CloneThroughJSON(oldPL.Deploy.KustomizeDeploy, kustomizeD)

	if newPL.Deploy.KubectlDeploy == nil {
		newPL.Deploy.KubectlDeploy = kustomizeD
	} else {
		kubectlD := newPL.Deploy.KubectlDeploy

		if kubectlD.DefaultNamespace != nil && kustomizeD.DefaultNamespace != nil && *(kubectlD.DefaultNamespace) != *(kustomizeD.DefaultNamespace) {
			return errors.New("can't merge defaultNamespace property from kustomize into kubectl deployer, property is already set with different value")
		}

		if kubectlD.Flags.DisableValidation != kustomizeD.Flags.DisableValidation {
			return errors.New("can't merge disableValidation property from kustomize into kubectl deployer, property is already set with different value")
		}

		if kustomizeD.DefaultNamespace != nil {
			kubectlD.DefaultNamespace = kustomizeD.DefaultNamespace
		}

		kubectlD.Flags = next.KubectlFlags{
			DisableValidation: kustomizeD.Flags.DisableValidation,
			Global:            append(kubectlD.Flags.Global, kustomizeD.Flags.Global...),
			Apply:             append(kubectlD.Flags.Apply, kustomizeD.Flags.Apply...),
			Delete:            append(kubectlD.Flags.Delete, kustomizeD.Flags.Delete...),
		}

		kubectlD.LifecycleHooks = next.DeployHooks{

View on GitHub (pinned to a1189de023)

Solutions

  1. Make the defaultNamespace values identical in deploy.kubectl and deploy.kustomize before upgrading.
  2. Remove the defaultNamespace from one of the two deployers (usually kustomize) so only one value remains.
  3. Let the upgrade merge (drop conflicts), then re-add the desired defaultNamespace to the upgraded kubectl deployer.

Example fix

# before
deploy:
  kubectl:
    defaultNamespace: foo
  kustomize:
    defaultNamespace: bar
# after
deploy:
  kubectl:
    defaultNamespace: foo
Defensive patterns

Strategy: validation

Validate before calling

func nsConflict(k, ku *v2beta29.KubectlDeploy) bool {
    return k != nil && ku != nil && k.DefaultNamespace != nil && ku.DefaultNamespace != nil && *k.DefaultNamespace != *ku.DefaultNamespace
}

Type guard

if kd.DefaultNamespace != nil && kzd.DefaultNamespace != nil && *kd.DefaultNamespace != *kzd.DefaultNamespace { /* conflict */ }

Try / catch

if err != nil && strings.Contains(err.Error(), "can't merge defaultNamespace") {
    // unify or drop one defaultNamespace and retry
}

Prevention

When it happens

Trigger: Upgrading a config where deploy.kubectl.defaultNamespace and deploy.kustomize.defaultNamespace are both set and differ; mergeKustomizeIntoKubectlDeployer runs from upgradeOnePipeline.

Common situations: skaffold.yaml with kustomize deployer overriding the namespace while a kubectl deployer is also present; running `skaffold fix` on such multi-deployer configs.

Related errors


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