kubernetes/kops · error
parsing path for kops-channels manifest %s: %w
Error message
parsing path for kops-channels manifest %s: %w
What it means
readChannelsManifest parses the VFS path stored in NodeupConfig.ChannelsManifest (the location of the kops-channels static pod manifest in the state store) with vfs.Context.BuildVfsPath. If the path string is not a valid/known VFS scheme or is malformed, the parse fails and nodeup wraps the error with this message. Nodeup cannot locate the channels manifest at all in that case.
Source
Thrown at nodeup/pkg/model/channels.go:91
manifest, err := b.readChannelsManifest(c)
if err != nil {
return err
}
c.AddTask(&nodetasks.File{
Path: channelsManifestPath,
Contents: fi.NewBytesResource(manifest),
Type: nodetasks.FileType_File,
})
return nil
}
// readChannelsManifest fetches the cloudup-built manifest and applies node-local SELinux
// decoration when needed. Otherwise it passes the bytes through unchanged.
func (b *ChannelsBuilder) readChannelsManifest(c *fi.NodeupModelBuilderContext) ([]byte, error) {
ctx := c.Context()
p, err := vfs.Context.BuildVfsPath(b.NodeupConfig.ChannelsManifest)
if err != nil {
return nil, fmt.Errorf("parsing path for kops-channels manifest %s: %w", b.NodeupConfig.ChannelsManifest, err)
}
data, err := p.ReadFile(ctx)
if err != nil {
return nil, fmt.Errorf("reading kops-channels manifest %s: %w", b.NodeupConfig.ChannelsManifest, err)
}
// SELinux is per-IG via containerdConfig, so the decoration can only be applied at nodeup.
// Skip the parse/reserialize round-trip when there's nothing to add.
if b.NodeupConfig.ContainerdConfig == nil || !b.NodeupConfig.ContainerdConfig.SeLinuxEnabled {
return data, nil
}
pod := &v1.Pod{}
if err := yaml.Unmarshal(data, pod); err != nil {
return nil, fmt.Errorf("parsing kops-channels manifest: %w", err)
}
kubemanifest.AddHostPathSELinuxContext(pod, b.NodeupConfig)
out, err := k8scodecs.ToVersionedYaml(pod)
if err != nil {View on GitHub (pinned to 4c8573c808)
Solutions
- Inspect NodeupConfig.ChannelsManifest on the node (under /etc/kubernetes/kops or the state store) and verify it is a complete, valid VFS path (e.g. s3://bucket/cluster/manifests/kops-channels.yaml).
- Re-run 'kops update cluster --yes' (and kops-apply) to regenerate a correct NodeupConfig.
- Verify the kops binary/nodeup was built with support for the state store backend the path uses.
- Retry nodeup after fixing the path; this failure is deterministic, not transient.
Example fix
# before channelsManifest: "" # after channelsManifest: "s3://my-state-store/cluster.k8s.local/manifests/kops-channels.yaml"
Defensive patterns
Strategy: validation
Validate before calling
p := cfg.ChannelsManifest
if u, err := url.Parse(p); err != nil || u.Scheme == "" {
return fmt.Errorf("ChannelsManifest %q is not a valid VFS path", p)
} Try / catch
if err := nodeupRun(ctx); err != nil {
var s *string
_ = s
if strings.Contains(err.Error(), "parsing path for kops-channels manifest") {
// fix ChannelsManifest in NodeupConfig and retry once
}
return err
} Prevention
- Always generate NodeupConfig via 'kops update cluster' rather than editing it by hand.
- Validate state-store URL syntax (scheme://bucket/key) before applying cluster changes.
- Pin one kops binary version for both cloudup and nodeup.
When it happens
Trigger: Build() on a master node calls readChannelsManifest, and NodeupConfig.ChannelsManifest is empty, malformed, or uses an unsupported VFS scheme (e.g. missing scheme, wrong s3:///gs:// syntax, invalid characters).
Common situations: Corrupted or partially written NodeupConfig on the node; state store backend not compiled in or misconfigured (e.g. VFS path pointing to a scheme nodeup doesn't support); hand-editing the nodeup config's channelsManifest field.
Related errors
- cannot parse ConfigBase %q: %v
- error loading NodeupConfig %q: %v
- unsupported cloud provider for authenticator %q
- reading kops-channels manifest %s: %w
- parsing kops-channels manifest: %w
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/3d60d20b4fdcff7d.
Report an issue: GitHub.