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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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"…