kubernetes/kops · error
parsing path for kops-channels manifest
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.
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
- error loading NodeupConfig
- ConfigBase or ConfigServer is required
- error loading configuration
- parsing kops-channels manifest
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/3d60d20b4fdcff7d.
Report an issue: GitHub.
Appendix: 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)