ubuntu26.04,使用kubeadm在线升级k8s,从v1.34.11升级到v1.35.8(NLB + 3 master + 2 worker节点)
ubuntu 26.04。
集群规划(5 节点)
master节点01,主机名:k8s-master-01,ip:172.21.64.36
master节点02,主机名:k8s-master-02,ip:172.21.64.37
master节点03,主机名:k8s-master-03,ip:172.21.64.38
工作节点01:主机名:k8s-worker-01,ip:172.21.64.39
工作节点02:主机名:k8s-worker-02,ip:172.21.64.40
| 机器名 | 内网 ip | 角色 |
| k8s-master-01 | 172.21.64.36 | master |
| k8s-master-02 | 172.21.64.37 | master |
| k8s-master-03 | 172.21.64.38 | master |
| k8s-worker-01 | 172.21.64.39 | worker |
| k8s-worker-02 | 172.21.64.40 | worker |
一,备份etcd(仅master-01节点执行)
1. 安装etcdctl
mkdir -p /data/etcd
cd /data/etcd wget https://github.com/etcd-io/etcd/releases/download/v3.6.5/etcd-v3.6.5-linux-amd64.tar.gz tar -zxvf etcd-v3.6.5-linux-amd64.tar.gz cp etcd-v3.6.5-linux-amd64/etcdctl /usr/local/bin/ chmod +x /usr/local/bin/etcdctl #校验版本,必须输出3.6.5 etcdctl version
2.导出etcd数据库
# 备份etcd快照,保存到本地,故障回滚使用
mkdir -p /data/k8s ETCDCTL_API=3 etcdctl snapshot save /data/k8s/etcd-snapshot-pre-upgrade-v1.34.11.db.$(date +%Y%m%d) \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key
3. 所有安装nerdctl(已经安装就跳过)
下载:https://github.com/containerd/nerdctl/releases/download/v2.3.4/nerdctl-2.3.4-linux-amd64.tar.gz
执行部署
curl https://github.com/containerd/nerdctl/releases/download/v2.3.4/nerdctl-2.3.4-linux-amd64.tar.gz
tar -zxvf nerdctl-2.3.4-linux-amd64.tar.gz
mv nerdctl /usr/local/bin/
chmod +x /usr/local/bin/nerdctl
# 同样配置默认命名空间
mkdir -p /etc/nerdctl
cat > /etc/nerdctl/nerdctl.toml <<EOF
namespace = "k8s.io"
address = "/run/containerd/containerd.sock"
cgroup_manager = "systemd"
EOF
二,更新kubernetes v1.35 apt源,(所有5节点)
1. 配置k8s v-1.35 apt源
#!/bin/bash set -euo pipefail
# ========== 配置项:k8s源分支只写小版本 v1.32 / v1.33 / v1.34 / v1.35 / v1.36 ========== k8s_apt_branch="v1.35" # 定义本地变量 local_arch=$(dpkg --print-architecture) local_ubuntu_codename=$(lsb_release -cs) local_k8s_apt_branch="${k8s_apt_branch}" ########################### # 1. 配置 K8s pkgs.k8s.io 源 ########################### rm -f /etc/apt/sources.list.d/kubernetes.list rm -f /etc/apt/trusted.gpg.d/kubernetes-*.gpg curl -fsSL "https://pkgs.k8s.io/core:/stable:/${local_k8s_apt_branch}/deb/Release.key" | gpg --dearmor -o "/etc/apt/trusted.gpg.d/kubernetes-${local_k8s_apt_branch}.gpg" echo "deb [signed-by=/etc/apt/trusted.gpg.d/kubernetes-${local_k8s_apt_branch}.gpg] https://pkgs.k8s.io/core:/stable:/${local_k8s_apt_branch}/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list apt update # 锁定版本,防止自动升级 sudo apt-mark hold kubelet kubeadm kubectl echo -e "\n========== 可用 kubeadm 版本列表 ==========" apt-cache madison kubeadm
三,下载k8s v-1.35.8镜像,并且上传到所有节点
1. 下载kubeadm v1.35.8 二进制包,用于获取7个镜像版本(如果下载不了,这一步要在本机手工下载上传到master-01,命名为kubeadm-v1.35.8)
k8s_version="v1.35.8" mkdir -p /data/k8s/kubeadm-bin # 国内下载地址 # https://mirrors.aliyun.com/kubernetes-release/release/${k8s_version}/bin/linux/amd64/kubeadm # 官方下载地址 curl -o /data/k8s/kubeadm-bin/kubeadm-${k8s_version} https://dl.k8s.io/release/${k8s_version}/bin/linux/amd64/kubeadm chmod +x /data/k8s/kubeadm-bin/kubeadm-${k8s_version}
如果在线下载太慢,可以从本地手工下载kubeadm v1.35.8,然后拷贝到master-01
scp D:\softs\kubeadm二进制\kubeadm-v1.35.8 root@8.133.244.241:/data/k8s/kubeadm-bin
2. 通过daocloud代理下载v1.35.8镜像
#!/bin/bash set -euo pipefail # 从kubeadm里自动获取k8s版本(v1.35.8) k8s_version="v1.35.8" # 定义文件名变量 img_list_file="k8s-images-${k8s_version}.list" img_tar_file="k8s-images-${k8s_version}.tar" # 基础目录 mkdir -p /data/k8s/k8s-${k8s_version} cd /data/k8s/k8s-${k8s_version} # 获取kubeadm需要全部镜像列表 chmod +x /data/k8s/kubeadm-bin/kubeadm-${k8s_version} /data/k8s/kubeadm-bin/kubeadm-${k8s_version} config images list --kubernetes-version "${k8s_version}" > "${img_list_file}" cat "${img_list_file}" # DaoCloud镜像加速预下载镜像:m.daocloud.io/ while read -r img; do ctr -n k8s.io images pull --platform linux/amd64 "m.daocloud.io/${img}" done < "${img_list_file}" # 重标签为原生镜像,删除daocloud前缀镜像 while read -r img; do ctr -n k8s.io images tag "m.daocloud.io/${img}" "${img}" ctr -n k8s.io images rm "m.daocloud.io/${img}" done < "${img_list_file}" # ctr导出tar镜像包,过滤空行,防止导出异常 ctr -n k8s.io images export "${img_tar_file}" $(grep -v '^$' "${img_list_file}") ls -lh "${img_tar_file}"
3. 把v1.35.8镜像批量上传到其它四个节点,并且导入镜像
#!/bin/bash
set -euo pipefail
# 从kubeadm里自动获取k8s版本(v1.34.11)
k8s_version=$(kubeadm version -o short)
img_tar="/data/k8s/k8s-${k8s_version}/k8s-images-${k8s_version}.tar"
remote_dir="/data/k8s/k8s-${k8s_version}"
remote_tar="${remote_dir}/k8s-images-${k8s_version}.tar"
# 节点IP列表
node_list=(
172.21.64.37
172.21.64.38
172.21.64.39
172.21.64.40
)
# 循环分发+远程导入镜像
for node_ip in "${node_list[@]}"; do
echo -e "\n===== 处理节点 ${node_ip} ====="
# 创建目录,删除旧tar包,避免残留损坏文件
ssh "root@${node_ip}" "mkdir -p ${remote_dir} && rm -f ${remote_tar}"
# scp拷贝镜像包到远程节点指定目录
scp "${img_tar}" "root@${node_ip}:${remote_tar}"
# ssh远程使用ctr导入到k8s.io命名空间
ssh "root@${node_ip}" "ctr -n k8s.io image import ${remote_tar}"
echo "节点 ${node_ip} 镜像导入完成,tar包保留:${remote_tar}"
done
echo -e "\n全部节点镜像分发导入完毕"
三,升级控制平面节点
步骤 1:master-01(第一个控制平面节点)
重要:只有第一个 master 执行 kubeadm upgrade apply,其余 master 执行kubeadm upgrade node
********** containerd可以不升级,根据k8s大版本的需要是来确定是否升级 **********
master-01 节点操作顺序:升级 kubeadm → kubeadm upgrade apply → 升级 containerd(可选) → 升级 kubelet → 重启 containerd、kubelet
#!/bin/bash set -euo pipefail #解除版本锁定 apt-mark unhold cloud-init containerd.io cri-tools intel-microcode kubeadm kubectl kubelet kubernetes-cni # 预检查(仅在master-01节点执行) kubeadm upgrade plan k8s_apt_version="1.35.8-1.1" k8s_version="v1.35.8" # ==========1.升级kubeadm,执行控制平面apply========== apt install -y kubeadm=${k8s_apt_version} kubeadm version kubeadm upgrade apply ${k8s_version} -y # ==========2.升级containerd(可选,根据k8s版本而定)========== # 备份原有配置 cp /etc/containerd/config.toml /etc/containerd/config.toml.bak.$(date +%Y%m%d) # 升级 containerd.io apt install -y containerd.io # ==========3.升级kubelet kubectl========== apt install -y kubelet=${k8s_apt_version} kubectl=${k8s_apt_version} cri-tools kubernetes-cni # ==========4.重载并重启服务========== systemctl daemon-reload systemctl restart containerd systemctl restart kubelet # 锁定版本自动更新 apt-mark hold cloud-init containerd.io cri-tools intel-microcode kubeadm kubectl kubelet kubernetes-cni # 验证 kubectl get nodes containerd --version kubelet --version
2. 其余 master 节点升级(master--2,master-03分别执行)
master-02 / master-03 节点操作顺序:升级 kubeadm → kubeadm upgrade node → 升级 containerd(可选) → 升级 kubelet → 重启 containerd、kubelet
#!/bin/bash set -euo pipefail #解除版本锁定 apt-mark unhold cloud-init containerd.io cri-tools intel-microcode kubeadm kubectl kubelet kubernetes-cni k8s_apt_version="1.35.8-1.1" # 升级kubeadm apt install -y kubeadm=${k8s_apt_version} kubeadm upgrade node # 升级containerd(可选,根据k8s版本而定) cp /etc/containerd/config.toml /etc/containerd/config.toml.bak.$(date +%Y%m%d) apt install -y containerd.io # 升级kubelet kubectl apt install -y kubelet=${k8s_apt_version} kubectl=${k8s_apt_version} cri-tools kubernetes-cni # 重启 systemctl daemon-reload systemctl restart containerd systemctl restart kubelet # 锁定版本自动更新 apt-mark hold cloud-init containerd.io cri-tools intel-microcode kubeadm kubectl kubelet kubernetes-cni
# 验证
kubectl get nodes
containerd --version
kubelet --version
3. 升级第一个工作节点 worker-01
worker 节点操作顺序:先驱逐节点 → 升级 kubeadm → kubeadm upgrade node → 升级 containerd(可选) → 升级 kubelet → 重启 containerd、kubelet → 取消驱逐
在任意master节点上驱逐
kubectl drain k8s-worker-01 --ignore-daemonsets
在worker-01节点上执行
#!/bin/bash set -euo pipefail #解除版本锁定 apt-mark unhold cloud-init containerd.io cri-tools intel-microcode kubeadm kubectl kubelet kubernetes-cni k8s_apt_version="1.35.8-1.1" apt install -y kubeadm=${k8s_apt_version} kubeadm upgrade node apt install -y containerd.io apt install -y kubelet=${k8s_apt_version} kubectl=${k8s_apt_version} cri-tools kubernetes-cni systemctl daemon-reload systemctl restart containerd systemctl restart kubelet # 锁定版本自动更新 apt-mark hold cloud-init containerd.io cri-tools intel-microcode kubeadm kubectl kubelet kubernetes-cni
在任意master节点上取消驱逐
kubectl uncordon k8s-worker-01
4. 升级第二个工作节点 worker-02
worker 节点操作顺序:先驱逐节点 → 升级 kubeadm → kubeadm upgrade node → 升级 containerd(可选) → 升级 kubelet → 重启 containerd、kubelet → 取消驱逐
在任意master节点上驱逐
kubectl drain k8s-worker-02 --ignore-daemonsets
在worker-02节点上执行
#!/bin/bash set -euo pipefail #解除版本锁定 apt-mark unhold cloud-init containerd.io cri-tools intel-microcode kubeadm kubectl kubelet kubernetes-cni k8s_apt_version="1.35.8-1.1" apt install -y kubeadm=${k8s_apt_version} kubeadm upgrade node apt install -y containerd.io apt install -y kubelet=${k8s_apt_version} kubectl=${k8s_apt_version} cri-tools kubernetes-cni systemctl daemon-reload systemctl restart containerd systemctl restart kubelet # 锁定版本自动更新 apt-mark hold cloud-init containerd.io cri-tools intel-microcode kubeadm kubectl kubelet kubernetes-cni
在任意master节点上取消驱逐
kubectl uncordon k8s-worker-02
5. 确认 Ready 后,对其它工作节点(worker-03 / worker-04 / worker-05)重复同样的操作
6. 升级完成后全集群校验 (任意master节点)
# 全部节点版本 v1.35.8, status Ready kubectl get nodes # 所有命名空间pod无异常 kubectl get pods -A # kube‑proxy、coredns全部运行新版本 kubectl get daemonset kube-proxy -n kube-system kubectl get deployment coredns -n kube-system # 检查控制平面endpoint kubectl get endpoints kubernetes
节点状态:
root@k8s-master-01:~# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master-01 Ready control-plane 10h v1.35.8 k8s-master-02 Ready control-plane 10h v1.35.8 k8s-master-03 Ready control-plane 10h v1.35.8 k8s-worker-01 Ready <none> 10h v1.35.8 k8s-worker-02 Ready <none> 10h v1.35.8
pod状态:
root@k8s-master-01:~# kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-kube-controllers-688bf7649b-plxw4 1/1 Running 4 (16m ago) 10h kube-system calico-node-4kcxh 1/1 Running 1 (3h58m ago) 10h kube-system calico-node-9qtf8 1/1 Running 1 (5h24m ago) 10h kube-system calico-node-t6sw4 1/1 Running 2 (5h27m ago) 10h kube-system calico-node-tldxh 1/1 Running 1 (3h57m ago) 10h kube-system calico-node-vm22h 1/1 Running 1 (3h58m ago) 10h kube-system coredns-7d764666f9-bljj9 1/1 Running 0 3m53s kube-system coredns-7d764666f9-ffbdn 1/1 Running 0 8m37s kube-system etcd-k8s-master-01 1/1 Running 2 (22m ago) 22m kube-system etcd-k8s-master-02 1/1 Running 1 (18m ago) 18m kube-system etcd-k8s-master-03 1/1 Running 2 13m kube-system kube-apiserver-k8s-master-01 1/1 Running 2 (22m ago) 22m kube-system kube-apiserver-k8s-master-02 1/1 Running 1 (18m ago) 18m kube-system kube-apiserver-k8s-master-03 1/1 Running 2 13m kube-system kube-controller-manager-k8s-master-01 1/1 Running 2 (22m ago) 22m kube-system kube-controller-manager-k8s-master-02 1/1 Running 2 18m kube-system kube-controller-manager-k8s-master-03 1/1 Running 2 13m kube-system kube-proxy-2gszx 1/1 Running 0 14m kube-system kube-proxy-k5nf9 1/1 Running 0 14m kube-system kube-proxy-lx8k6 1/1 Running 0 14m kube-system kube-proxy-tz9r7 1/1 Running 0 14m kube-system kube-proxy-xmwvc 1/1 Running 0 14m kube-system kube-scheduler-k8s-master-01 1/1 Running 2 (22m ago) 22m kube-system kube-scheduler-k8s-master-02 1/1 Running 1 (18m ago) 18m kube-system kube-scheduler-k8s-master-03 1/1 Running 2 13m

浙公网安备 33010602011771号