kubernetes/kops · error
unable to locate asset %q
Error message
unable to locate asset %q
What it means
After Find succeeds, a nil kubelet asset means no `kubelet` binary asset was registered for this cluster/version, so nodeup cannot place the kubelet binary at b.kubeletPath(). Mirrors error 680 but for the kubelet asset.
Source
Thrown at nodeup/pkg/model/kubelet.go:171
{
t, err := b.buildSystemdEnvironmentFile(c.Context(), kubeletConfig)
if err != nil {
return err
}
c.AddTask(t)
}
{
// @TODO Extract to common function?
assetName := "kubelet"
assetPath := ""
// @TODO make Find call to an interface, we cannot mock out this function because it finds a file on disk
asset, err := b.Assets.Find(assetName, assetPath)
if err != nil {
return fmt.Errorf("trying to locate asset %q: %v", assetName, err)
}
if asset == nil {
return fmt.Errorf("unable to locate asset %q", assetName)
}
c.AddTask(&nodetasks.File{
Path: b.kubeletPath(),
Contents: asset,
Type: nodetasks.FileType_File,
Mode: s("0755"),
})
}
{
if kubeletConfig.PodManifestPath != "" {
t, err := b.buildManifestDirectory(kubeletConfig)
if err != nil {
return err
}
c.EnsureTask(t)
}
}View on GitHub (pinned to 4c8573c808)
Solutions
- Verify the kubelet asset exists in the asset store at the expected arch-specific URL.
- Correct the cluster's kubernetesVersion to a version with published kubelet binaries.
- Re-run kops update cluster to regenerate/refresh assets, then retry nodeup.
- For air-gapped setups, upload the exact kubelet binary matching the cluster version.
Example fix
// before kubernetesVersion: v1.32.0-alpha.99 // after kubernetesVersion: v1.32.0
Defensive patterns
Strategy: validation
Validate before calling
u := fmt.Sprintf("%s/%s/bin/linux/amd64/kubelet", baseURL, k8sVersion)
resp, err := http.Head(u)
if err != nil || resp.StatusCode != http.StatusOK {
return fmt.Errorf("kubelet binary not published at %s", u)
} Prevention
- Use stable kubernetesVersion values with published kubelet binaries.
- Mirror the exact binaries matching the cluster version for air-gapped installs.
- Run kops update cluster before nodeup so assets are registered.
When it happens
Trigger: Assets.Find("kubelet", "") returns (nil, nil): the asset registry contains no kubelet asset — wrong kubernetesVersion, incomplete mirror, or assets not generated for the target arch.
Common situations: Air-gapped installs missing the kubelet binary in the mirror; unsupported/typo'd Kubernetes version; nodeup run before `kops update` uploaded assets.
Related errors
- trying to locate asset %q: %v
- unable to find any containerd binaries in assets
- error finding runc asset
- unable to locate asset %q
- error building kubelet server cert: %v
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/236f17ad7339fc93.
Report an issue: GitHub.