AKS升級路線最佳實踐方案

前言 ??

Kubernetes 社區大約每 4 個月發布次要版本,次要版本包括新增功能和改進。補丁發布更為頻繁(有時每周都會發布),適用于次要版本中的關鍵 Bug 修復。修補程序版本包括針對安全漏洞或主要 bug 的修復。對于受支持版本列表以外的群集,AKS 將不會在正常運行時間或其他方面做出任何保證。為了使AKS版本始終能獲得支持,需要制定計劃將AKS升級至受支持版本。在AKS Kubernetes 發布日歷(https://learn.microsoft.com/zh-cn/azure/aks/supported-kubernetes-versions?tabs=azure-cli#aks-kubernetes-release-calendar)上參考即將推出的版本發布和棄用事項。

AKS版本升級路徑說明?

升級受支持的 AKS 群集時,不能跳過 Kubernetes 次要版本。Kubernetes 控制平面版本傾斜策略不支持跳過次要版本。例如,對于以下升級過程:

  • 1.28.x ->1.29.x:允許。

  • 1.27.x ->1.28.x:允許。

  • 1.27.x ->1.29.x:允許。

若要從 1.27.x ->1.29.x 升級,請執行以下操作:

  • 從 1.27.x ->1.28.x 升級。

  • 從 1.28.x ->1.29.x 升級。

僅當從不受支持的版本升級回受支持的最低版本時,才能跳過多個版本。例如,如果 1.27 是最低受支持的次要版本,可以從不受支持的 1.25.x 升級到受支持的 1.27.x。 ??

從跳過兩個或更多次要版本的不支持版本執行升級時,執行升級時不保證任何功能,并且不在服務級別協議和有限保修范圍內。運行不受支持的版本的群集具有將控制平面升級與節點池升級分離的靈活性。但是,如果版本明顯過期,建議重新創建群集。

AKS升級策略?

從 Kubernetes 1.19 開始,開源社區已將支持時間延長到 1 年。AKS 承諾啟用修補程序并提供與上游承諾使用量匹配的支持。對于版本 1.19 和更高版本上的 AKS 群集,每年至少升級一次,以便始終使用受支持的版本。

AKS升級將會有什么影響?

  • AKS次要版本升級將會更新棄用API,如果在升級AKS前不對棄用API進行處理,兩個版本的AKS API不兼容,會造成AKS升級失敗和使用棄用API的資源部署失敗。已棄用 API 的遷移指南(https://kubernetes.io/zh-cn/docs/reference/using-api/deprecation-guide/)

  • 所有pod將會重啟。2024年06月06日國內關閉了docker hub鏡像緩存服務,在這期間pod沒有重啟過的在AKS升級后鏡像會丟失,而且無法從docker hub中拉取,從而導致pod拉取鏡像失敗。

  • 沒有對節點池預設的labels和Taints在AKS升級后會被清除。

  • 會對有依賴性的服務產生影響,需要按照啟動的先后順序重啟服務。

升級步驟?

升級狀態跟蹤表

Image

升級路線?

例:1.22.6 → 1.27.3 → 1.28.9 → 1.29.4

AKS Upgrade PreCheck?

  • 在升級前進行AKS現狀檢查,并進行統計,需要處理的郵件發送至各位Owner及時處理。

  • 與客戶及涉及到的各個應用溝通時間窗口并安排升級計劃。

  • 提前發送郵件book需要參與AKS升級的相關人員(應用開發/Cloud Team/SRE Team)的時間。

檢查是否存在即將廢棄的API?

  • 微軟提供的查詢語句
查詢query:
AzureDiagnostics
| where Category == "kube-audit"
| where log_s has 'deprecated' and TimeGenerated > ago(1d)
| extend log = parse_json(tostring(parse_json(log_s)))
| extend removed_release = toreal(tostring(log.annotations['k8s.io/removed-release']))
| where removed_release == '1.26' or removed_release == '1.27'
| extend verb = tostring(log.verb)
| extend userAgent = tostring(log.userAgent)
| extend username = tostring(log.user.username)
| extend resource = tostring(log.objectRef.resource)
| extend apiGroup = tostring(log.objectRef.apiGroup)
| extend apiVersion = tostring(log.objectRef.apiVersion)
| extend requestURI = tostring(split(log.requestURI, '?')[0])
| extend source_ip = tostring(log.sourceIPs[0])
| extend api = strcat(apiGroup, '/', apiVersion)
| project TimeGenerated, userAgent, username, api, resource, verb, requestURI, source_ip, Resource
  • 命令檢查廢棄API?

例:從 v1.27 版本開始不再提供 storage.k8s.io/v1beta1 API 版本的 CSIStorageCapacity。

$?kubectl get csistoragecapacities.storage.k8s.io?-A?-o=jsonpath="{$.items[?(@.apiVersion=='storage.k8s.io/v1beta1')].metadata.name}";

注意:在AKS升級前,需要為所有可能的中斷做好準備。 這些中斷包括 API 中斷性變更、棄用以及 Helm 和容器存儲接口 (CSI) 等依賴項導致的中斷。 預測這些中斷并在不停機的情況下遷移關鍵工作負載可能比較困難。可以將 AKS 群集配置為自動停止包含次要版本更改和已棄用 API 的升級操作,并提醒你注意此問題。 此功能有助于避免意外中斷,并使你有時間在繼續升級之前及時解決已棄用的 API。參考:發生 API 中斷性變更時自動停止 Azure Kubernetes 服務 (AKS) 群集升級

檢查部署源文件api version?

檢查部署源文件中的api version,例如helm等,如果存在目標版本即將要廢棄的api version,需要在AKS升級前計劃修改,在修改前注意檢查是否開啟資源自動同步。

檢查公共Image ??

  • 檢查是否存在已經丟失公共鏡像源的服務。

  • 檢查是否存在仍然在使用被自動清除策略刪除的鏡像。

附:掃描namespace下所有鏡像的檢查命令

$ kubectl describe pod -n <namespace> |?grep?Image | awk?'{print $2}'?|?grep?-v?'ID'?|?sort?-u

檢查節點親和性?

檢查是否存在有節點依賴的服務。

$ kubectl get deployments.apps -A -o=jsonpath="{$.items[?(@.spec.template.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution)].metadata.name}";
$ kubectl get statefulsets.apps -A -o=jsonpath="{$.items[?(@.spec.template.spec.affinity.deAffinity.requiredDuringSchedulingIgnoredDuringExecution)].metadata.name}";
$ kubectl get deployments.apps -A -o=jsonpath="{$.items[?(@.apiVersion=='apps/v1')].spec.template.spec.nodeSelector}";
$ kubectl get statefulsets.apps -A -o=jsonpath="{$.items[?(@.apiVersion=='apps/v1')].spec.template.spec.nodeSelector}";

查看所有節點及labels并記錄。

$ kubectl?get?node?--show-labels

檢查是否有污點?

檢查節點是否標記有污點并記錄。

$ kubectl?get?nodes?-o jsonpath='{range $.items[?(.spec.taints)]}{@.metadata.name} ? {@.spec.taints}{"\n"}{end}'

檢查PDB設置?

升級前備份并刪除PDB,系統PDB除外,否則會導致AKS集群升級失敗。

參考:排查由于 PDB 導致的逐出失敗而導致的 UpgradeFailed 錯誤(https://learn.microsoft.com/zh-cn/troubleshoot/azure/azure-kubernetes/create-upgrade-delete/error-code-poddrainfailure)

檢查地址空間?

升級前確認地址空間充足。 ??

打開Azure Portal > Kubernetes 服務 > 設置 - 節點池 > 選擇節點池 > 配置 - 子網 > 點擊子網 > 復制Subnet并搜索

Image

檢查服務器類型配額是否足夠?

查看使用的服務器類型

Image

檢查升級節點激增數?

 
$ az aks nodepool show --name?<nodePool>?--resource-group?<resourceGroup>?--cluster-name?<clusterName>?|grep maxSurge

設置節點激增數(設置AKS集群升級中同時升級的節點數),一般是按照節點池總數的三分之一或二分之一設置。

# Set max surge for a new node pool
az aks nodepool add --name mynodepool --resource-group MyResourceGroup --cluster-name MyManagedCluster --max-surge 33%# Update max surge for an existing node pool
az aks nodepool update --name mynodepool --resource-group MyResourceGroup --cluster-name MyManagedCluster --max-surge 5
 

檢查并記錄升級前所有pod狀態?

升級前記錄所有pod狀態,在AKS升級完成后作為參考。

檢查JDK版本?

在AKS升級到1.25版本后,Pod可能由于內存飽和或內存不足而停止工作。

現象:

  • 節點上的內存壓力

  • 與升級前應用的內存使用量相比,增加了應用的內存使用率

  • 節點上的 CPU 限制

  • 由于 OOM 錯誤而導致 Pod 失敗

在以下環境中運行的應用可能會降低性能:

  • 對于 低于版本 11.0.18 或版本 1.8.0 372 的 JRE 版本 ,Java 運行時環境 (JRE) ()

  • 低于版本 5.0 的 .NET 版本

  • Node.js

參考:群集升級到 Kubernetes 1.25 后,Pod 中會出現內存飽和

https://learn.microsoft.com/zh-cn/troubleshoot/azure/azure-kubernetes/create-upgrade-delete/aks-memory-saturation-after-upgrade

掃描namespace下所有pod的JDK版本

$ vim show_pods_jdk_version.sh#!/usr/bin/bashfor?pod?in?`kubectl get po -n?$1?| awk?'{print $1}'?| grep -v NAME`do??echo?$pod? result=$(kubectl?exec?-it -n?$1?$pod?-- java -version 2>/dev/null)??if?[[ $? != 0 ]];?then? ??echo?'no_jdk'??else? ??echo?`kubectl?exec?-it -n?$1?$pod?-- java -version 2>/dev/null | grep?'openjdk version\|java version'`??fidone$ bash show_pods_jdk_version.sh <namespace>

??

AKS Upgrade Cut Over ??

Kubernetes服務 > 群集配置 > 升級版本 > 選擇下一個次版本 > 保存

Image

Image

強制升級(可選項)

用戶也可以嘗試臨時性的disable該檢查,強制讓aks先完成升級。但這就意味著后續升級到新版本之后,用戶業務pod可能會直接無法使用(新k8s版本上老舊的api已經下架)

參考:Stop Azure Kubernetes Service (AKS) cluster upgrades automatically on API breaking changes

https://docs.azure.cn/en-us/aks/stop-cluster-upgrade-api-breaking-changes#bypass-validation-to-ignore-api-changes

 
$ az aks update --name myAKSCluster --resource-group?myResourceGroup --enable-force-upgrade --upgrade-override-until?2023-10-01T13:00:00Z ??//預估的時間窗口

AKS Upgrade PostCheck?

檢查node labels?

設置labels ??

$ kubectl label nodes?<node>?<key>=<value>

檢查污點?

設置污點

$ kubectl taint nodes?<node>?<key>=<value>:NoSchedule?

檢查所有pod狀態?

對比在PreCheck中記錄的pod狀態檢查,如有問題及時處理。

通知應用自檢查?

確保所有pod正常啟動后檢查業務系統狀態,更新完成CMDB,并匯總業務的反饋信息做升級報告提交。

Image

Image

Image

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83720.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83720.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83720.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

樹莓派智能小車基本移動實驗指導書

1.安裝LOBOROBOT庫函數 LOBOROBOT.py代碼如下&#xff1a; #!/usr/bin/python # -*- coding: utf-8 -*-import time import math import smbus import RPi.GPIO as GPIODir [forward,backward, ]class PCA9685:# Registers/etc.__SUBADR1 0x02__SUBADR2 …

如何對目標檢測算法RT-DETR進行創新和改進:突破瓶頸,提升性能!

更多精彩&#xff0c;詳見文末~~~ 在目標檢測的高速發展中&#xff0c;RT-DETR作為DETR&#xff08;DEtection TRansformer&#xff09;的高效變體&#xff0c;憑借其優異的性能和較快的推理速度&#xff0c;已經成為許多實際應用中的首選算法。然而&#xff0c;盡管RT-DETR在…

Java-String

前言 package com.kjxy.st;public class TestString1 {public static void main(String[] args) {String s1 "hello";String s2 "hello";String s3 new String("hello");String s4 new String("hello");System.out.println(s1 s2…

計算機組成原理——C/存儲系統

&#x1f308;個人主頁&#xff1a;慢了半拍 &#x1f525; 創作專欄&#xff1a;《史上最強算法分析》 | 《無味生》 |《史上最強C語言講解》 | 《史上最強C練習解析》|《史上最強C講解》|《史上最強計組》|《史上最強數據結構》 &#x1f3c6;我的格言&#xff1a;一切只是時…

什么是電輸運性能

電輸運性能?是指材料在電場作用下&#xff0c;電子在材料中傳輸的能力和效率。具體來說&#xff0c;電輸運性能包括以下幾個方面&#xff1a; ?電子的自由移動性?&#xff1a;導體中的電子具有較大的自由移動能力&#xff0c;這是由于導體中的原子或分子結構具有一定的松散…

k3s入門教程(二)部署前后端分離程序

文章目錄 部署基礎服務部署Redis部署MySQL端口轉發測試 運行與構建前后端鏡像構建后端鏡像 docker build -t ruoyi-admin:v3.8 .構建前端鏡像 docker build -t ruoyi-ui:v3.8 .創建私庫&#xff0c;推拉鏡像 前后端應用部署后端應用部署前端應用部署 啟動順序與初始化容器修改前…

Seata如何與Spring Cloud整合?

&#x1f527; 一、整合核心步驟 1. 啟動 Seata Server&#xff08;TC&#xff09; 環境準備&#xff1a; 修改 registry.conf&#xff0c;指定注冊中心&#xff08;如 Nacos&#xff09;和配置中心&#xff1a;registry {type "nacos"nacos {serverAddr "l…

Python惰性函數與技術總結-由Deepseek產生

在Python中&#xff0c;惰性&#xff08;Lazy&#xff09;技術指延遲計算直到真正需要結果時才執行&#xff0c;常用于優化內存和性能。以下是常見的惰性函數和技術&#xff1a; 1. 生成器&#xff08;Generators&#xff09; 原理&#xff1a;使用 yield 返回迭代結果&#x…

輪廓 裂縫修復 輪廓修復 填補孔洞 源代碼

目錄 1. 形態學閉合操作填補小孔洞 完整代碼: 使用 Douglas-Peucker 算法對輪廓進行多邊形逼近 2.裂縫修復 輪廓修復 輪廓補全 函數封裝 調用示例: 1. 形態學閉合操作填補小孔洞 完整代碼: import cv2 import numpy as np# 創建模擬圖像(白色區域 + 多個不規則黑洞)…

HTTP1.1

HTTP基礎知識 HTTP&#xff08;HyperText Transfer Protocol&#xff09;是用于傳輸超文本 的應用層協議&#xff0c;采用客戶端-服務器 模型。 客戶端&#xff08;如瀏覽器&#xff09;發起請求&#xff0c;服務器響應并返回數據。 工作原理 客戶端發送HTTP請求至服…

【Linux教程】Linux 生存指南:掌握常用命令,避開致命誤操作

Linux 常用操作命令&#xff1a;避免誤操作指南 在 Linux 系統中&#xff0c;熟練掌握常用操作命令是高效工作的基礎&#xff0c;但同時也要警惕誤操作帶來的風險。無論是部署程序、配置防火墻、管理端口還是處理進程&#xff0c;一個小小的失誤都可能導致系統故障、數據丟失等…

PHP:Web 開發領域的常青樹

在當今數字化浪潮中&#xff0c;Web 開發技術日新月異&#xff0c;各種新興語言和框架層出不窮。然而&#xff0c;PHP 作為一門經典的后端開發語言&#xff0c;依然在 Web 開發領域占據著重要地位&#xff0c;展現出強大的生命力和廣泛的應用價值。 PHP 的歷史與現狀 PHP&…

平均數與倍數

目錄 一. 平均數現期平均數基期平均數&#xff08;比較冷門&#xff09;兩期平均數-比較平均數的增長量平均數的增長率 二. 倍數基期倍數 \quad 一. 平均數 \quad 現期平均數 \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad 平均數速算技巧&#xff1a;削峰填谷…

一個完整的日志收集方案:Elasticsearch + Logstash + Kibana+Filebeat (三)

現在我們主要完成AI-RAG服務的擴展&#xff0c;利用ES的向量檢索能力完成歷史聊天記錄的存儲和向量檢索&#xff0c;讓ai聊天有記憶。 主要做法是在首次聊天完成后將對話內容寫出日志到D:\dev\dev2025\EC0601\logs\chat-his.log 寫出日志同時嵌入向量 向量可以從ollama的端點&…

Vue嵌套(多級)路由

一、前言 在構建中大型單頁應用(SPA)時,頁面結構往往比較復雜,比如儀表盤、用戶中心、商品管理等模塊通常包含多個子功能頁面。為了更好地組織這些頁面,Vue Router 提供了嵌套(多級)路由的功能。 通過嵌套路由,我們可以在父級組件中嵌入一個 <router-view> 來展…

Kubernetes 集群安全(身份認證機制、SecurityContext、Network Policy網絡策略、預防配置泄露、全面加固集群安全)

Kubernetes 集群安全(身份認證機制、SecurityContext、Network Policy網絡策略、預防配置泄露、全面加固集群安全) 一、Kubernetes 身份認證機制 身份認證(Authentication): 在 K8S 中,身份認證是安全訪問控制的第一道大門,它的目標是: 確認請求發起者的真實身份 K8…

【VUE3】基于Vue3和Element Plus的遞歸組件實現多級導航欄

文章目錄 前言一、遞歸的意義二、遞歸組件的實現——基于element-plus UI的多級導航欄2.1 element-plus Menu菜單官方示例2.2 接口定義2.3 組件遞歸2.4 父組件封裝遞歸組件 三、完整代碼——基于element-plus UI的多級導航欄3.1 組件架構3.2 types.ts3.3 menuTreeItem.vue3.4 i…

思科資料-ACL的基礎配置-詳細總結

一、ACL技術 1、定義 訪問控制列表訪問控制列表使用包過濾技術&#xff0c;在路由器上讀取第三層及第四層包頭中的信息如源地址&#xff0c;目的地址&#xff0c;源端口&#xff0c;目的端口等&#xff0c;根據預先定 義好的規則對包進行過濾&#xff0c;從而達到訪問控制的目…

GitHub 上 PAT 和 SSH 的 7 個主要區別:您應該選擇哪一個?

在代碼倉庫和像 Github 這樣的版本控制系統中,有時您需要安全高效地訪問您的倉庫。隨著對更安全實踐的需求日益增長,開發人員一直在尋找最高效、最安全的方式來與 Github 交互。為了解決這個問題,我們將探討兩種常用的方法:個人訪問令牌 (PAT) 和安全 Shell (SSH) 密鑰。本…

Vue 事件修飾符詳解

Vue 事件修飾符詳解 事件修飾符是 Vue 中處理 DOM 事件細節的強大工具。下面我將通過一個交互式示例全面解析各種事件修飾符的用法和原理。 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"…