kubernetes/kops · error

error writing to stdout: %v

Error message

error writing to stdout: %v

What it means

fullOutputYAML serializes each runtime.Object to the output writer, emitting a YAML '---' separator between objects. If writing a separator fails (broken/closed stdout, disk full on redirected output, EPIPE), it wraps the underlying write error as 'error writing to stdout: %v'.

Source

Thrown at cmd/kops/get_cluster.go:272

		}
	}

	if !singleObject {
		if _, err := fmt.Fprint(out, "]"); err != nil {
			return err
		}
	}

	return nil
}

// fullOutputYAML outputs the marshalled JSON of a list of clusters and instance groups.  It will handle
// nils for clusters and instanceGroups slices.
func fullOutputYAML(out io.Writer, args ...runtime.Object) error {
	for i, obj := range args {
		if i != 0 {
			if err := writeYAMLSep(out); err != nil {
				return fmt.Errorf("error writing to stdout: %v", err)
			}
		}
		if err := marshalToWriter(obj, marshalYaml, out); err != nil {
			return err
		}
	}
	return nil
}

func fullClusterSpecs(ctx context.Context, vfsContext *vfs.VFSContext, clusters []*kopsapi.Cluster) ([]*kopsapi.Cluster, error) {
	var fullSpecs []*kopsapi.Cluster
	for _, cluster := range clusters {
		configBase, err := registry.ConfigBase(vfsContext, cluster)
		if err != nil {
			return nil, fmt.Errorf("error reading full cluster spec for %q: %v", cluster.ObjectMeta.Name, err)
		}
		configPath := configBase.Join(registry.PathClusterCompleted)
		b, err := configPath.ReadFile(ctx)

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Check that stdout's destination is writable and has free space.
  2. Avoid piping into tools that exit early (e.g. `head`); capture full output or use `sed -n '1,Np'` alternatives that consume all input.
  3. Inspect the wrapped error (%v) for the underlying errno (EPIPE, ENOSPC, EBADF) and fix accordingly.
  4. Rerun without redirection to confirm kops itself is healthy.

Example fix

// before
kops get clusters -o yaml | head -5
// after
kops get clusters -o yaml > out.yaml && head -5 out.yaml
Defensive patterns

Strategy: fallback

Validate before calling

# ensure stdout target is writable before piping
df -h "${OUTDIR:-/tmp}" | awk 'NR==2 && $4+0 < 1 {exit 1}' || { echo "insufficient disk" >&2; exit 1; }

Type guard

null

Try / catch

if ! kops get clusters -o yaml > out.yaml 2>err.txt; then
  grep -q 'error writing to stdout' err.txt && echo "stdout target failed: $(cat err.txt)" || cat err.txt
fi

Prevention

When it happens

Trigger: `kops get clusters -o yaml` piped into a program that closes the pipe early (SIGPIPE/EPIPE), or output redirected to a full/unwritable target.

Common situations: `kops get -o yaml | head` closing the pipe; CI logs to a full tmpfs; stdout redirected to a read-only file or closed descriptor.

Related errors


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