Bottlerocket and Talos Linux are minimal, immutable operating systems built only to host containers. Bottlerocket, from Amazon, entered public preview on 10 March 2020 and reached 1.0.0 on 31 August 2020; Talos Linux, from Sidero Labs, tagged v0.1.0 on 30 July 2019 and v1.0.0 on 29 March 2022. Neither ships SSH, a shell or a package manager by default: you configure them through an API, they update by writing a whole signed image to a second partition, and they roll back if the new image will not boot.
Their support models differ in an important way. Bottlerocket bakes the Kubernetes version into a "variant" such as aws-k8s-1.36, supports each Kubernetes variant for roughly 14 months (longer on Amazon EKS extended support), and moves you to a new Kubernetes minor version by replacing nodes. Talos keeps one OS image per release, upgrades Kubernetes in place with talosctl upgrade-k8s, and gives community support to a minor release only until the next minor ships, which is about every four months. This post goes one level deeper than our Flatcar and Fedora CoreOS release history, which covers the first generation of container hosts, and sits next to our Amazon Linux release history.
Key takeaways
- Bottlerocket's CHANGELOG starts at v0.1.6 (21 October 2019). Amazon introduced it publicly on 10 March 2020, the same day v0.3.1 shipped, and announced general availability on 31 August 2020 with v1.0.0. As of 24 October 2026 the CHANGELOG reaches v1.68.0, dated 22 October 2026.
- Talos Linux tagged v0.1.0 on 30 July 2019 and v1.0.0 on 29 March 2022. The current line is 1.14 (v1.14.0 tagged 3 September 2026, v1.14.4 on 16 October 2026), with 1.15 in alpha.
- Bottlerocket variants pin an orchestrator version. Each Kubernetes variant gets updates for approximately 14 months after its first release, and
aws-k8s-*variants follow the EKS policy, including extended support. Each ECS variant gets at least one year. - Talos community support for a minor version ends when the next minor version is released. Talos 1.14 supports Kubernetes 1.33 through 1.37. Sidero Labs offers paid enterprise support beyond that.
- Bottlerocket verifies updates with The Update Framework (TUF): signed root, timestamp, snapshot and targets metadata. Talos installs signed installer images, and since 1.14 those come from the Image Factory rather than a release registry image.
- Bottlerocket ships SELinux in enforcing mode with no way to disable it, a dm-verity root filesystem, kernel lockdown in "integrity" mode on most variants, and Secure Boot on new variants since 1.15.0. Talos runs from a signed SquashFS image, enforces kernel module signatures, follows KSPP kernel hardening, and has had SELinux in permissive mode by default since 1.10.
- Both publish SBOMs: Bottlerocket writes SPDX 2.3 and CycloneDX 1.6 files into every image from v1.53.0; Talos publishes SPDX files on each GitHub release and exposes
SBOMItemresources on a running node.
A dated timeline of both projects
Dates for Bottlerocket come from the headings in its CHANGELOG.md. The matching GitHub release objects are sometimes published a few days later, so treat a date as "the day the changelog says the release was cut." Dates for Talos are the dates of the git tags in the siderolabs/talos repository, cross checked against the GitHub release page where one was fetched.
| Date | Project | Release | What changed |
|---|---|---|---|
| 30 Jul 2019 | Talos | v0.1.0 | First tagged release of the Talos repository |
| 21 Oct 2019 | Bottlerocket | v0.1.6 | Earliest release recorded in the CHANGELOG |
| 27 Feb 2020 | Bottlerocket | v0.3.0 | First release with the core security features: dm-verity root, stateless /etc, no shell, hardened build flags, SELinux enforcing, automated updates |
| 10 Mar 2020 | Bottlerocket | v0.3.1 | Public introduction by Amazon as a special purpose container OS |
| 14 Aug 2020 | Bottlerocket | v0.5.0 | aws-ecs-1 variant prototype for Amazon ECS |
| 31 Aug 2020 | Bottlerocket | v1.0.0 | General availability; EKS builds GA, ECS in preview |
| 7 May 2021 | Bottlerocket | v1.1.0 | Lockdown default changes from "none" to "integrity"; aws-k8s-1.15 removed |
| 7 Feb 2022 | Bottlerocket | v1.6.0 | metal-k8s-1.21, the first bare metal variant |
| 29 Mar 2022 | Talos | v1.0.0 | First 1.x release |
| 17 Aug 2023 | Talos | v1.5.0 | SecureBoot with Unified Kernel Images; boot media generated with system extensions included |
| 18 Sep 2023 | Bottlerocket | v1.15.0 | Secure Boot support; aws-ecs-2; build tooling moves to Twoliter |
| 15 Dec 2023 | Talos | v1.6.0 | Image Factory documentation lands in the release cycle |
| 6 Aug 2024 | Bottlerocket | v1.21.0 | Migration to the separately versioned core kit; Kubernetes 1.26 and 1.27 metal and VMware variants dropped |
| 12 Nov 2024 | Bottlerocket | v1.27.0 | FIPS variants added; Kubernetes 1.28 and 1.29 metal variants dropped |
| 17 Dec 2024 | Bottlerocket | v1.29.0 | Separately versioned kernel kit 1.0.0 |
| 30 Apr 2025 | Talos | v1.10.0 | Initial SELinux support, enabled in permissive mode |
| 4 Aug 2025 | Bottlerocket | v1.44.0 | aws-k8s-1.27 and aws-ecs-1 variants removed |
| 17 Nov 2025 | Bottlerocket | v1.51.0 | aws-ecs-3 preview; NVIDIA FIPS variants |
| 22 Dec 2025 | Talos | v1.12.0 | Stricter KSPP sysctl settings applied at runtime |
| 13 Jan 2026 | Bottlerocket | v1.53.0 | Kubernetes 1.35 variants; EROFS root partition on all variants; SBOM files written into the image |
| 27 Apr 2026 | Talos | v1.13.0 | Supports Kubernetes 1.31 to 1.36 |
| 18 May 2026 | Bottlerocket | v1.61.0 | Kubernetes 1.36 variants; aws-ecs-4 preview |
| 27 Jul 2026 | Bottlerocket | v1.64.0 | aws-k8s-1.30 variants removed |
| 3 Sep 2026 | Talos | v1.14.0 | sandboxd workload isolation; installer images served only by Image Factory; Secure Boot images default to lockdown=integrity |
| 18 Sep 2026 | Bottlerocket | v1.66.0 | Kubernetes 1.37 variants on kernel 6.18 and containerd 2.3 |
| 16 Oct 2026 | Talos | v1.14.4 | Latest 1.14 patch at time of writing |
| 22 Oct 2026 | Bottlerocket | v1.68.0 | CHANGELOG entry; Kubernetes 1.31 to 1.36 updated to latest EKS Distro builds |
Bottlerocket ships a cumulative minor release every two to six weeks with no long term branch. Talos ships a minor about three times a year and back ports fixes: v1.13.12 shipped five days after v1.14.4.
What is a minimal, immutable container host OS, and why drop SSH, a shell and a package manager?
A general purpose Linux server is a pile of packages that an administrator adds to, edits and patches one at a time. Every host drifts a little, and every tool on it, from the shell to the interpreter to the package manager, is something an attacker who lands on the box can use. A minimal container host takes the opposite position. The host exists to run a container runtime and an orchestrator agent, so everything else is removed, and the remaining operating system is shipped as one image that cannot be changed in place.
Bottlerocket's README says "there's no SSH server in a Bottlerocket image, and not even a shell." Its security features document adds that interpreted languages such as Python "are not installed or even available as packages," because shells and interpreters let an attacker "pivot from a vulnerability that grants local code execution."
Talos goes further. Its philosophy page says the userspace is "a ground-up rewrite" from PID 1, written in Go. There is no systemd; the kernel launches Talos's own machined. There are "no GNU utilities, no shell, no SSH, no packages," not even a busybox, and the SquashFS image is under 80 MB.
Removing the package manager also changes how patching works. On Bottlerocket, the docs say packages exist only at build time: "the inventory will never change for a given version and variant," and "updating to the most recent version will patch all packages." Talos works the same way, with each release producing one image whose contents are fixed. That makes both systems easy to inventory and hard to drift, but it means you cannot hot fix one library on a node. You wait for, or build, a new image.
What replaces the shell for operators?
Both projects replace interactive login with an API.
- Bottlerocket runs an HTTP API server on a local Unix domain socket. You reach it through an authenticated channel, by default a "control" host container that runs the systems manager agent, and use
apiclientto read and change settings, apply updates and run reports. Settings are modeled, stored, rendered into config files on every boot and migrated across OS updates. - Talos exposes a gRPC API on the network, secured with mutual TLS. Its philosophy page says there are "no passwords in Talos," all networked communication is "encrypted and key-authenticated," and certificates are short lived and rotate automatically.
talosctlis the reference client, and it works with contexts and endpoints much likekubectl.
When you truly need a shell, both offer a controlled escape hatch. Bottlerocket has an "admin" host container, disabled by default, that runs SSH and can open a root shell on the host with sheltie. Talos has talosctl debug, which starts a privileged container from an image you supply and removes it when you exit.
Bottlerocket: origins, variants, and the API and settings model
Bottlerocket's earliest CHANGELOG entry is v0.1.6 on 21 October 2019. Amazon's container blog later wrote that "on March 10, 2020, we introduced Bottlerocket," and that date matches the v0.3.1 release. The general availability announcement on 31 August 2020 said builds for Amazon EKS were generally available and builds for Amazon ECS were in preview, and that Bottlerocket "is designed to work with any orchestrator." The README notes that almost all first party components are written in Rust.
What is a variant?
A variant is Bottlerocket's replacement for packages. The concepts page defines variants as "pre-defined sets of drivers, tools, and applications" tailored to an architecture, a platform and an orchestrator, plus an optional flavor. You never install a variant directly; you install an image that is a build of that variant at one Bottlerocket version. Image file names spell it out:
bottlerocket-[platform]-[orchestrator]-[orchestrator version](-[flavor])-[architecture]-[version]-[commit]
bottlerocket-aws-k8s-1.32-x86_64-<version>-<commit>.img
The two flavors documented today are nvidia, which adds GPU support, and fips, which constrains the kernel and userspace to cryptographic modules submitted to the FIPS 140-3 validation program. Architectures are x86_64 and aarch64.
As of the README fetched on 24 October 2026, the supported variants are:
| Family | Supported variants |
|---|---|
| EKS (Kubernetes on EC2) | aws-k8s-1.31 through aws-k8s-1.37, plus -nvidia flavors of each |
| ECS | aws-ecs-2, aws-ecs-2-nvidia, aws-ecs-3, aws-ecs-3-fips, aws-ecs-3-nvidia |
| VMware Kubernetes workers | vmware-k8s-1.31 through vmware-k8s-1.37 |
| No longer supported | All Kubernetes variants for 1.30 and earlier; VMware variants for 1.30 and earlier; bare metal Kubernetes variants; ECS-1 variants |
The changelog also lists -fips and -nvidia-fips flavors and an aws-ecs-4 preview from v1.61.0.
Variants also isolate change. The security features document says the right time for an unexpected major version update to the kernel or orchestrator agent is "never." Variants peg to a kernel and GPU driver at release and receive security patches. A variant moves to a new kernel only when the old one stops getting security patches. Newer kernels arrive through new variants: v1.61.0 put non-FIPS Kubernetes 1.36 variants on kernel 6.18 and FIPS variants on 6.12, and v1.66.0 put every 1.37 variant on kernel 6.18 with containerd 2.3.
The API and settings model
Configuration lives in the API, not in files. /etc is a memory backed tmpfs, so editing /etc/resolv.conf or the containerd config directly is unsupported and does not survive a reboot. Instead you pass TOML user data at first boot, which early-boot-config turns into API calls, or you change settings later:
apiclient get settings.motd settings.kernel.lockdown
apiclient set host-containers.admin.enabled=true
Settings persist across reboots and are "migrated through OS upgrades" with migration files shipped inside the update repository. That is what lets Bottlerocket skip releases safely: the update system runs every intermediate settings migration in order.
Admin and control containers
Host containers run outside the orchestrator in a separate containerd instance.
- The control container is enabled by default and runs the systems manager agent, so you can start a session and run
apiclient. You can replace it with your own image by changing its URI, or disable it, though the security guidance warns that disabling it "could leave you with no way to access the API and change settings on an existing node." - The admin container is disabled by default. It runs an SSH server and is "superpowered," which means extra privileges, an unrestricted SELinux label and additional mounts. Inside it,
sheltiegives you a full root shell on the host. The guidance recommends "leaving the 'admin' host container disabled until it is necessary to use it."
Even with root, the README warns that the dm-verity setup "will prevent most changes from persisting over a restart." Both containers are versioned components; v1.53.0 moved them to Amazon Linux 2023 bases.
Bottlerocket updates: A/B partitions, TUF and the update operator
Bottlerocket "downloads a full filesystem image and reboots into it." The disk carries two identical partition sets, A and B. An update writes the new image to the inactive set, flips the GPT priority bits, and reboots. Boot success is tracked, and if the new set fails to boot the system "will automatically revert back to the prior working partition set." You can also roll back by hand without any network call:
signpost rollback-to-inactive
reboot
How are Bottlerocket updates signed?
The update client verifies everything through The Update Framework. The updater README in the core kit describes four signed metadata files:
| TUF file | What it does in Bottlerocket |
|---|---|
root.json | Starts the chain of trust and lists the keys the host trusts. Shipped in the image, and replaceable only by a new root signed by a threshold of the old keys |
timestamp.json | Holds the hash of the current snapshot; re-signed often so stale metadata is rejected |
snapshot.json | Lists current versions of all other metadata, so the client only sees the newest root and targets |
targets.json | Lists every downloadable file and its hash, including manifest.json, OS images and migration files |
Any file in the manifest is also a TUF target, so it "can only be downloaded via the TUF repository, preventing the client from downloading untrusted data." Because root.json is signed by several keys with a threshold, losing some keys under that threshold does not block rotation to new keys. If you want to understand why this beats a lone signed binary, our post on whether you need TUF or whether a signed binary is enough walks through the attacks TUF's roles prevent.
The low level client, Updog, only considers version increases by default, respects a max_version in the manifest, refuses updates for a different variant, and checks that migrations exist in both directions. Updates can also carry "wave" information, so a fleet is spread out over time. Updog computes each host's position in the wave from its settings.updates.seed, and a host will not see an update until its slot arrives.
Update methods
The docs split update methods into two groups.
| In place (same node) | Node replacement (new node) |
|---|---|
apiclient update check and apiclient update apply from the control container | EKS console managed node group update |
| Bottlerocket update operator (Brupop) for Kubernetes | eksctl |
| Bottlerocket ECS updater | Any launch template or AMI rollout you run |
| Systems manager command documents |
Brupop is a Kubernetes operator. It runs a controller deployment, an agent daemonset on every Bottlerocket node and an API server. The agent checks for updates, drains the node and applies the update when the controller says so. It uses cert-manager for its internal TLS, and only nodes labelled bottlerocket.aws/updater-interface-version=2.0.0 are updated. Brupop itself only gets security patches on its latest minor version.
Version locking uses two settings. updates.version-lock names a full version such as 1.12.0, and updates.ignore-waves=true makes the node take it immediately. Setting the lock back to latest and ignore-waves back to false returns the node to normal behaviour.
Update paths and the caveats
The in place update guidelines say you can go minor to minor, patch to patch and skip versions within one variant, because migrations run in sequence. Two caveats matter for planning:
- Too many releases between versions. There is a known issue where a node boots into "no space left on device" when the gap is too large; the docs give 1.7.2 to 1.11.0 as an example. The workaround is to step a few releases at a time with version locking.
- No in place move between variants or major versions.
aws-k8s-1.24toaws-k8s-1.25is a migration, not an update. So is adding thenvidiaflavor. Changing orchestrator, for example ECS to Kubernetes, means rebuilding the cluster.
How does variant support end when a Kubernetes version ages out?
The security features document states the policy. Bottlerocket "provides updates for each Kubernetes variant for approximately 14 months after the first release of each variant," and for aws-k8s-* variants it "follows the Amazon EKS support policy, including extended support beyond the typical 12 months support period." The EKS documentation, in turn, gives each Kubernetes minor version 14 months of standard support followed by 12 months of extended support, and extended support is on by default. ECS variants get updates "for at least one year after the first release," and new ECS variants appear only when a newer LTS kernel or a breaking change requires one.
In practice support ends with a changelog line: recent removals include 1.28 in v1.52.0, 1.29 in v1.58.0 and 1.30 in v1.64.0. After that release, the update repository no longer receives new images for that variant, so a node that keeps running it stops getting kernel, containerd and runc fixes even though nothing on the node visibly breaks. The README's advice is to replace those nodes "with the latest variant compatible with their cluster."
Talos Linux: origins, talosctl and the machine configuration
Talos tagged v0.1.0 on 30 July 2019 and spent almost three years in 0.x, reaching v1.0.0 on 29 March 2022 (the GitHub release is timestamped the same day). Release links in the project changelog point at a talos-systems organisation for the 0.x releases and at siderolabs from the 1.1 cycle onward. Sidero Labs builds Talos and also offers Omni, a management service for Talos clusters, and Talos Enterprise Linux with an Enterprise Image Factory; this post covers only the open source OS.
API only management through talosctl
Everything happens over the Talos API. talosctl reads its client configuration from ~/.talos/config or TALOSCONFIG, supports multiple contexts, and distinguishes endpoints (what the client connects to, which can be a load balancer or a list of control plane IPs) from nodes (the machines a command targets, proxied through an endpoint). Talos also documents role based access control for its API, so not every client needs full admin rights.
Typical read operations look like this:
talosctl --nodes 10.20.30.40 version
talosctl --nodes 10.20.30.40 get extensions
talosctl --nodes 10.20.30.40 logs kubelet
talosctl --nodes 10.20.30.40 dmesg
Machine configuration
Each machine is defined by one declarative YAML document set, which covers both Talos and the Kubernetes it forms. The philosophy page says there is "no scripting and no procedural steps," and often the same file serves many machines. Historically that file was one large v1alpha1 document. Talos 1.14 continues splitting it into small, focused documents (KubeAPIServerConfig, KubeletConfig, KubeProxyConfig, VolumeConfig and many more). The old fields still work but are deprecated, and a configuration that sets both a deprecated field and its replacement is rejected.
Talos writes only to a few controlled places. The writable partition is called EPHEMERAL precisely so nobody stores unique data there, and machine secrets live on the STATE partition. "If all else fails, we can always wipe the disk and get back up and running."
The Talos support matrix
The support matrix lists the two most recent lines.
| Talos 1.14 | Talos 1.13 | |
|---|---|---|
| Release date (matrix) | 2026-08-27 (marked TBD) | 2026-04-27 (1.13.0) |
| End of community support | 1.15.0 release (2026-12-27, TBD) | 1.14.0 release (2026-08-27, TBD) |
| Kubernetes versions | 1.37, 1.36, 1.35, 1.34, 1.33 | 1.36, 1.35, 1.34, 1.33, 1.32, 1.31 |
| NVIDIA drivers | 595.x (production), 580.x (LTS) | 595.x (production), 580.x (LTS) |
| Architectures | amd64, arm64 | amd64, arm64 |
| Omni requirement | 1.10.0 or later | 1.8.0 or later |
| Enterprise support | Offered by Sidero Labs | Offered by Sidero Labs |
The matrix's 1.14 release date of 27 August 2026 is an estimate; the v1.14.0 git tag is dated 3 September 2026. Platforms are tiered: tier 1 (metal, AWS, GCP) gets automated tests, tier 3 is community tested.
The git history shows patch releases on older lines after a new minor shipped (v1.12.12 on 4 September 2026, v1.13.12 on 21 October 2026), but the published policy only promises community support until the next minor. Plan on the policy. Omni adds its own floor: its version support policy says that from Omni v1.11.0, estimated for October 2026, Omni will not start if any registered machine runs a Talos version below the minimum supported version.
Talos updates: upgrade flow, Image Factory, extensions, Secure Boot and encryption
The upgrade flow
An OS upgrade is one API call that tells a node which installer image to use. Talos keeps the previous kernel and OS image in an A-B scheme. If the new version fails to boot, Talos rolls back; you can also roll back on purpose with talosctl rollback, which updates the boot reference and reboots. Because Talos reboots through kexec, the extra reboot costs little time.
Talos 1.14 changed where installer images come from. The ghcr.io/siderolabs/installer image is no longer published; installers come from the Image Factory as factory.talos.dev/<platform>-installer/<schematic-id>:<version>. For a machine without customisations, the empty schematic ID is 376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba.
talosctl upgrade --nodes 10.20.30.40 \
--image factory.talos.dev/metal-installer/376567988ad370138ad8b2698212367b8edcb69b5fd68c80be1f2ec7d603b4ba:v1.14.4
Two rules shape upgrade planning:
- Step through every minor version. Configuration migration is "only tested between adjacent minor releases," so the documented path is to move to the latest patch of each intermediate minor. Going from 1.0 to 1.2.4 means 1.0 to v1.0.6, then to v1.1.2, then to v1.2.4.
- Kubernetes is separate. Since v1.0, an OS upgrade does not upgrade Kubernetes. You run
talosctl upgrade-k8s --to <version>against a control plane node, and--dry-runshows what would change first.
Image Factory and system extensions
The Image Factory builds Talos artifacts from a "schematic," a YAML file of customisations: extra kernel arguments, initial META values, official system extensions and a board overlay. Schematics are content addressed, so the same YAML always yields the same ID, and a schematic applied to a Talos version produces a "model." The factory serves ISOs, kernel and initramfs, UKIs, cloud disk images and installer container images over HTTP, PXE and a container registry front end.
System extensions are how Talos adds things like GPU drivers, CPU microcode or extra container runtimes without a package manager. They are container images with a set folder layout, activated only at install or upgrade time, and "the Talos root filesystem is still immutable and read-only" with them installed. Since v1.5.0 Talos can generate boot media with extensions baked in. The practical consequence is that your schematic is part of your version: upgrade with the schematic ID the node was installed from, or the extensions disappear on the next upgrade.
customization:
extraKernelArgs:
- vga=791
systemExtensions:
officialExtensions:
- siderolabs/gvisor
- siderolabs/amd-ucode
Secure Boot and disk encryption
Talos 1.5 introduced SecureBoot using Unified Kernel Images. The current flow runs from UEFI firmware with enrolled keys, to systemd-boot, to a signed UKI. The UKI is measured into TPM PCRs, and expected measurements are signed into a policy with a PCR signing key. Combined with TPM based disk encryption, the docs call this a complete Trusted Boot experience. By default the disk key binds to PCR 7 (Secure Boot state) plus a signed PCR 11 policy. PCR binding is configurable because firmware tools now update the Secure Boot denylist often, which changes PCR 7.
Disk encryption is off by default and uses LUKS2. It can cover the STATE partition (secrets and certificates), the EPHEMERAL partition and user volumes, configured with VolumeConfig and UserVolumeConfig. Four key methods exist, and the docs rate them honestly:
| Method | Docs' description |
|---|---|
static | Static passphrase; weakest, and for STATE the passphrase is stored in META |
nodeID | Key derived from node UUID; weak, protects a drive removed from the node |
kms | Key sealed with a network KMS; strong, needs network to unlock |
tpm | Key derived from the TPM; strong when used with SecureBoot |
apiVersion: v1alpha1
kind: VolumeConfig
name: STATE
encryption:
provider: luks2
keys:
- tpm: {}
slot: 0
Talos 1.14 also changed kernel lockdown on Secure Boot images: they no longer enable lockdown=confidentiality by default and now run with lockdown=integrity implicitly, which the release notes say improves compatibility with eBPF tooling. You can add lockdown=confidentiality back through an Image Factory schematic.
Security model comparison
Both systems start from the same idea, and they enforce it with different mechanisms.
| Control | Bottlerocket | Talos Linux |
|---|---|---|
| Root filesystem | Read only, backed by dm-verity since 0.3.0; kernel restarts on corruption (fail closed); EROFS root on all variants since v1.53.0 | Runs from a signed SquashFS image that is never modified, even when installed to disk |
| Config storage | /etc on tmpfs, rendered from API settings each boot | Single declarative machine config; STATE holds secrets, EPHEMERAL holds rebuildable data |
| Mandatory access control | SELinux enforcing since 0.3.0, "no way to disable it" | SELinux since 1.10, permissive by default; enforcing tested with the default Flannel CNI. AppArmor is an alternative, not both |
| Kernel lockdown | "integrity" by default since v1.1.0 on most variants; nvidia variants use "none" to load unsigned modules | lockdown=integrity implicit on Secure Boot images from 1.14; module signature enforcement (CONFIG_MODULE_SIG_FORCE) built in |
| Kernel hardening | Hardened GCC flags: PIE, stack protector strong, FORTIFY_SOURCE, full RELRO | KSPP build time config and boot parameters; stricter KSPP sysctls at runtime from 1.12; legacy kexec_load disabled |
| Boot chain | Secure Boot on new variants since 1.15.0: firmware, shim, GRUB, signed grub.cfg with dm-verity root hash, kernel. Uses its own certificate rather than the common third party UEFI CA | SecureBoot with UKI via systemd-boot since 1.5, TPM measured boot with signed PCR policy |
| Update integrity | TUF metadata with threshold signed root | Signed installer images; cosign signatures on release and extension images |
| Remote access | Local Unix socket API, reached through the control host container | mTLS gRPC API with RBAC, short lived rotating certificates |
| Break glass | Admin host container (off by default) and sheltie | talosctl debug with a privileged container you supply |
| Compliance reports | apiclient report cis (Bottlerocket CIS Benchmark levels 1 and 2), Kubernetes CIS report, FIPS report | Docs map Talos defaults to the CIS Kubernetes Benchmark; most of the CIS distribution independent Linux benchmark does not apply |
A few details deserve a sentence each. Bottlerocket's security document admits dm-verity is "incomplete unless Secure Boot is enabled," because an attacker with the block device could rewrite both data and verity metadata; Secure Boot does not apply to legacy BIOS boot, including Xen based EC2 instance types. Sidero signs Talos release images with cosign and says its kernel, initramfs, talosctl, ISO and container builds are reproducible; Bottlerocket v1.68.0 made its builds more reproducible too. Talos 1.14 added sandboxd, which isolates containerd, the kubelet and pods in their own namespaces.
Neither project claims these controls make the kernel invulnerable. Bottlerocket's guidance says containers share the host kernel, a local kernel exploit can break other defences, and it recommends "designing for periodic host replacement even with automated updates enabled."
Bottlerocket, Talos, Flatcar and Fedora CoreOS compared
The four best known image based container hosts differ most in how you manage them and how long a version lives. Flatcar and Fedora CoreOS details come from their own docs; our Flatcar and Fedora CoreOS post covers them in depth.
| Bottlerocket | Talos Linux | Flatcar Container Linux | Fedora CoreOS | |
|---|---|---|---|---|
| Lineage | New, Amazon led, Rust first party code | New userspace in Go from PID 1, no systemd | Fork of CoreOS Container Linux | Merger of Container Linux and Fedora Atomic Host |
| Shell and SSH | None on host; admin container optional | None at all; debug container on demand | Shell present; SSH keys set through Ignition | Shell present; SSH keys set through Ignition |
| Management model | Local API through host containers, TOML user data | Network gRPC API, YAML machine config | Ignition at first boot, then ordinary admin | Ignition at first boot, then ordinary admin |
| Update mechanism | Full image to inactive partition set, TUF verified, waves | Installer image to A-B slots, kexec reboot | Full USR image to passive partition via update_engine | OSTree deployments via rpm-ostree and Zincati |
| Update signing | TUF metadata, threshold root | Signed images, cosign on release images | Image signed with a key held on an air gapped HSM; dm-verity on /usr | Fedora signing keys (see our Flatcar and Fedora CoreOS post) |
| Release rhythm | New minor every few weeks | New minor about every four months | Alpha, Beta, Stable channels | next, testing, stable streams, about two weeks apart |
| Support window | Kubernetes variants about 14 months (EKS policy for aws-k8s); ECS at least a year | Community: until next minor; enterprise via Sidero | Stable until next Stable major; LTS 18 months with 6 month overlap | Latest release on each stream only; no LTS stream |
| Kubernetes version | Part of the variant name | Separate, upgraded with upgrade-k8s | Not bundled | Not bundled |
Step by step: identify the version, read the notes, plan a rolling upgrade, and inventory the image
The commands below are read only unless marked otherwise. Run them first against a test cluster.
1. Identify the OS version on every node
From Kubernetes, the OS-IMAGE column comes from each node's os-release:
kubectl get nodes -o wide
kubectl get nodes -o custom-columns=NAME:.metadata.name,OS:.status.nodeInfo.osImage,KUBELET:.status.nodeInfo.kubeletVersion
On a Bottlerocket node, from a control container session:
apiclient get /updates/status
The active_partition.image block shows arch, version and variant for what is running. chosen_update shows what the node would install next, and available_updates lists every version, including older ones, because rollback is supported.
On Talos:
talosctl --nodes 10.20.30.40,10.20.30.41 version
talosctl --nodes 10.20.30.40 get extensions
The first command prints client and server versions per node; the second shows which system extensions, and therefore which schematic, the node is carrying.
2. Read the release notes for security fixes
For Bottlerocket, read CHANGELOG.md in the main repository. Recent entries split into "Security Fixes," "OS Changes" and "Orchestrator Changes," and most OS fixes arrive as kit bumps (bottlerocket-core-kit, bottlerocket-kernel-kit) whose own changelogs list the CVEs. For example, v1.62.1 patched containerd 1.7, 2.1 and 2.2 for five CVEs, and v1.63.0 patched kernels 6.1, 6.12 and 6.18 for three. Advisories live in two places: the GitHub Security tab of the repository and a gzipped updateinfo.xml file.
curl -LO https://advisories.bottlerocket.aws/updateinfo.xml.gz
gunzip updateinfo.xml.gz
grep -c "<update " updateinfo.xml
For Talos, read the GitHub release notes for your target version and the "What's New" and "Upgrading Talos Linux" pages for that minor, which list required before and after steps. Talos publishes CVE advisories in the repository's Security tab with affected versions, severity and the fixed version, and the docs explain how to watch the repository for security alerts only.
3. Plan a rolling upgrade
Bottlerocket, same variant (in place). Let Brupop handle it, or do one node by hand:
# On one canary node, from the control container
apiclient update check
apiclient update apply --check --reboot
If you need to hold a fleet on a known version while you test, lock it and later unlock it:
apiclient set updates.version-lock="1.67.0" updates.ignore-waves=true
# later
apiclient set updates.version-lock="latest" updates.ignore-waves=false
If your fleet is far behind, step through a few releases at a time to avoid the "no space left on device" issue.
Bottlerocket, new Kubernetes minor (node replacement). Upgrade the control plane first, then roll in new nodes on the matching variant (for example aws-k8s-1.37) and drain and remove the old ones. Managed node groups and eksctl both do this.
Talos, same Kubernetes, new OS minor. Upgrade one node at a time, control plane nodes before workers, and keep the schematic:
talosctl --nodes 10.20.30.40 upgrade \
--image factory.talos.dev/metal-installer/<your-schematic-id>:v1.14.4
talosctl --nodes 10.20.30.40 health
Move through each intermediate minor's latest patch, and read the "before upgrade" notes for each; 1.14.4, for example, asks multipath users to apply a config patch first.
Talos, new Kubernetes version. After the OS is on a release that supports the target, check and then run:
talosctl --nodes 10.20.30.40 upgrade-k8s --to 1.37.1 --dry-run
talosctl --nodes 10.20.30.40 upgrade-k8s --to 1.37.1
4. Produce an SBOM or package inventory for a host image
Because both images are fixed per version, one inventory per version (and per variant or schematic) describes every node running it.
Bottlerocket. From v1.53.0, each image contains /usr/share/bottlerocket/spdx-sbom.json (SPDX 2.3) and /usr/share/bottlerocket/cyclonedx-sbom.json (CycloneDX 1.6), generated at build time by merging per package SBOMs. Older releases still have the build time inventory at /var/lib/bottlerocket/inventory/applications.json, whose objects carry Name, Version and Architecture that you can match against the pkglist entries in updateinfo.xml. To read either file you need host access, so do it on a canary node and turn the admin container off afterwards:
# Canary node only. Enable, use, then disable the admin container.
apiclient set host-containers.admin.enabled=true
apiclient exec admin bash
sheltie
cat /usr/share/bottlerocket/spdx-sbom.json
exit
apiclient set host-containers.admin.enabled=false
Talos. Download talos-amd64.spdx.json or talos-arm64.spdx.json from the GitHub release, or read SBOMs from a running node. Core OS SBOMs live in /usr/share/spdx, extension SBOMs in /usr/local/share/spdx, and both are exposed as resources:
talosctl --nodes 10.20.30.40 get sboms
talosctl --nodes 10.20.30.40 get sbom kernel -o yaml
The kernel entry includes a CPE string, which makes matching against vulnerability data straightforward. You can feed either SPDX file to an SBOM aware vulnerability scanner, including safeguard scan --sbom <file>. Talos notes that its VEX file, used to filter findings that do not apply, is available to enterprise customers.
Where Safeguard fits, honestly
Safeguard does not patch, sign or manage Bottlerocket or Talos hosts, and it does not replace either project's update system. Kernel, containerd and runc fixes for these hosts only arrive in a new OS release, so the job is to roll out the new image. What Safeguard can do is read the SBOM files both projects publish, match their components against vulnerability data next to your application SBOMs, and track which clusters still run an image version with a known issue. Policies and gates can then flag a version that should not be deployed. The larger share of risk on these hosts sits in the container images you schedule onto them, and that is where Safeguard's scanning of repositories and images, reachability analysis and remediation pull requests apply directly.
Common mistakes
- Pinning an old variant past Kubernetes support. A Bottlerocket node on
aws-k8s-1.30kept running after v1.64.0 removed that variant, but it receives no new images. Check the README's supported list each quarter and plan replacement nodes before the EKS end of support date. - Leaving the admin container on permanently. It is superpowered, runs SSH and gets an unrestricted SELinux label. Enable it on demand and turn it off again; set
enabled = falseexplicitly in user data so a template change cannot flip it. - Disabling the control container without another way in. The guidance warns this "could leave you with no way to access the API." Replace it with your own control container rather than removing access entirely.
- Skipping Talos minor versions. Config migrations are tested only between adjacent minors. Jumping from 1.12 straight to 1.14 skips the 1.13 migration path.
- Upgrading Talos without the schematic. Upgrading with the vanilla installer on a node that needs GPU drivers or microcode removes those extensions. Record the schematic ID next to each node pool.
- Upgrading Kubernetes before the OS supports it. Talos 1.13 supports Kubernetes up to 1.36. Move the OS to 1.14 before you run
upgrade-k8s --to 1.37.x. - Treating dm-verity as complete on BIOS boot. Without Secure Boot, an attacker with the disk can rewrite both data and verity metadata. Prefer UEFI instance types and enable Secure Boot in firmware on metal.
- Choosing the weakest Talos encryption key.
staticandnodeIDkeys protect little against someone with the machine. Usetpmwith SecureBoot, orkms.
FAQ
What is the latest version of Bottlerocket?
As of 24 October 2026, the Bottlerocket CHANGELOG lists v1.68.0, dated 22 October 2026, and the most recent GitHub release when checked was v1.67.0. Run apiclient update check on a node to see what its update repository offers, because waves can delay a release for some hosts.
What is the latest version of Talos Linux?
Talos v1.14.4 was tagged on 16 October 2026, and v1.13.12 on 21 October 2026 for the previous line. Talos 1.15 is in alpha (v1.15.0-alpha.1, 13 October 2026), and the support matrix estimates the 1.15.0 release for 27 December 2026.
How long is a Bottlerocket variant supported?
Kubernetes variants get updates for approximately 14 months after the first release of each variant, and aws-k8s-* variants follow the EKS policy, which adds 12 months of extended support after 14 months of standard support. ECS variants get at least one year.
How long is a Talos Linux version supported?
Community support for a minor version ends when the next minor version is released, so about four months. Sidero Labs offers enterprise support for longer. Patch releases have continued on older lines after a new minor in practice, but the published policy is the next minor.
How do I upgrade Kubernetes on Bottlerocket?
Kubernetes is part of the variant name, so moving from 1.36 to 1.37 is a migration to aws-k8s-1.37, not an in place update. Upgrade the control plane, then replace nodes with the new variant through your node group, eksctl or launch templates.
How do I upgrade Kubernetes on Talos?
Run talosctl upgrade-k8s --to <version> against a control plane node after confirming your Talos version supports that Kubernetes version. Use --dry-run first. OS upgrades never change the Kubernetes version on their own.
Do Bottlerocket and Talos publish SBOMs?
Yes. Bottlerocket images from v1.53.0 contain SPDX 2.3 and CycloneDX 1.6 SBOMs under /usr/share/bottlerocket/. Talos publishes SPDX SBOMs per architecture on each GitHub release and exposes them on a node with talosctl get sboms.
Is SELinux enforcing on Talos like on Bottlerocket?
No. Bottlerocket has run SELinux in enforcing mode since 0.3.0 with no way to turn it off. Talos added SELinux in 1.10 and ships it in permissive mode by default, because some CNI, CSI and extension combinations are not yet compatible; enforcing mode has been tested with the default Flannel CNI.
Rebuilding a container host fleet does not end supply chain exposure: every image you schedule onto those nodes pulls its own libraries, base layers and language packages, and the host OS itself is assembled from open source components that need version tracking. The honest limit is that fixes for Bottlerocket and Talos themselves come from their maintainers, so what follows applies to the software you build and run on top of them.
Fix it without waiting for upstream
Whatever the vulnerability, most of the risk sits in two gaps. The first is the time between a fix being published and that fix actually running in your production builds. The second, and worse, is the time before any fix exists at all, while a maintainer works out a patch and a release schedule. Waiting through both gaps is a habit, not a requirement. Safeguard gives teams three ways to close them.
1. Autonomous remediation: pull requests, not tickets
When a fixed version exists, Safeguard's Griffin models open a tested, policy gated pull request that moves the affected dependency to the safe version. You can run it on one repository or in bulk across every project that carries the vulnerable version. Remediation covers eight categories, including dependencies, licenses, security posture and findings. Reachability analysis ranks the vulnerable code paths your application actually calls first, so the first pull requests you merge are the ones that matter most. Autonomous remediation ships switched off, with every category set to Manual, so your team decides how much runs on its own and what still needs a human approval.
2. Gold Open Source: the safe version in seconds, free
gold.safeguard.sh is free and needs no login. Search any CVE or package to see affected and fixed versions, CVSS, EPSS, CISA KEV status and a recommended safe version, or use the "Am I affected?" checker. The same data is available through a free read API, README status badges and RSS threat feeds. The safeguard-sh/gold-scan-action GitHub Action can fail a build on a known exploited vulnerability, on any known vulnerability, or never, so a version you have just removed cannot quietly come back in next week's merge.
3. Gold Registry: start from components that are already fixed
registry.safeguard.sh provides hardened, drop in replacements for upstream packages and container images. Every Gold artifact is held continuously to zero exploitable critical or high CVEs, zero malware and a completed license check, with SLSA L3 or higher provenance, a Sigstore signature and a public evidence page you can hand to an auditor. An artifact loses its Gold badge if it regresses. Teams can point their own package directory at the registry so hardened equivalents resolve without changing how developers install anything.
When upstream has no fix yet, or will not ship one, Safeguard first works to get the fix accepted upstream. If the issue is severe or upstream will not move, Safeguard builds a fork, fixes the vulnerability there and publishes a hardened Gold build, so you are not stuck on a maintainer's release schedule. You can also request a hardened, compatibility tested build of a specific package. This fork and patch flow is in early access today, so ask which packages it covers before you plan around it.
| Your situation | What to use |
|---|---|
| A fixed version exists | Autonomous remediation opens the upgrade pull request; Gold Open Source confirms the safe version |
| You need to know today whether you are affected | Gold Open Source lookup and "Am I affected?" checker, free and without login |
| You want vulnerable versions to stop shipping | The Gold scan GitHub Action in CI, plus Safeguard policies and gates |
| Upstream has no fix yet, or will not ship one | A custom Gold request; fork and patch (early access) |
| You want to start clean on new projects | Pull hardened components and images from Gold Registry |
One honest limit: when the vulnerable code lives in a vendor appliance, a hosted service or an operating system runtime you do not build yourself, the fix still has to come from that vendor or distribution. The steps above apply to the open source dependencies and container images you build and ship, which is where most teams carry the largest and least tracked share of their exposure.
See how Safeguard would help
The first demo is a real CLI session. Safeguard is installed, safeguard opens the interactive terminal, and you ask it to "fix the lodash CVE in this repo." It reads the finding and advisory, asks before each command, edits package.json to lodash 4.17.21, runs npm install and npm test with your approval, prints a summary and pushes nothing. The same flow applies to the services you package as containers and schedule onto Bottlerocket or Talos nodes.
Click through it at your own pace, or open it full screen.
The second demo sets up the Safeguard runner on your own machine, approves it with its device code and then scans from the terminal. A build or operations host that already downloads Talos release SBOMs or holds a Bottlerocket SBOM pulled from a canary node is a natural place to run those scans next to your image scans.
Click through it at your own pace, or open it full screen.
The third demo connects Claude to the Safeguard MCP server with OAuth and chooses which tools Claude can use. For a platform team, that lets an assistant answer questions about your Safeguard data, such as which projects carry a given component version, only through the tools you allow.
Click through it at your own pace, or open it full screen.
To try it on your own repositories and images, download Safeguard and follow the CLI documentation.
Quick check
An EKS node reports Bottlerocket on the aws-k8s-1.36 variant, and you want Kubernetes 1.37. Can apiclient update apply get you there?
No. The Kubernetes version is part of the variant, and in place updates never cross variants. You upgrade the control plane, then replace the node with one running an aws-k8s-1.37 image.
A Talos node on 1.12 needs to reach 1.14.4 and carries the NVIDIA extension. What is the documented upgrade path?
Upgrade to the latest 1.13 patch first, then to v1.14.4, one node at a time, using an Image Factory installer built from the same schematic ID so the extension is kept. Upgrade Kubernetes afterwards with talosctl upgrade-k8s if you need a newer version.
Sources
- Bottlerocket repository README
- Bottlerocket CHANGELOG
- Bottlerocket releases
- Bottlerocket Security Features
- Bottlerocket Security Guidance
- Bottlerocket security advisories
- Bottlerocket update infrastructure (core kit updater README)
- Bottlerocket apiclient README
- Bottlerocket update operator (Brupop) README
- Bottlerocket docs, Updates overview
- Bottlerocket docs, Variants
- Bottlerocket docs, Guidelines for updating in place
- Bottlerocket docs, Locking to a specific release
- Bottlerocket docs, Chain of trust
- Bottlerocket docs, Reporting
- AWS Containers blog, Bottlerocket: a special-purpose container operating system (30 March 2020)
- AWS Open Source blog, General availability of Bottlerocket (31 August 2020)
- Amazon EKS user guide, Kubernetes version lifecycle
- Talos Linux repository
- Talos Linux releases
- Talos v1.14.4 release
- Talos v1.0.0 release
- Talos security advisories
- Talos docs, What is Talos Linux?
- Talos docs, Philosophy
- Talos docs, Support matrix
- Talos docs, What's new in Talos 1.14.0
- Talos docs, Upgrading Talos Linux
- Talos docs, Upgrading Kubernetes
- Talos docs, Image Factory
- Talos docs, System extensions
- Talos docs, SecureBoot
- Talos docs, Disk encryption
- Talos docs, SELinux
- Talos docs, Default hardening and CIS compliance
- Talos docs, Source Talos images
- Talos docs, SBOMs
- Talos docs, Subscribe to security advisories
- Talos docs, talosctl
- Talos docs, Debug shell
- Omni docs, Talos version support policy
- Kubernetes, Releases
- The Update Framework
- Kernel Self Protection Project
- Flatcar, Releases
- Flatcar docs, Supply chain security mechanisms
- Fedora CoreOS design document
Last reviewed: 24 October 2026.