kubenetes集群版本升級方式
概述
搭建kubernetes集群的方式有很多種,比如二進(jìn)制,kubeadm,RKE(Rancher)等,k8s集群升級方式也各有千秋,本文主要介紹使用kubeadm方式搭建的k8s集群和二進(jìn)制搭建的集群升級方法。
Kubernetes 版本以 x.y.z 表示,其中 x 是主要版本, y 是次要版本,z 是補(bǔ)丁版本,遵循語義版本控制術(shù)語。升級版本時(shí)不建議跨多個(gè)次要版本升級,根據(jù)官方建議以跨1個(gè)次要版本升級或者跨多個(gè)補(bǔ)丁版本升級。例如:從1.20.1升級至1.20.15、從1.20.X升級1.21.X。
kubeadm方式升級
升級順序如下步驟:
- 升級kubeadm版本。
- 備份ETCD數(shù)據(jù)。
- 升級master節(jié)點(diǎn)各組件。
- 升級node節(jié)點(diǎn)組件。
- 升級完成集群驗(yàn)證
1.集群概況
節(jié)點(diǎn)名稱 | 節(jié)點(diǎn)IP | 版本 | 升級版本 | 備注 |
k8s-master | 192.168.60.20 | v1.24.17 | v1.25.14 | master節(jié)點(diǎn) |
k8s-node01 | 192.168.60.21 | v1.24.17 | v1.25.14 | node節(jié)點(diǎn) |
k8s-node02 | 192.168.60.20 | v1.24.17 | v1.25.14 | node節(jié)點(diǎn) |
2.升級kubeadm版本
查看當(dāng)前可升級的版本
yum list --showduplicates kubeadm --disableexcludes=kubernetes
查看當(dāng)前kubeadm版本
[root@k8s-master kafka]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.17", GitCommit:"22a9682c8fe855c321be75c5faacde343f909b04", GitTreeState:"clean", BuildDate:"2023-08-23T23:43:11Z", GoVersion:"go1.20.7", Compiler:"gc", Platform:"linux/amd64"}升級kubeadm版本
[root@k8s-master kafka]# yum install -y kubeadm-1.25.14-0 --disableexcludes=kubernetes
驗(yàn)證
[root@k8s-master kafka]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.14", GitCommit:"a5967a3c4d0f33469b7e7798c9ee548f71455222", GitTreeState:"clean", BuildDate:"2023-09-13T09:10:47Z", GoVersion:"go1.20.8", Compiler:"gc", Platform:"linux/amd64"}3.ETCD備份
etcdctl snapshot save etcd.db
4.升級master節(jié)點(diǎn)組件
4.1驗(yàn)證升級計(jì)劃,檢查當(dāng)前集群是否可被升級
[root@k8s-master kafka]# kubeadm upgrade plan
[upgrade/config] Making sure the configuration is correct:
[upgrade/config] Reading configuration from the cluster...
[upgrade/config] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[preflight] Running pre-flight checks.
[upgrade] Running cluster health checks
[upgrade] Fetching available versions to upgrade to
[upgrade/versions] Cluster version: v1.24.17
[upgrade/versions] kubeadm version: v1.25.14
I0907 01:19:06.634937 89546 version.go:256] remote version is much newer: v1.31.0; falling back to: stable-1.25
[upgrade/versions] Target version: v1.25.16
[upgrade/versions] Latest version in the v1.24 series: v1.24.17
Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
COMPONENT CURRENT TARGET
kubelet 3 x v1.24.17 v1.25.16
Upgrade to the latest stable version:
COMPONENT CURRENT TARGET
kube-apiserver v1.24.17 v1.25.16
kube-controller-manager v1.24.17 v1.25.16
kube-scheduler v1.24.17 v1.25.16
kube-proxy v1.24.17 v1.25.16
CoreDNS v1.8.6 v1.9.3
etcd 3.5.6-0 3.5.6-0
You can now apply the upgrade by executing the following command:
kubeadm upgrade apply v1.25.16
Note: Before you can perform this upgrade, you have to update kubeadm to v1.25.16.
_____________________________________________________________________
The table below shows the current state of component configs as understood by this version of kubeadm.
Configs that have a "yes" mark in the "MANUAL UPGRADE REQUIRED" column require manual config upgrade or
resetting to kubeadm defaults before a successful upgrade can be performed. The version to manually
upgrade to is denoted in the "PREFERRED VERSION" column.
API GROUP CURRENT VERSION PREFERRED VERSION MANUAL UPGRADE REQUIRED
kubeproxy.config.k8s.io v1alpha1 v1alpha1 no
kubelet.config.k8s.io v1beta1 v1beta1 no
_____________________________________________________________________根據(jù)以上結(jié)果可以看到最高可以升級到 v1.25.16 版本,我們需要升級到v1.25.14版本是允許的;只要可允許升級的最高版本高于你的目標(biāo)版本,就可以升級。
4.2將master節(jié)點(diǎn)升級到v1.25.14版本
注意:kubeadm upgrade命令也會(huì)自動(dòng)對kubeadm在節(jié)點(diǎn)上所管理的證書執(zhí)行續(xù)約操作。
如果需要略過證書續(xù)約操作,可以使用標(biāo)志--certificate-renewal=false。
# 將 master升級到目標(biāo)版本 kubeadm upgrade apply v1.25.14 #出現(xiàn)如下提示表示master節(jié)點(diǎn)升級完成了 [upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.25.14". Enjoy!
4.3升級kubectl和kubelet
1.將當(dāng)前節(jié)點(diǎn)標(biāo)記為不可調(diào)度,并驅(qū)逐節(jié)點(diǎn)上的Pod kubectl drain <節(jié)點(diǎn)名稱> --ignore-daemonsets ##說明: ## --ignore-daemonsets 無視DaemonSet管理下的Pod。即--ignore-daemonsets往往需要指定的,這是 #因?yàn)閐eamonset會(huì)忽略unschedulable標(biāo)簽(使用kubectl drain時(shí)會(huì)自動(dòng)給節(jié)點(diǎn)打上不可調(diào)度標(biāo)簽), #由于deamonset控制器控制的pod被刪除后可能馬上又在此節(jié)點(diǎn)上啟動(dòng)起來,這樣就會(huì)成為死循環(huán)。因此 #這里忽略daemonset 2.升級kubelet和kubectl組件 yum install -y kubelet-1.25.14-0 kubectl-1.25.14-0 --disableexcludes=kubernetes 3.重啟kubelet systemctl daemon-reload systemctl restart kubelet 4.恢復(fù)當(dāng)前節(jié)點(diǎn)上的Pod調(diào)度,使其上線 kubectl uncordon <節(jié)點(diǎn)名稱>
此時(shí)查看版本發(fā)現(xiàn)master節(jié)點(diǎn)的版本已經(jīng)升級成功了

