kubernetes/kops · error

error building kubelet flags: %v

Error message

error building kubelet flags: %v

What it means

buildSystemdEnvironmentFile renders /etc/sysconfig/kubelet by converting the KubeletConfigSpec struct into kubelet command-line flags via flagbuilder.BuildFlags. If the flag builder cannot serialize a field (unsupported type, reflection failure), the error is wrapped with "error building kubelet flags: %v".

Source

Thrown at nodeup/pkg/model/kubelet.go:473

// buildManifestDirectory creates the directory where kubelet expects static manifests to reside
func (b *KubeletBuilder) buildManifestDirectory(kubeletConfig *kops.KubeletConfigSpec) (*nodetasks.File, error) {
	if kubeletConfig.PodManifestPath == "" {
		return nil, fmt.Errorf("failed to build manifest path. Path was empty")
	}
	directory := &nodetasks.File{
		Path: kubeletConfig.PodManifestPath,
		Type: nodetasks.FileType_Directory,
		Mode: s("0755"),
	}
	return directory, nil
}

// buildSystemdEnvironmentFile renders the environment file for the kubelet
func (b *KubeletBuilder) buildSystemdEnvironmentFile(ctx context.Context, kubeletConfig *kops.KubeletConfigSpec) (*nodetasks.File, error) {
	// TODO: Dump the separate file for flags - just complexity!
	flags, err := flagbuilder.BuildFlags(kubeletConfig)
	if err != nil {
		return nil, fmt.Errorf("error building kubelet flags: %v", err)
	}

	if b.UsesSecondaryIP() {
		localIP, err := b.GetMetadataLocalIP(ctx)
		if err != nil {
			return nil, err
		}
		if localIP != "" {
			flags += " --node-ip=" + localIP
		}
	}

	if b.IsIPv6Only() {
		flags += " --node-ip=::"
	}

	flags += " --config=" + kubeletConfigFilePath

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Read the wrapped underlying error to identify the failing field
  2. Ensure the kops and nodeup binaries are the same version
  3. Remove or correct the unsupported kubelet spec field
  4. Upgrade kops to a version where the field's flag rendering is supported

Example fix

// before (mixed versions)
kops update cluster --yes && nodeup-from-old-version
// after (align versions)
kops update cluster --yes && kops rolling-update cluster --yes # ships matching nodeup
Defensive patterns

Strategy: try-catch

Validate before calling

// Dry-run flag rendering before writing the env file
if _, err := flagbuilder.BuildFlags(kubeletConfig); err != nil {
    return fmt.Errorf("kubelet flags cannot be rendered: %w", err)
}

Try / catch

flags, err := flagbuilder.BuildFlags(kubeletConfig)
if err != nil {
    return fmt.Errorf("check kubelet spec fields against your kops/nodeup version: %v", err)
}

Prevention

When it happens

Trigger: buildSystemdEnvironmentFile -> flagbuilder.BuildFlags(kubeletConfig) returns an error, typically a field on KubeletConfigSpec that flagbuilder cannot render to a --flag=value string.

Common situations: New kops spec fields added without corresponding flagbuilder support; unusual types (slices/maps) in the config that the reflection-based flag builder rejects; version skew between kops controller and nodeup binary.

Related errors


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