kubernetes/kops · error

error closing target: %v

Error message

error closing target: %v

What it means

After tasks run and DNS pre-creation, Run calls target.Finish(c.TaskMap) to finalize the apply (write terraform files, print the dryrun changes summary, etc.). A failure there is wrapped as 'error closing target'. The apply itself mostly succeeded; the output/rendering step failed.

Source

Thrown at upup/pkg/fi/cloudup/apply_cluster.go:876

	err = context.RunTasks(options)
	if err != nil {
		return nil, fmt.Errorf("error running tasks: %v", err)
	}

	if !cluster.PublishesDNSRecords() {
		shouldPrecreateDNS = false
	}

	if shouldPrecreateDNS && clusterLifecycle != fi.LifecycleIgnore {
		if err := precreateDNS(ctx, cluster, cloud); err != nil {
			klog.Warningf("unable to pre-create DNS records - cluster startup may be slower: %v", err)
		}
	}

	err = target.Finish(c.TaskMap) // This will finish the apply, and print the changes
	if err != nil {
		return nil, fmt.Errorf("error closing target: %v", err)
	}

	applyResults := &ApplyResults{
		AssetBuilder: assetBuilder,
	}

	return applyResults, nil
}

// upgradeSpecs ensures that fields are fully populated / defaulted
func (c *ApplyClusterCmd) upgradeSpecs(ctx context.Context, assetBuilder *assets.AssetBuilder) error {
	fullCluster, err := PopulateClusterSpec(ctx, c.Clientset, c.Cluster, c.InstanceGroups, c.Cloud, assetBuilder)
	if err != nil {
		return err
	}
	c.Cluster = fullCluster

	for i, g := range c.InstanceGroups {

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Check the wrapped inner error after 'error closing target:' for the filesystem/render cause
  2. Verify the --out directory exists and is writable (mkdir -p, check permissions)
  3. Free disk space if the disk is full
  4. For terraform target, run kops as a user with write access to the output dir
  5. For dryrun in CI, ensure stdout is a valid pipe/file

Example fix

// before
kops update cluster mycluster.example.com --target=terraform --out=/root/tf
// after (writable directory)
mkdir -p ./tf-out
kops update cluster mycluster.example.com --target=terraform --out=./tf-out
Defensive patterns

Strategy: validation

Validate before calling

outDir := "./tf-out"
if err := os.MkdirAll(outDir, 0o755); err != nil {
	return err
}
if f, err := os.Create(filepath.Join(outDir, ".write-test")); err != nil {
	return fmt.Errorf("out dir not writable: %w", err)
} else {
	f.Close(); os.Remove(f.Name())
}

Try / catch

if err := cmd.Run(ctx); err != nil && strings.Contains(err.Error(), "error closing target") {
	// check out-dir writability, disk space, and stdout validity
}

Prevention

When it happens

Trigger: target.Finish errors during `kops update cluster`: for TargetTerraform, failure writing terraform output to --out dir; for TargetDryRun, failure rendering or printing the change summary (e.g. stdout pipe closed).

Common situations: --out directory not writable or disk full; terraform output directory doesn't exist or is read-only; running in CI with closed stdout when using --target=dryrun; filesystem permission issues.

Related errors


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/53d5c5feb29f73c1. Report an issue: GitHub.