5.升級node節(jié)點(diǎn)組件
工作節(jié)點(diǎn)上的升級過程應(yīng)該一次執(zhí)行一個(gè)節(jié)點(diǎn),或者一次執(zhí)行幾個(gè)節(jié)點(diǎn),以不影響運(yùn)行工作負(fù)載所需的最小容量。
# 升級kubeadm yum install -y kubeadm-1.25.14-0 --disableexcludes=kubernetes # 查看版本 kubeadm version # 設(shè)置節(jié)點(diǎn)不可調(diào)度并排空節(jié)點(diǎn)。只有1個(gè)worker節(jié)點(diǎn)時(shí)忽略此步,因?yàn)榭赡軙?huì)報(bào)錯(cuò) kubectl drain k8s-node1 --ignore-daemonsets # 升級kubelet和kubectl組件 yum install -y kubelet-1.25.14-0 kubectl-1.25.14-0 --disableexcludes=kubernetes # 重啟kubelet systemctl daemon-reload systemctl restart kubelet # 恢復(fù)當(dāng)前節(jié)點(diǎn)上的Pod調(diào)度。只有1個(gè)worker節(jié)點(diǎn)時(shí)忽略此步 kubectl uncordon k8s-node01 # k8s-node01 為worker節(jié)點(diǎn)名稱
6.驗(yàn)證集群
查看各個(gè)節(jié)點(diǎn)版本是否正常升級。
kubectl get nodes
7.查看證書時(shí)間
kubeadm alpha certs check-expiration
二進(jìn)制方式升級
升級順序如下步驟:
- etcd數(shù)據(jù)庫備份升級。
- 升級master節(jié)點(diǎn)組件。
- 升級node節(jié)點(diǎn)組件。
- 升級calico和CoreDNS組件。
- 驗(yàn)證集群。
1.集群概況
節(jié)點(diǎn)名稱 | 節(jié)點(diǎn)IP | 版本 | 升級版本 | 備注 |
k8s-master | 10.3.248.136 | v1.24.4 | v1.25.14 | master節(jié)點(diǎn)(kube-apiserver、controller、scheduler、kubelet、kube-proxy) |
k8s-node02 | 10.3.248.144 | v1.24.4 | v1.25.14 | node節(jié)點(diǎn)(kubelet、kube-proxy) |
mongodb | 10.3.248.143 | v1.24.4 | v1.25.14 | node節(jié)點(diǎn)(kubelet、kube-proxy) |
ocr | 10.3.248.139 | v1.24.4 | v1.25.14 | node節(jié)點(diǎn)(kubelet、kube-proxy) |
2.備份etcd數(shù)據(jù)并升級
2.1查看etcd集群的狀態(tài)
[root@k8s-master][16:31:33] ~# /usr/local/bin/etcdctl --endpoints="https://10.3.248.136:2379,https://10.3.248.137:2379,https://10.3.248.144:2379" --cacert="/etc/etcd/ssl/ca.pem" --cert="/etc/etcd/ssl/etcd.pem" --key="/etc/etcd/ssl/etcd-key.pem" endpoint status --write-out="table" +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | https://10.3.248.136:2379 | 2ea852d4423ced96 | 3.5.4 | 12 MB | false | false | 8 | 20804876 | 20804876 | | | https://10.3.248.137:2379 | 738eb00a101e8cf9 | 3.5.4 | 12 MB | true | false | 8 | 20804876 | 20804876 | | | https://10.3.248.144:2379 | dde4624daa86dd2e | 3.5.4 | 12 MB | false | false | 8 | 20804876 | 20804876 | | +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
2.2.etcd數(shù)據(jù)備份
備份時(shí)選擇主節(jié)點(diǎn)進(jìn)行備份數(shù)據(jù)
[root@k8s-master][16:38:13] ~# /usr/local/bin/etcdctl --endpoints="https://10.3.248.137:2379" --cacert="/etc/etcd/ssl/ca.pem" --cert="/etc/etcd/ssl/etcd.pem" --key="/etc/etcd/ssl/etcd-key.pem" snapshot save etcd_bak.db
{"level":"info","ts":"2024-09-08T16:39:25.880+0800","caller":"snapshot/v3_snapshot.go:65","msg":"created temporary db file","path":"etcd_bak.db.part"}
{"level":"info","ts":"2024-09-08T16:39:25.888+0800","logger":"client","caller":"v3/maintenance.go:211","msg":"opened snapshot stream; downloading"}
{"level":"info","ts":"2024-09-08T16:39:25.888+0800","caller":"snapshot/v3_snapshot.go:73","msg":"fetching snapshot","endpoint":"https://10.3.248.137:2379"}
{"level":"info","ts":"2024-09-08T16:39:25.993+0800","logger":"client","caller":"v3/maintenance.go:219","msg":"completed snapshot read; closing"}
{"level":"info","ts":"2024-09-08T16:39:26.021+0800","caller":"snapshot/v3_snapshot.go:88","msg":"fetched snapshot","endpoint":"https://10.3.248.137:2379","size":"12 MB","took":"now"}
{"level":"info","ts":"2024-09-08T16:39:26.021+0800","caller":"snapshot/v3_snapshot.go:97","msg":"saved","path":"etcd_bak.db"}
Snapshot saved at etcd_bak.db2.3etcd數(shù)據(jù)庫升級時(shí)先升級從節(jié)點(diǎn)然后再升級主節(jié)點(diǎn)。
可通過k8s官網(wǎng)升級changelog查看k8s版本對應(yīng)的etcd版本。
官網(wǎng)地址https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG

