kubenetes集群版本升級方式
概述
搭建kubernetes集群的方式有很多種,比如二進(jìn)制,kubeadm,RKE(Rancher)等,k8s集群升級方式也各有千秋,本文主要介紹使用kubeadm方式搭建的k8s集群和二進(jìn)制搭建的集群升級方法。
Kubernetes 版本以 x.y.z 表示,其中 x 是主要版本, y 是次要版本,z 是補(bǔ)丁版本,遵循語義版本控制術(shù)語。升級版本時不建議跨多個次要版本升級,根據(jù)官方建議以跨1個次要版本升級或者跨多個補(bǔ)丁版本升級。例如:從1.20.1升級至1.20.15、從1.20.X升級1.21.X。
kubeadm方式升級
升級順序如下步驟:
- 升級kubeadm版本。
- 備份ETCD數(shù)據(jù)。
- 升級master節(jié)點各組件。
- 升級node節(jié)點組件。
- 升級完成集群驗證
1.集群概況
節(jié)點名稱 | 節(jié)點IP | 版本 | 升級版本 | 備注 |
k8s-master | 192.168.60.20 | v1.24.17 | v1.25.14 | master節(jié)點 |
k8s-node01 | 192.168.60.21 | v1.24.17 | v1.25.14 | node節(jié)點 |
k8s-node02 | 192.168.60.20 | v1.24.17 | v1.25.14 | node節(jié)點 |
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
驗證
[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é)點組件
4.1驗證升級計劃,檢查當(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é)點升級到v1.25.14版本
注意:kubeadm upgrade命令也會自動對kubeadm在節(jié)點上所管理的證書執(zhí)行續(xù)約操作。
如果需要略過證書續(xù)約操作,可以使用標(biāo)志--certificate-renewal=false。
# 將 master升級到目標(biāo)版本 kubeadm upgrade apply v1.25.14 #出現(xiàn)如下提示表示master節(jié)點升級完成了 [upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.25.14". Enjoy!
4.3升級kubectl和kubelet
1.將當(dāng)前節(jié)點標(biāo)記為不可調(diào)度,并驅(qū)逐節(jié)點上的Pod kubectl drain <節(jié)點名稱> --ignore-daemonsets ##說明: ## --ignore-daemonsets 無視DaemonSet管理下的Pod。即--ignore-daemonsets往往需要指定的,這是 #因為deamonset會忽略unschedulable標(biāo)簽(使用kubectl drain時會自動給節(jié)點打上不可調(diào)度標(biāo)簽), #由于deamonset控制器控制的pod被刪除后可能馬上又在此節(jié)點上啟動起來,這樣就會成為死循環(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é)點上的Pod調(diào)度,使其上線 kubectl uncordon <節(jié)點名稱>
此時查看版本發(fā)現(xiàn)master節(jié)點的版本已經(jīng)升級成功了
5.升級node節(jié)點組件
工作節(jié)點上的升級過程應(yīng)該一次執(zhí)行一個節(jié)點,或者一次執(zhí)行幾個節(jié)點,以不影響運(yùn)行工作負(fù)載所需的最小容量。
# 升級kubeadm yum install -y kubeadm-1.25.14-0 --disableexcludes=kubernetes # 查看版本 kubeadm version # 設(shè)置節(jié)點不可調(diào)度并排空節(jié)點。只有1個worker節(jié)點時忽略此步,因為可能會報錯 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é)點上的Pod調(diào)度。只有1個worker節(jié)點時忽略此步 kubectl uncordon k8s-node01 # k8s-node01 為worker節(jié)點名稱
6.驗證集群
查看各個節(jié)點版本是否正常升級。
kubectl get nodes
7.查看證書時間
kubeadm alpha certs check-expiration
二進(jìn)制方式升級
升級順序如下步驟:
- etcd數(shù)據(jù)庫備份升級。
- 升級master節(jié)點組件。
- 升級node節(jié)點組件。
- 升級calico和CoreDNS組件。
- 驗證集群。
1.集群概況
節(jié)點名稱 | 節(jié)點IP | 版本 | 升級版本 | 備注 |
k8s-master | 10.3.248.136 | v1.24.4 | v1.25.14 | master節(jié)點(kube-apiserver、controller、scheduler、kubelet、kube-proxy) |
k8s-node02 | 10.3.248.144 | v1.24.4 | v1.25.14 | node節(jié)點(kubelet、kube-proxy) |
mongodb | 10.3.248.143 | v1.24.4 | v1.25.14 | node節(jié)點(kubelet、kube-proxy) |
ocr | 10.3.248.139 | v1.24.4 | v1.25.14 | node節(jié)點(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ù)備份
備份時選擇主節(jié)點進(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.db
2.3etcd數(shù)據(jù)庫升級時先升級從節(jié)點然后再升級主節(jié)點。
可通過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 #驗證升級結(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的一個節(jié)點版本已經(jīng)升級完成。
其余節(jié)點升級方式同上,升級完成后進(jìn)行版本查看正常升級即可。
升級完成后如下:
3.升級master節(jié)點組件
二進(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/ #啟動新版的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/ #啟動新版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/ #啟動新版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é)點組件
# 設(shè)置節(jié)點不可調(diào)度并排空節(jié)點。 [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é)點,可能會出現(xiàn)如下報錯
[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
此時我們選擇就地升級即不用排空節(jié)點,直接升級node節(jié)點組件,可能會影響本地pod重啟一次,如果升級時間較短的話,pod并不會重啟。
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/ #啟動新版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 #啟動新版kubelet systemctl start kube-proxy
恢復(fù)當(dāng)前節(jié)點上的Pod調(diào)度。
kubectl uncordon ocr
其它node節(jié)點升級操作同上,升級完成kubelet和kube-proxy組件后,通過master節(jié)點查看版本已經(jīng)升級
5.升級calico和CoreDNS組件
calico和coreDNS組件版本可根據(jù)實際需求進(jìn)行版本升級,也可以不升級。
升級時根據(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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
k8s跨服務(wù)調(diào)用入門到實戰(zhàn)示例詳解
這篇文章主要為大家介紹了k8s跨服務(wù)調(diào)用入門到實戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09IoT邊緣集群Kubernetes?Events告警通知實現(xiàn)示例
這篇文章主要為大家介紹了IoT邊緣集群Kubernetes?Events告警通知實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02kubernetes(k8s)安裝metrics-server實現(xiàn)資源使用情況監(jiān)控方式詳解
這篇文章主要介紹了kubernetes(k8s)安裝metrics-server實現(xiàn)資源使用情況監(jiān)控,包括Metrics?Server下載方式,?k8s集群安裝部署metrics的問題,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04k8s 中的 service 如何找到綁定的 Pod 及實現(xiàn) 
service 是一組具有相同 label pod 集合的抽象,集群內(nèi)外的各個服務(wù)可以通過 service 進(jìn)行互相通信,這篇文章主要介紹了k8s 中的 service 如何找到綁定的 Pod 以及如何實現(xiàn) Pod 負(fù)載均衡,需要的朋友可以參考下2022-10-10Kubernetes中使用PersistentVolume掛載云盤方式
這篇文章主要介紹了Kubernetes中使用PersistentVolume掛載云盤方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02php redis擴(kuò)展支持scan命令實現(xiàn)方法
這篇文章主要介紹了php redis擴(kuò)展支持scan命令實現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2016-10-10