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

 

posted @ 2026-08-22 22:01  民工黑猫  阅读(5)  评论(0)    收藏  举报