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
- Make the defaultNamespace values identical in deploy.kubectl and deploy.kustomize before upgrading.
- Remove the defaultNamespace from one of the two deployers (usually kustomize) so only one value remains.
- 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
- Keep defaultNamespace on only one deployer
- Make kubectl/kustomize deployer settings consistent before upgrade
- Prefer a single deployer in configs
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
- can't merge disableValidation property from kustomize into k
- kubectl version 1.12.0 or greater is recommended for use wit
- there's no version to upgrade from "latest"
- unknown panic
- converting deploy.kpt isn't currently supported
AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05).
Data as JSON: /api/errors/a9407a4bbb3015a4.
Report an issue: GitHub.