iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Cloud Native

我在 CKS 考完只拿 47% 後痛定思痛決定好好準備內容系列 第 10

[Day10] 2-4. Upgrade Kubernetes to avoid vulnerabilities

  • 分享至 

  • xImage
  •  

在 Kubernetes 的更新時可以跟著官方文件的步驟進行,今天會介紹如何更新 Kubernetes,會以 1.32 更新至 1.33 為例,更新時會分為 (1) Kubeadm 更新以及 (2) kubelet 更新,更新 Kubeadm 時需要先判斷是更新 ControlPlane 還是 WorkNode,而在 Kubelet 中並沒有差別。

在更新時需要依序更新

  • primary control plane node
  • additional control plane nodes
  • worker nodes

更新前考量

  • 需閱讀更新須知了解會有什麼影響
  • cluster 需要是 static control plane 以及 etcd pods 或者是 external etcd
  • 記得將重要的服務或內容進行備份
  • 在更新時需要先對 node 的 pod 透過 cordon 或者 drain 進行驅逐
  • kubelet 與 kubeadm 的版本盡量要相同,不過 kubelet 的版本可以低於 kubeadm 一個版本
  • 進行更新之後所有的 container 都會重新啟動
  • 可以透過 systemctl status kubelet查看 kubelet 狀態,然後有時候在配置時會有一些覆蓋值,因此實際配置需要在 journalctl -xeu kubelet 查看
  • 在更新 kube-apiserver 時在 drain 的當下可能還有資料仍在寫入至 etcd 中,如果需要謹慎更新時建議透過 graceful shutdown 進行
    killall -s SIGTERM kube-apiserver # trigger a graceful kube-apiserver shutdown
    sleep 20 # wait a little bit to permit completing in-flight requests
    kubeadm upgrade ... # execute a kubeadm upgrade command
    

在上述考量都確認沒有風險後,我們就可以開始對 Control Plane 進行更新了!

更新

(一) Control Plane 更新

  1. 確認 package repository 版本
# On your system, this configuration file could have a different name
pager /etc/apt/sources.list.d/kubernetes.list
# 將原先 v1.32 修改為 v1.33
deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.33/deb/ /
  1. 更新套件庫以及查看版本
sudo apt update
sudo apt-cache madison kubeadm
  1. 更新 Control Plane,並從上方套件庫選擇要的 package 版本
# replace x in 1.33.x-* with the latest patch version
sudo apt-mark unhold kubeadm && \
sudo apt-get update && sudo apt-get install -y kubeadm='1.33.x-*' && \
sudo apt-mark hold kubeadm
  1. 查看可使用 kubeadm 版本
kubeadm version
  1. 查看更新計劃
sudo kubeadm upgrade plan
  1. 根據自己需求選擇更新的版本
sudo kubeadm upgrade apply v1.33.x

會需要等待幾分鐘,當更新完後會出現以下說明

[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.33.x". Enjoy!

[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.
  1. 更新 CNI

(二) WorkNode 更新
對於 WorkNode 更新會有一個小不同,需要將 Control Plane 中第五項的 sudo kubeadm upgrade apply 修改為 sudo kubeadm upgrade node,因此步驟如下

  1. 先驅逐目前 worknode 上的 pod
# replace <node-to-drain> with the name of your node you are draining
kubectl drain <node-to-drain> --ignore-daemonsets
  1. 確認 package repository 版本
# On your system, this configuration file could have a different name
pager /etc/apt/sources.list.d/kubernetes.list
# 將原先 v1.32 修改為 v1.33
deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.33/deb/ /
  1. 更新套件庫以及查看版本
sudo apt update
sudo apt-cache madison kubeadm
  1. 更新 WorkNode , 並從上方套件庫選擇要的 package 版本
# replace x in 1.33.x-* with the latest patch version
sudo apt-mark unhold kubeadm && \
sudo apt-get update && sudo apt-get install -y kubeadm='1.33.x-*' && \
sudo apt-mark hold kubeadm
  1. 查看可使用 kubeadm 版本
kubeadm version
  1. 根據自己需求選擇更新的版本
sudo kubeadm upgrade node

會需要等待幾分鐘,當更新完後會出現以下說明

[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.33.x". Enjoy!

[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.

(三) Kubelet 更新

  1. 更新套件庫
# replace x in 1.33.x-* with the latest patch version
sudo apt-mark unhold kubelet kubectl && \
sudo apt-get update && sudo apt-get install -y kubelet='1.33.x-*' kubectl='1.33.x-*' && \
sudo apt-mark hold kubelet kubectl
  1. 更新完後重啟 kubelet
sudo systemctl daemon-reload
sudo systemctl restart kubelet
  1. 取消驅逐
# replace <node-to-uncordon> with the name of your node
kubectl uncordon <node-to-uncordon>

以上就是比較簡單的說明如何在 Control Plane 以及 Work Node 在 kubeadm 和 kubelet 的更新

參考資料
Upgrading kubeadm clusters
Changing The Kubernetes Package Repository


上一篇
[Day9] 2-3. Restrict access to Kubernetes API
下一篇
[Day11] 3-1. Minimize host OS footprint (reduce attack surface)
系列文
我在 CKS 考完只拿 47% 後痛定思痛決定好好準備內容11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言