Determine the type of upgrade: patch version (e.g., v1.12.0 → v1.12.7) or minor vertion (e.g., v1.12.7 → v1.13.0). Only upgrades between adjacent minor versions are supported.
Configure Kubernetes Package Repositories
If repositories are already configured, skip this step.
Debian/Ubuntu
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl
CentOS/RHEL/Fedora
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
yum install -y kubelet kubeadm kubectl
systemctl enable --now kubelet
To install specific versions:
# List available versions
yum --enablerepo=kubernetes list kubelet kubeadm kubectl --showduplicates | sort -r
# Install exact versions
yum --enablerepo=kubernetes install -y \
kubelet-1.13.0-0 \
kubeadm-1.13.0-0 \
kubectl-1.13.0-0
Verify Installed kubeadm Version
kubeadm version
Pre-pull Required Container Images
kubeadm config images list --kubernetes-version v1.13.0 > images.txt
while read -r image; do
docker pull "$image"
done < images.txt
Check Upgrade Feasibility and Available Versions
kubeadm upgrade plan
Apply Control Plane Upgrade
On the control plane node, execute:
kubeadm upgrade apply v1.13.0
Cordon and Drain the Control Plane Node
NODE=$(hostname)
kubectl drain "$NODE" --ignore-daemonsets --delete-emptydir-data
Restart kubelet on Control Plane
systemctl daemon-reload
systemctl restart kubelet
Upgrade Worker Nodes
For each worker node:
- Cordon and drain the node from the control plane:
NODENAME="worker-01"
kubectl cordon "$NODENAME"
kubectl drain "$NODENAME" --ignore-daemonsets --delete-emptydir-data
- On the worker node, after updating packages (as in Step 2), configure the node:
kubeadm upgrade node --kubelet-version v1.13.0
- Restart kubelet:
systemctl daemon-reload
systemctl restart kubelet
- Uncordon the node from the control plane:
kubectl uncordon "$NODENAME"