# Upgrading Linux nodes

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->

This page explains how to upgrade a Linux Worker Nodes created with kubeadm.

## Before you begin

<p>You need to have shell access to all the nodes, and the kubectl command-line tool must
be configured to communicate with your cluster. It is recommended to run this tutorial
on a cluster with at least two nodes that are not acting as control plane hosts.</p>
 
  <p>To check the version, enter  <code>kubectl version</code>.</p>

* Familiarize yourself with [the process for upgrading the rest of your kubeadm
cluster](/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade). You will want to
upgrade the control plane nodes before upgrading your Linux Worker nodes.

<!-- steps -->

## Changing the package repository

If you're using the community-owned package repositories (`pkgs.k8s.io`), you need to 
enable the package repository for the desired Kubernetes minor release. This is explained in
[Changing the Kubernetes package repository](/docs/tasks/administer-cluster/kubeadm/change-package-repository/)
document.

<div class="alert alert-secondary callout note" role="note">
  <strong>Note:</strong> The legacy package repositories (<code>apt.kubernetes.io</code> and <code>yum.kubernetes.io</code>) have been
<a href="/blog/2023/08/31/legacy-package-repository-deprecation/">deprecated and frozen starting from September 13, 2023</a>.
<strong>Using the <a href="/blog/2023/08/15/pkgs-k8s-io-introduction/">new package repositories hosted at <code>pkgs.k8s.io</code></a>
is strongly recommended and required in order to install Kubernetes versions released after September 13, 2023.</strong>
The deprecated legacy repositories, and their contents, might be removed at any time in the future and without
a further notice period. The new package repositories provide downloads for Kubernetes versions starting with v1.24.0.
</div>


## Upgrading worker nodes

### Upgrade kubeadm

Upgrade kubeadm:

<ul class="nav nav-tabs" id="tabs-k8s-install-kubeadm-worker-nodes" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-k8s-install-kubeadm-worker-nodes-0" role="tab" aria-controls="tabs-k8s-install-kubeadm-worker-nodes-0" aria-selected="true">Ubuntu, Debian or HypriotOS</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-k8s-install-kubeadm-worker-nodes-1" role="tab" aria-controls="tabs-k8s-install-kubeadm-worker-nodes-1">CentOS, RHEL or Fedora</a></li></ul>

<div class="tab-content" id="tabs-k8s-install-kubeadm-worker-nodes-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-k8s-install-kubeadm-worker-nodes-0" role="tabpanel" aria-labelledby="tabs-k8s-install-kubeadm-worker-nodes-0-tab" tabindex="k8s-install-kubeadm-worker-nodes"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># replace x in 1.36.x-* with the latest patch version</span>
</span></span><span class="line"><span class="cl">sudo apt-mark unhold kubeadm <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo apt-get update <span class="o">&amp;&amp;</span> sudo apt-get install -y <span class="nv">kubeadm</span><span class="o">=</span><span class="s1">&#39;1.36.x-*&#39;</span> <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo apt-mark hold kubeadm
</span></span></code></pre></div></div><div class="tab-body tab-pane fade"
        id="tabs-k8s-install-kubeadm-worker-nodes-1" role="tabpanel" aria-labelledby="tabs-k8s-install-kubeadm-worker-nodes-1-tab" tabindex="k8s-install-kubeadm-worker-nodes"><p>For systems with DNF:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># replace x in 1.36.x-* with the latest patch version</span>
</span></span><span class="line"><span class="cl">sudo yum install -y kubeadm-<span class="s1">&#39;1.36.x-*&#39;</span> --disableexcludes<span class="o">=</span>kubernetes
</span></span></code></pre></div><p>For systems with DNF5:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># replace x in 1.36.x-* with the latest patch version</span>
</span></span><span class="line"><span class="cl">sudo yum install -y kubeadm-<span class="s1">&#39;1.36.x-*&#39;</span> --setopt<span class="o">=</span><span class="nv">disable_excludes</span><span class="o">=</span>kubernetes
</span></span></code></pre></div></div></div>


### Call "kubeadm upgrade"

For worker nodes this upgrades the local kubelet configuration:

```shell
sudo kubeadm upgrade node
```

### Drain the node

Prepare the node for maintenance by marking it unschedulable and evicting the workloads:

```shell
# execute this command on a control plane node
# replace <node-to-drain> with the name of your node you are draining
kubectl drain <node-to-drain> --ignore-daemonsets
```

### Upgrade kubelet and kubectl

1. Upgrade the kubelet and kubectl:

   <ul class="nav nav-tabs" id="tabs-k8s-kubelet-and-kubectl" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-k8s-kubelet-and-kubectl-0" role="tab" aria-controls="tabs-k8s-kubelet-and-kubectl-0" aria-selected="true">Ubuntu, Debian or HypriotOS</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-k8s-kubelet-and-kubectl-1" role="tab" aria-controls="tabs-k8s-kubelet-and-kubectl-1">CentOS, RHEL or Fedora</a></li></ul>

<div class="tab-content" id="tabs-k8s-kubelet-and-kubectl-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-k8s-kubelet-and-kubectl-0" role="tabpanel" aria-labelledby="tabs-k8s-kubelet-and-kubectl-0-tab" tabindex="k8s-kubelet-and-kubectl"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># replace x in 1.36.x-* with the latest patch version</span>
</span></span><span class="line"><span class="cl">sudo apt-mark unhold kubelet kubectl <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo apt-get update <span class="o">&amp;&amp;</span> sudo apt-get install -y <span class="nv">kubelet</span><span class="o">=</span><span class="s1">&#39;1.36.x-*&#39;</span> <span class="nv">kubectl</span><span class="o">=</span><span class="s1">&#39;1.36.x-*&#39;</span> <span class="o">&amp;&amp;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">sudo apt-mark hold kubelet kubectl
</span></span></code></pre></div></div><div class="tab-body tab-pane fade"
        id="tabs-k8s-kubelet-and-kubectl-1" role="tabpanel" aria-labelledby="tabs-k8s-kubelet-and-kubectl-1-tab" tabindex="k8s-kubelet-and-kubectl"><p>For systems with DNF:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># replace x in 1.36.x-* with the latest patch version</span>
</span></span><span class="line"><span class="cl">sudo yum install -y kubelet-<span class="s1">&#39;1.36.x-*&#39;</span> kubectl-<span class="s1">&#39;1.36.x-*&#39;</span> --disableexcludes<span class="o">=</span>kubernetes
</span></span></code></pre></div><p>For systems with DNF5:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="c1"># replace x in 1.36.x-* with the latest patch version</span>
</span></span><span class="line"><span class="cl">sudo yum install -y kubelet-<span class="s1">&#39;1.36.x-*&#39;</span> kubectl-<span class="s1">&#39;1.36.x-*&#39;</span> --setopt<span class="o">=</span><span class="nv">disable_excludes</span><span class="o">=</span>kubernetes
</span></span></code></pre></div></div></div>


1. Restart the kubelet:

   ```shell
   sudo systemctl daemon-reload
   sudo systemctl restart kubelet
   ```

### Uncordon the node

Bring the node back online by marking it schedulable:

```shell
# execute this command on a control plane node
# replace <node-to-uncordon> with the name of your node
kubectl uncordon <node-to-uncordon>
```

## What's next

* See how to [Upgrade Windows nodes](/docs/tasks/administer-cluster/kubeadm/upgrading-windows-nodes/).