可以查看到升級k8sv1.25.14版本需要的etcd版本是3.5.9
2.4升級etcd版本
#下載
https://github.com/etcd-io/etcd/releases/download/v3.5.9/etcd-v3.5.9-linux-amd64.tar.gz
#備份舊版本
[root@k8s-master][16:57:05] /usr/local/bin# mv etcdctl etcdctlbak
[root@k8s-master][16:57:20] /usr/local/bin# mv etcd etcdbak
#解壓新版本
[root@k8s-master][16:57:58] ~# tar -zxvf etcd-v3.5.9-linux-amd64.tar.gz --strip-components=1 -C /usr/local/bin etcd-v3.5.9-linux-amd64/etcd{,ctl}
etcd-v3.5.9-linux-amd64/etcdctl
etcd-v3.5.9-linux-amd64/etcd
#重啟etcd
[root@k8s-master][16:58:18] ~# systemctl daemon-reload
[root@k8s-master][16:59:09] ~# systemctl restart etcd
#驗(yàn)證升級結(jié)果
[root@k8s-master][16:59:46] ~# /usr/local/bin/etcdctl --endpoints="https://10.3.248.136:2379,https://10.3.248.137:2379,https://10.3.248.144:2379" --cacert="/etc/etcd/ssl/ca.pem" --cert="/etc/etcd/ssl/etcd.pem" --key="/etc/etcd/ssl/etcd-key.pem" endpoint status --write-out="table"
+---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| https://10.3.248.136:2379 | 2ea852d4423ced96 | 3.5.9 | 12 MB | false | false | 8 | 20808752 | 20808752 | |
| https://10.3.248.137:2379 | 738eb00a101e8cf9 | 3.5.4 | 12 MB | true | false | 8 | 20808752 | 20808752 | |
| https://10.3.248.144:2379 | dde4624daa86dd2e | 3.5.4 | 12 MB | false | false | 8 | 20808752 | 20808752 | |
+---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
可以看到etcd的一個(gè)節(jié)點(diǎn)版本已經(jīng)升級完成。其余節(jié)點(diǎn)升級方式同上,升級完成后進(jìn)行版本查看正常升級即可。
升級完成后如下:

