Skip to content

nocloud doesn't support CIDATA with MIME multi-part user-data #12638

@mdnix

Description

@mdnix

Bug Report

Description

I tried to run Talos on Exoscale private instances. In that case the instances don't have access to the metadata service (169.254.169.254). Due to the fact that they are private I can't use the exoscale disk image, since that one expects metadata coming from that link-local address.
Because of that I used the nocloud disk image instead. With that Exoscale falls back to using a CIDATA ISO instead which contains the user-data.

However, Talos fails to parse the user-data with:

failed to load config via platform nocloud: decode error: yaml: line 4: could not find expected ':'

The issue is that Exoscale provides the user-data as a MIME multi-part archive and the nocloud platform doesn't recognize this format and tries to parse the entire contents as YAML.

As an example this is how Exoscale provides the user-data to the machines:

Content-Type: multipart/mixed; boundary="===============OTc5MDFkZDQtMzkxOS00OWI2LWJhMjAtZGNhNGEzZjFmNjc4=="
MIME-Version: 1.0

--===============OTc5MDFkZDQtMzkxOS00OWI2LWJhMjAtZGNhNGEzZjFmNjc4==
Content-Type: text/cloud-config; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="user-data-0"
dmVyc2lvbjogdjFhbHBoYTEKZGVidWc6IGZhbHNlCnBlcn...

--===============OTc5MDFkZDQtMzkxOS00OWI2LWJhMjAtZGNhNGEzZjFmNjc4==

The actual machineconfig is base64 encoded inside one of the MIME parts.

I have a working fix that handles this MIME multi-part format. I'd be happy to submit a PR, though it still needs a bit of polishing. For now I wanted to report the issue to have it as a reference.

Logs

Errors with nocloud 1.12.1

user: warning: [2026-01-20T10:53:29.653647055Z]: [talos] downloading config {"component": "controller-runtime", "controller": "config.AcquireController", "platform": "nocloud"}
user: warning: [2026-01-20T10:53:29.756267055Z]: [talos] volume status {"component": "controller-runtime", "controller": "block.VolumeManagerController", "volume": "platform/cidata/config", "phase": "waiting -> ready", "location": "/dev/vdb"}
kern: debug: [2026-01-20T10:53:29.759089055Z]: ISO 9660 Extensions: Microsoft Joliet Level 3
kern: debug: [2026-01-20T10:53:29.759218055Z]: ISO 9660 Extensions: RRIP_1991A
user: warning: [2026-01-20T10:53:29.759264055Z]: [talos] found config disk (cidata) at /dev/vdb
user: warning: [2026-01-20T10:53:29.759934055Z]: [talos] fetching meta config from: cidata/meta-data
user: warning: [2026-01-20T10:53:29.760729055Z]: [talos] fetching network config from: cidata/network-config
user: warning: [2026-01-20T10:53:29.761454055Z]: [talos] failed to read network-config: no such file or directory
user: warning: [2026-01-20T10:53:29.762189055Z]: [talos] fetching machine config from: cidata/user-data
user: warning: [2026-01-20T10:53:29.764171055Z]: [talos] volume status {"component": "controller-runtime", "controller": "block.VolumeManagerController", "volume": "platform/cidata/config", "phase": "ready -> closed", "location": "/dev/vdb"}
user: warning: [2026-01-20T10:53:29.771281055Z]: [talos] controller failed {"component": "controller-runtime", "controller": "config.AcquireController", "error": "failed to load config via platform nocloud: decode error: yaml: line 4: could not find expected ':'"}

Success with fix which adds mime parsing to nocloud.

user: warning: [2026-01-21T14:08:04.126057033Z]: [talos] found config disk (cidata) at /dev/vdb
user: warning: [2026-01-21T14:08:04.126488033Z]: [talos] fetching meta config from: cidata/meta-data
user: warning: [2026-01-21T14:08:04.127150033Z]: [talos] fetching network config from: cidata/network-config
user: warning: [2026-01-21T14:08:04.127679033Z]: [talos] failed to read network-config: no such file or directory
user: warning: [2026-01-21T14:08:04.128185033Z]: [talos] fetching machine config from: cidata/user-data
user: warning: [2026-01-21T14:08:04.129245033Z]: [talos] volume status {"component": "controller-runtime", "controller":
"block.VolumeManagerController", "volume": "platform/cidata/config", "phase": "ready -> closed", "location": "/dev/vdb"}
user: warning: [2026-01-21T14:08:04.131139033Z]: [talos] nocloud: parsed 1 MIME parts
user: warning: [2026-01-21T14:08:04.133195033Z]: [talos] machine config loaded successfully {"component": "controller-runtime",
"controller": "config.AcquireController", "sources": ["nocloud"]}
user: warning: [2026-01-21T14:08:04.134278033Z]: [talos] task loadConfig (1/1): done, 113.216524ms
user: warning: [2026-01-21T14:08:04.134716033Z]: [talos] phase config (9/9): done, 114.412797ms
user: warning: [2026-01-21T14:08:04.135139033Z]: [talos] initialize sequence: done: 2.442343847s

Environment

  • Talos version: v1.12.1
  • Kubernetes version: v1.35.0
  • Platform: nocloud

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions