將安全性和核心更新套用於 Azure Kubernetes Service (AKS) 中的節點

為了保護您的叢集,系統會自動將安全性更新套用至 AKS 中的 Linux 節點。 這些更新包括 OS 安全性修正程式或核心更新。 這其中有一些更新需要重新啟動節點,才能完成此程序。 AKS 不會自動重新啟動這些 Linux 節點來完成更新程序。

Windows 伺服器節點保持最新狀態的流程稍有不同。 Windows 伺服器節點不會收到每日更新。 相反地,您會執行 AKS 升級,藉以使用最新的基底 Window Server 映像和修補程式來部署新的節點。 若為使用 Windows 伺服器節點的 AKS 叢集,請參閱在 AKS 中升級節點集區 (機器翻譯)

此文章將示範如何使用開放原始碼 Kured (KUbernetes REboot Daemon) 來監看需要重新啟動的 Linux 節點,然後自動處理執行 Pod 和節點重新啟動程序的重新排程。

注意

Kured 是 Cloud Native Computing Foundation 中的開放原始碼專案。 請將問題導向至 kured GitHub。 其他支援可以在 CNCF Slack 上的 #kured 頻道中找到。

開始之前

您必須安裝並設定 Azure CLI 2.0.59 版或更新版本。 執行 az --version 以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI

了解 AKS 節點更新體驗

在 AKS 叢集中,您的 Kubernetes 節點會當作 Azure 虛擬機器 (VM) 來執行。 這些 Linux 型 VM 會使用 Ubuntu 或 Azure Linux 映像,其 OS 已設定為每天自動檢查更新。 如果有安全性或核心更新可供使用,就會自動下載並安裝它們。

AKS node update and reboot process with kured

某些安全性更新 (例如核心更新) 需要重新啟動節點,才能完成此程序。 需要重新啟動的 Linux 節點會建立名為 /var/run/reboot-required 的檔案。 此重新啟動程序不會自動執行。

您可以使用自己的工作流程和程序來處理節點重新啟動,或使用 kured 來協調此程序。 使用 kured 來部署 DaemonSet,以便在叢集中的每個 Linux 節點上執行 Pod。 DaemonSet 中的這些 Pod 會先監看 /var/run/reboot-required 檔案是否存在,然後初始重新啟動節點的程序。

節點映像升級

自動升級會將更新套用至 Linux 節點作業系統,但用來為叢集建立節點的映像會保持不變。 如果將新的 Linux 節點新增至您的叢集,則會使用原始映像來建立節點。 這個新節點會每天自動檢查期間收到全部可用的安全性和核心更新,但會保持未修補,直到全部檢查和重新啟動都完成為止。

或者,您也可以使用節點映像升級來檢查和更新叢集所使用的節點映像。 如需節點映像升級的詳細資訊,請參閱 Azure Kubernetes Service (AKS) 節點映像升級

節點升級

AKS 中有另一個的流程可讓您的升級叢集。 升級通常會移至較新版的 Kubernetes,而不只是套用節點安全性更新。 AKS 升級會執行下列動作:

  • 利用已套用的最新安全性更新與 Kubernetes 版本來部署新節點。
  • 舊節點會遭到封鎖並清空。
  • 在新節點上為 Pod 設定排程。
  • 刪除舊節點。

在升級事件期間,您不能保持在同一個 Kubernetes 版本。 您必須指定較新版的 Kubernetes。 若要升級至最新版的 Kubernetes,您可以升級 AKS 叢集

在 AKS 叢集中部署 Kured

若要部署 kured DaemonSet,請安裝下列官方 Kured Helm 圖表。 這會建立角色和叢集角色、繫結及服務帳戶,然後使用 kured 部署 DaemonSet。

# Add the Kured Helm repository
helm repo add kubereboot https://kubereboot.github.io/charts/

# Update your local Helm chart repository cache
helm repo update

# Create a dedicated namespace where you would like to deploy kured into
kubectl create namespace kured

# Install kured in that namespace with Helm 3 (only on Linux nodes, kured is not working on Windows nodes)
helm install my-release kubereboot/kured --namespace kured --set controller.nodeSelector."kubernetes\.io/os"=linux

您也可以設定適用於 kured 的額外參數,例如與 Prometheus 或 Slack 整合。 如需設定參數的詳細資訊,請參閱 Kured Helm 圖表

更新叢集節點

根據預設,AKS 中的 Linux 節點每晚都會檢查更新。 如果您不想等待,則可手動執行更新以檢查 kured 能夠正確執行。 首先,遵循步驟以 SSH 到您的其中一個 AKS 節點。 一旦建立與 Linux 節點的 SSH 連線之後,請檢查更新並套用這些,如下所示:

sudo apt-get update && sudo apt-get upgrade -y

如果已套用需要重新啟動節點的更新,即會將檔案寫入 /var/run/reboot-requiredKured 預設每隔 60 分鐘就會檢查需要重新啟動的節點。

監視和檢閱重新啟動程序

已偵測到 DaemonSet 內的其中一個複本需要重新啟動節點時,就會透過 Kubernetes API 在節點上放置一個鎖定。 此鎖定可防止在節點上排程更多 Pod。 此鎖定也指出一次應該只能重新啟動一個節點。 封鎖節點之後,即會清空執行中的 Pod,並將節點重新啟動。

您可以使用 kubectl get nodes 命令來監視節點狀態。 下列範例輸出會在節點準備好進行重新啟動程序時,顯示狀態為 SchedulingDisabled 的節點:

NAME                       STATUS                     ROLES     AGE       VERSION
aks-nodepool1-28993262-0   Ready,SchedulingDisabled   agent     1h        v1.11.7

當更新程序完成之後,您就可以使用 kubectl get nodes 命令搭配 --output wide 參數來檢視節點狀態。 此輸出可讓您查看 KERNEL-VERSION 基礎節點中的差異,如下列範例輸出所示。 aks-nodepool1-28993262-0 已在上一個步驟更新,並顯示核心版本 4.15.0-1039-azure。 尚未更新的節點 aks-nodepool1-28993262-1 會顯示核心版本 4.15.0-1037-azure

NAME                       STATUS    ROLES     AGE       VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
aks-nodepool1-28993262-0   Ready     agent     1h        v1.11.7   10.240.0.4    <none>        Ubuntu 16.04.6 LTS   4.15.0-1039-azure   docker://3.0.4
aks-nodepool1-28993262-1   Ready     agent     1h        v1.11.7   10.240.0.5    <none>        Ubuntu 16.04.6 LTS   4.15.0-1037-azure   docker://3.0.4

下一步

此文章已詳細說明如何使用 kured,在安全性更新程序過程中自動重新啟動 Linux 節點。 若要升級至最新版的 Kubernetes,您可以升級 AKS 叢集

若為使用 Windows 伺服器節點的 AKS 叢集,請參閱在 AKS 中升級節點集區 (機器翻譯)