3.升級master節(jié)點(diǎn)組件
二進(jìn)制包下載地址https://cdn.dl.k8s.io/release/v1.25.14/kubernetes-server-linux-amd64.tar.gz
3.1升級kube-apiserver組件
#備份 cp /usr/bin/kube-apiserver /usr/bin/kube-apiserverbak tar xf kubernetes-server-linux-amd64.tar.gz #停止apiserver服務(wù) systemctl stop kube-apiserver.service #替換二進(jìn)制文件 cp -a kubernetes/server/bin/kube-apiserver /usr/bin/ #啟動(dòng)新版的apiserver systemctl start kube-apiserver.service #查看版本 kube-apiserver --version Kubernetes v1.25.14
3.2升級kube-controller-manager組件
#備份 cp /usr/bin/kube-controller-manager /usr/bin/kube-controller-managerbak #停止kube-controller-manager服務(wù) systemctl stop kube-controller-manager.service #替換二進(jìn)制文件 cp -a kubernetes/server/bin/kube-controller-manager /usr/bin/ #啟動(dòng)新版controller-manager systemctl start kube-controller-manager.service #查看版本 # kube-controller-manager --version Kubernetes v1.25.14
3.3升級kube-scheduler組件
#備份 cp /usr/bin/kube-scheduler /usr/bin/kube-schedulerbak #停止kube-controller-manager服務(wù) systemctl stop kube-scheduler.service #替換二進(jìn)制文件 cp -a kubernetes/server/bin/kube-scheduler /usr/bin/ #啟動(dòng)新版controller-manager systemctl start kube-scheduler.service #查看版本 # kube-scheduler --version Kubernetes v1.25.14
3.4升級kubectl
#備份 cp /usr/bin/kubectl /usr/bin/kubectlbak #替換二進(jìn)制文件 cp -a kubernetes/server/bin/kubectl /usr/bin/ #查看版本 # kubectl version --short Flag --short has been deprecated, and will be removed in the future. The --short output will become the default. Client Version: v1.25.14 Kustomize Version: v4.5.7 Server Version: v1.25.14
4.升級node節(jié)點(diǎn)組件
# 設(shè)置節(jié)點(diǎn)不可調(diào)度并排空節(jié)點(diǎn)。 [root@k8s-master][12:02:56] ~# kubectl drain ocr --ignore-daemonsets node/ocr already cordoned WARNING: ignoring DaemonSet-managed Pods: ingress-nginx/ingress-nginx-controller-thtp9, kube-system/calico-node-v8ddj evicting pod default/uesopconsole-5d78dcfb47-f5c8x pod/uesopconsole-5d78dcfb47-f5c8x evicted node/ocr drained
注意:如果使用了本地存儲的情況下,可能無法排空當(dāng)前節(jié)點(diǎn),可能會(huì)出現(xiàn)如下報(bào)錯(cuò)
[root@k8s-master][16:56:31] ~# kubectl drain mongodb --ignore-daemonsets node/mongodb cordoned error: unable to drain node "mongodb" due to error:cannot delete Pods with local storage (use --delete-emptydir-data to override): kube-system/metrics-server-d49478bd-7wkbf, continuing command... There are pending nodes to be drained: mongodb cannot delete Pods with local storage (use --delete-emptydir-data to override): kube-system/metrics-server-d49478bd-7wkbf
此時(shí)我們選擇就地升級即不用排空節(jié)點(diǎn),直接升級node節(jié)點(diǎn)組件,可能會(huì)影響本地pod重啟一次,如果升級時(shí)間較短的話,pod并不會(huì)重啟。
4.1升級kubelet組件
#備份 cp /usr/bin/kubelet /usr/bin/kubeletbak tar xf kubernetes-server-linux-amd64.tar.gz #停止kubelet服務(wù) systemctl stop kubelet.service #替換二進(jìn)制文件 \cp kubernetes/server/bin/kubelet /usr/bin/ #啟動(dòng)新版kubelet systemctl start kubelet.service
4.2升級kube-proxy組件
#備份 cp /usr/bin/kube-proxy /usr/bin/kube-proxybak #停止kube-proxy服務(wù) systemctl stop kube-proxy #替換二進(jìn)制文件 \cp kubernetes/server/bin/kube-proxy /usr/bin/kube-proxy #啟動(dòng)新版kubelet systemctl start kube-proxy
恢復(fù)當(dāng)前節(jié)點(diǎn)上的Pod調(diào)度。
kubectl uncordon ocr
其它node節(jié)點(diǎn)升級操作同上,升級完成kubelet和kube-proxy組件后,通過master節(jié)點(diǎn)查看版本已經(jīng)升級

