Highlights
- Kubernetes 1.36 is the default minor version
- Ansible environment moves to Ansible 12 / ansible-core 2.19, with breaking changes to conditionals and templating. See Urgent Upgrade Notes before upgrading.
- New operating system support includes Ubuntu 26.04, openSUSE Leap 16.0, and openSUSE MicroOS with containerd.
Urgent Upgrade Notes
(No, really, you MUST read this before you upgrade)
- Ansible environment (action required): Kubespray now requires
ansible-core >=2.19.0,<2.20.0and ships with Ansible 12. Before running playbooks, recreate or update the virtual environment on the Ansible control host using this release'srequirements.txt. Ansible 2.19 requires conditional expressions to return booleans;-e key=valuesupplies strings. Pass boolean overrides as JSON (for example,-e '{"drain_nodes": true, "drain_fallback_enabled": true}') or use unquoted booleans in YAML inventory or extra-vars files (-e @vars.yml). Review custom Jinja templates in inventories and integrated playbooks for compatibility with the templating changes described in the Ansible 12 porting guide. The documentation examples have been updated accordingly. (#13468, @VannTen; #13526, @shashankvarma499) - Node Feature Discovery (action required): The default version is now 0.19.0. Remove
node_feature_discovery_enable_nodefeature_api,node_feature_discovery_master_crd_controller, andnode_feature_discovery_master_instancefrom inventory overrides. gRPC mode and executable hooks undersource.dare no longer supported. Custom NodeFeatureRule templates must no longer useenv,expandenv, orgetHostByName; review and migrate affected configurations before upgrading. (#13512, @vashian) - Pinned Helm versions (action required): Helm now defaults to 3.22.0. Checksums for Helm 3.16.x, 3.17.x, and 3.18.x have been removed. If inventory overrides pin
helm_versionto one of these versions, remove the override to use the default or select an available version from the retained 3.20.x, 3.21.x, or 3.22.x series. (#13535, @guoard) - Cilium Gateway API: Gateway API CRDs now default to 1.6.2, meeting Cilium 1.20's minimum requirement of Gateway API 1.6.1. If you enable Cilium's Gateway API support and pin
gateway_api_versionbelow 1.6.1, update or remove that override before upgrading. Gateway API 1.6.0 and 1.6.1 checksums are also available, but 1.6.0 does not meet Cilium 1.20's Gateway API requirement. (#13534, @yankay) - etcd metrics discovery: The
etcd-metricsService now uses EndpointSlice instead of Endpoints to avoid duplicate metrics. If you use this Service, update scrapers that still discover Endpoints. With Prometheus Operator, setspec.serviceDiscoveryRole: EndpointSliceon the relevant ServiceMonitor or Prometheus resource, and grant Prometheus permission to get, list, and watchendpointslicesin thediscovery.k8s.ioAPI group. Verify etcd scrape targets after upgrading. (#12846, @jmeza-xyz) - Debian 11 and macvlan: Debian 11 (Bullseye) is no longer supported; migrate to a supported operating system before upgrading. macvlan support on Debian has also been removed because it was not functional on Debian 12 or 13. macvlan is no longer tested in CI. (#13483, @VannTen)
- Debian 13 with Docker: This combination is no longer supported or tested because Debian 13 removed
apt-key, which the Docker repository setup still requires. Use containerd on Debian 13, or remain on an operating system supported by the Docker role. (#13499, @VannTen) - Local volume provisioner: Entries in
local_volume_provisioner_storage_classesnow use the upstreamstorageClassMapcamelCase keys. Update inventory overrides:host_dir->hostDir,mount_dir->mountDir,volume_mode->volumeMode,fs_type->fsType, andblock_cleaner_command->blockCleanerCommand. (#13504, @VannTen) - Cilium image overrides: Rename
cilium_hubble_certgen_image_{repo,tag}tocilium_certgen_image_{repo,tag}andcilium_hubble_envoy_image_{repo,tag}tocilium_envoy_image_{repo,tag}in inventory overrides. (#13260, @guoard) - Control-plane eviction thresholds:
eviction_hard_control_planehas been removed. Configureeviction_hardundergroup_vars/kube_control_plane/instead. (#13400, @tophac)
Changes by Kind
Feature
- Add
additional_sysctl_minto raise sysctl values only when they are below a configured minimum. Expand the default minimums for common networking and container-density settings.additional_sysctlretains its exact-value behavior. (#13224, @yankay) - Add
kubeadm_backup_retention_countto clean up old kubeadm backups and temporary upgrade files under/etc/kubernetes/tmp/. The default,-1, disables cleanup;0removes all matching files and directories, and positive values retain that many recent entries of each type. (#13415, @wangsifei99) - Add
openeuler_repo_baseurlto select an alternative openEuler package mirror. (#13134, @yankay) - Add an opt-in admission readiness check before kubeadm upgrades with
kubeadm_upgrade_preflight_check_enabled(default:false). Configure retries and delay withkubeadm_upgrade_preflight_check_retriesandkubeadm_upgrade_preflight_check_delay. A failed check warns but does not block the upgrade. (#13140, @felipe88alves) - Add authentication for custom CNI Helm repositories with
custom_cni_chart_repository_usernameandcustom_cni_chart_repository_password. (#13294, @A-Soltani255) - Add openSUSE Leap 16.0 support and representative KubeVirt CI coverage. (#13473, @NikKumar811)
- Add openSUSE MicroOS support for containerd-based clusters, including transactional package installation and reboot handling. Docker and CRI-O are not supported on MicroOS. (#13449, @yankay)
- Add optional apt package cache cleanup during system upgrades with
system_upgrade_autoclean: trueon Debian-based systems. (#13327, @Jeroen0494) - Add optional Prometheus metrics for the kube-vip static pod with
kube_vip_metrics_enabledandkube_vip_metrics_port. (#13229, @isumitsolanki) - Add Terraform provisioning for OpenNebula 7.2+ in
contrib/terraform/opennebula, including automatic Ansible inventory generation. (#13390, @razvan01) - Add Ubuntu 26.04 support. (#13443, @yankay)
- Enable Flannel's nftables backend for Flannel 0.25.5 or newer when
kube_proxy_mode: nftables. Thenftutility must be installed on the nodes. (#13291, @rtsui-harmonicinc) - Make controller-manager node CIDR allocation configurable with
kube_controller_manager_allocate_node_cidrs. (#13239, @modzilla99) - Make Kubernetes 1.36 the default minor version. See Component Versions below for the selected patch version. (#13219, @tmurakam)
- Update Cilium to 1.20.2. (#13515, @guoard)
- Update DNS autoscaler (cluster-proportional-autoscaler) to 1.10.3. (#13529, @vashian)
- Update nerdctl to 2.3.5. (#13437, @sandaruwijewardhana)
- Update the default Flannel version to 0.28.9. (#13436, @dhakshin-raghav)
- Use CRI-O 1.36 by default with Kubernetes 1.36. See Component Versions below for the selected patch version. (#13244, @tmurakam)
Bug or Regression
- Add missing RBAC permissions for calico-kube-controllers when using the Kubernetes datastore. (#13375, @taiko19xx)
- Advertise IPv4 as well as IPv6 service cluster IPs through Calico BGP when
calico_advertise_cluster_ips: true. (#13503, @VannTen) - Allow facts to be gathered and cached for reachable hosts when another inventory host is unreachable. (#13438, @suii2210)
- Apply
cilium_agent_scrape_port,cilium_operator_scrape_port, andcilium_hubble_scrape_portto the Cilium Helm values so these settings take effect. (#13370, @somaz94) - Create
/opt/cni/binwith root ownership to fix Cilium 1.19.x CNI installation failures. Reject Cilium configurations with a non-rootkube_ownerduring preflight validation. (#13385, @emma034186-stack) - Custom CNI static manifests can set
custom_cni_namespaceto an empty value to apply resources across multiple namespaces. The default remainskube-system. (#13091, @yankay) - Disable
ExtendWebSocketsToKubeletwhencontainer_manager: dockeris used with Kubernetes 1.36 or newer, because cri-dockerd does not support WebSocket streaming. (#13361, @tico88612) - Disable controller-manager node CIDR allocation when using Cilium cluster-pool IPAM. (#13148, @guoard)
- Ensure the netaddr prerequisite check always evaluates to a boolean. (#13304, @wt)
- Fix
k8s-certs-renewfailing whensuper-admin.confis missing. (#13414, @guoard) - Fix
k8s-certs-renewrenewing all control plane certificates on every timer run instead of only when they are close to expiry. (#13413, @guoard) - Fix Argo CD installation failures during password hashing. (#12920, @kwx4957)
- Fix Calico IPv6-only deployments by disabling the IPv4 pool and IPv4 address assignment when IPv4 is disabled. (#13225, @AbhiiTen)
- Fix Cilium startup when
cilium_tunnel_mode: disabledby selecting native routing instead of passing an invalid tunnel protocol. (#13427, @mehrdadbn9) - Fix cluster setup in environments that require an HTTP proxy for external connectivity. (#13234, @modzilla99)
- Fix false image-download failures when using nerdctl with
download_run_once. (#12321, @AMacedoP) - Fix inverted error handling for etcd-events startup: healthy scale-outs no longer fail spuriously, and unhealthy clusters no longer have startup errors silently ignored. (#13343, @AdeshDeshmukh)
- Fix kubeadm operations when the API server advertise address cannot be derived from the default gateway. (#13156, @clwluvw)
- Fix non-boolean host-group conditions that prevent etcd and control-plane recovery from running with ansible-core 2.19. (#13541, @yankay)
- Fix retries after a failed control-plane join by resetting the partial kubeadm state and handling leftover manifest and kubelet-port checks. Skip the post-join Ready wait when
kube_network_pluginiscniornone, where CNI is installed separately. (#13280, @Ujstor) - Fix sample inventory resource reservations by moving
group_vars/k8s_cluster/kube_control_plane.ymltogroup_vars/kube_control_plane.yml, so the higher reservations apply only to control-plane nodes rather than all cluster nodes. (#13518, @GmrezaH) - Fix skipped Calico IPv6 pool validation and prevent IPv6 pool discovery from overwriting the IPv4 pool fact on dual-stack clusters. (#13450, @mehrdadbn9)
- Honor
dns_autoscaler_deployment_nodeselectorin the CoreDNS autoscaler deployment. (#13290, @Kibakus) - Offline containerd download URLs in the sample inventory now automatically use the correct binary release variant based on
containerd_static_binary. (#13293, @EryX0) - Preserve the original YAML indentation when updating the server field in
kubelet.conf, preventing invalid kubeconfigs after endpoint changes. (#13284, @longxiucai) - Reject incompatible combinations of Cilium <1.20, Gateway API >=1.5.0 standard-channel CRDs, and
cilium_gateway_api_enabled: truebefore Cilium fails to start. For older Cilium versions, usegateway_api_version: "1.4.1"orgateway_api_channel: "experimental". (#13223, @yankay) - Remove redundant CNI role dependencies for Flannel, kube-router, macvlan, and Multus, fixing remove-node.yml failures caused by missing cached CNI plugin archives. (#12766, @11qeq11)
- Remove the unnecessary BPF filesystem entry from
/etc/fstabwhen using Cilium. (#13377, @wangsifei99) - Restore configurable fatal-error handling with
kubespray_any_errors_fatal. Use-e '{"kubespray_any_errors_fatal": false}'to override the default; the old name,any_errors_fatal, conflicted with a reserved Ansible play keyword. (#13488, @gengwg) - Set numeric priority for static pods instead of
priorityClassNameso kubelet assigns the intended priority. (#13490, @jskrill) - Skip kube-proxy-only kernel modules, package selection, and IPVS/nftables checks when
kube_proxy_remove: true. The default remainsfalse. (#13228, @isumitsolanki) - Stop deleting the cert-manager namespace on upgrade runs, preserving user-managed resources such as Issuer secrets. (#13493, @longxiucai)
- Support Kata Containers
.zstrelease artifacts and update the default version. (#13389, @ChillRedChilli) - Update Local Path Provisioner to 0.0.37, including RBAC and helper-pod scheduling fixes. (#13525, @vashian)
- Use containerd config version 4 with containerd 2.3 and newer. (#13286, @longxiucai)
Other (Cleanup or Flake)
- Restore automated CI molecule tests for Kata Containers. (#13452, @ChillRedChilli)
- Standardize kubelet and CRI-O systemd unit file permissions to
0644. (#13408, @shaleenbathla) - Update KubeVirt CI to Fedora 43 and 44, replacing end-of-life Fedora 39 through 42 images. (#13206, @yankay; #13464, @Narwhal-fish)
Component Versions
- Ansible 12.3.0 (ansible-core
>=2.19.0,<2.20.0) - Kubernetes 1.36.4
- etcd 3.6.14
- Docker 28.3
- containerd 2.3.5
- CRI-O 1.36.5
- runc 1.4.3
- CNI plugins 1.9.1
- Calico 3.31.7
- Cilium 1.20.2
- Gateway API 1.6.2
- Flannel 0.28.9
- Kube-OVN 1.12.21
- Kube-router 2.1.1
- Multus 4.2.2
- kube-vip 1.0.3
- cert-manager 1.15.3
- CoreDNS 1.14.2
- DNS autoscaler 1.10.3
- Argo CD 2.14.5
- Helm 3.22.0
- MetalLB 0.13.9
- Registry 2.8.1
- nerdctl 2.3.5
- metrics-server 0.9.0
- Kata Containers 3.32.0
- AWS EBS CSI plugin 0.5.0
- Azure CSI plugin 1.10.0
- Cinder CSI plugin 1.30.0
- GCP PD CSI plugin 1.9.2
- Local Path Provisioner 0.0.37
- Local Volume Provisioner 2.5.0
- Node Feature Discovery 0.19.0
New Contributors
Welcome and thank you to all the first-time contributors to Kubespray!
@11qeq11 @A-Soltani255 @AbhiiTen @AdeshDeshmukh @AlexandrClick @arhuman @ChillRedChilli @Debasish-87 @dhakshin-raghav @emma034186-stack @EryX0 @gengwg @isumitsolanki @jskrill @jsuchome @Kibakus @kwx4957 @longxiucai @manzsolutions-aleski @mehrdadbn9 @modzilla99 @Narwhal-fish @NikKumar811 @razvan01 @rtsui-harmonicinc @sandaruwijewardhana @shashankvarma499 @somaz94 @stias @suii2210 @taiko19xx @tophac @vashian @wt @xoxonut @Zakharden
All Contributors
Thank you to everyone who contributed to this release!
@11qeq11 @A-Soltani255 @AbhiiTen @AdeshDeshmukh @AlexandrClick @AMacedoP @arhuman @ChillRedChilli @clwluvw @Debasish-87 @dhakshin-raghav @emma034186-stack @ErikJiang @EryX0 @felipe88alves @gengwg @GmrezaH @guoard @isumitsolanki @Jeroen0494 @jmeza-xyz @jskrill @jsuchome @Kibakus @kwx4957 @longxiucai @manzsolutions-aleski @MatthiasLohr @mehrdadbn9 @modzilla99 @Narwhal-fish @NikKumar811 @razvan01 @rptaylor @rtsui-harmonicinc @sandaruwijewardhana @shaleenbathla @shashankvarma499 @somaz94 @Srishti-j18 @stias @suii2210 @taiko19xx @tico88612 @tmurakam @tophac @Ujstor @VannTen @vashian @wangsifei99 @wt @xoxonut @yangminglintw @yankay @Zakharden