5.升級calico和CoreDNS組件
calico和coreDNS組件版本可根據(jù)實(shí)際需求進(jìn)行版本升級,也可以不升級。
升級時(shí)根據(jù)部署方?jīng)Q定,如果是yaml方式進(jìn)行部署的,下載最新的yaml文件和鏡像修改對應(yīng)參數(shù)重啟pod即可。
calico官網(wǎng)鏈接:
coreDNS:
kubernetes/cluster/addons/dns/coredns/coredns.yaml.base at master · kubernetes/kubernetes · GitHub
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在AWS-EC2中安裝Minikube集群的詳細(xì)過程
這篇文章主要介紹了在AWS-EC2中安裝Minikube集群,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
Kubernetes調(diào)度機(jī)制與策略實(shí)驗(yàn)詳解
本文通過實(shí)際操作,詳細(xì)介紹了Kubernetes調(diào)度機(jī)制的核心原理和常用調(diào)度策略的配置方法,包括節(jié)點(diǎn)選擇、親和性與反親和性、污點(diǎn)與容忍等,實(shí)驗(yàn)環(huán)境為Kubernetes集群,并通過一系列步驟驗(yàn)證了這些調(diào)度策略的實(shí)際應(yīng)用2025-12-12
Kubekey安裝Kubernetes-1.24.8的詳細(xì)過程
這篇文章主要介紹了Kubekey安裝Kubernetes-1.24.8的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
k8s集群中運(yùn)行docker registry鏡像倉庫實(shí)踐
本文介紹了如何使用Dockerfile構(gòu)建一個(gè)支持認(rèn)證登錄的Docker Registry,并通過靜態(tài)Pod方式部署在Kubernetes集群中,重點(diǎn)包括配置認(rèn)證、增加鏡像刪除功能、設(shè)置持久化路徑及驗(yàn)證登錄和推送鏡像的過程2025-12-12
K8s生產(chǎn)環(huán)境那些文檔不會(huì)告訴你的坑及解決辦法
K8s作為當(dāng)前最流行的容器編排平臺,在企業(yè)生產(chǎn)環(huán)境中的部署需要綜合考慮高可用性、安全性、性能優(yōu)化等多方面因素,這篇文章主要介紹了K8s生產(chǎn)環(huán)境那些文檔不會(huì)告訴你的坑及解決辦法的相關(guān)資料,需要的朋友可以參考下2026-05-05
k8s部署問題解決方案(節(jié)點(diǎn)狀態(tài)為 NotReady)
kubectl get nodes顯示節(jié)點(diǎn)NotReady,因kube-flannel鏡像拉取失敗,手動(dòng)拉取鏡像并修改名稱版本后,K8s自動(dòng)重試,最終恢復(fù)節(jié)點(diǎn)狀態(tài)為Ready,相關(guān)Pod也變?yōu)镽unning2025-07-07
ES業(yè)務(wù)數(shù)據(jù)遷移遇到的精度問題BUG
這篇文章主要為大家介紹了ES業(yè)務(wù)數(shù)據(jù)遷移遇到的BUG精度問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

